此问题在此处已有答案:
typedef struct vs struct definitions [duplicate](12个答案)
Why should we typedef a struct so often in C?(15个答案)
昨天关闭。
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
typedef struct{
char nome[40];
char telefone[15];
char celular[15];
char email[40];
struct pessoa *prox;
} pessoa;
pessoa * criarLista(){
return NULL;
}
pessoa * inserir(pessoa *lista,char nome[40],char telefone[15],char celular[15],char email[40]){
pessoa *novo = (pessoa *) malloc(sizeof(pessoa));
strcpy(novo -> nome, nome);
strcpy(novo -> telefone, telefone);
strcpy(novo -> celular, celular);
strcpy(novo -> email, email);
novo -> prox = lista;
return novo;
}
pessoa * busca(pessoa*lista,char nome[40]){
pessoa *p = lista;
while(p!=NULL){
if (strcmp(nome,p->nome) == 0){
return p;
}
else{
p = p->prox;
}
}
return NULL;
}
void exibir(pessoa * lista){
pessoa *p = lista;
while(p!=NULL){
printf("\n%s",p->nome);
printf("%s",p->email);
printf("%s",p->telefone);
printf("%s",p->celular);
p = p->prox;
}
}
pessoa* remover(pessoa **lista, char nome[40]){
pessoa *aux, *remover = NULL;
if(*lista){
if(strcmp((*lista)->nome,nome) == 0){
remover = *lista;
*lista = remover->prox;
}
else{
aux = *lista;
while(aux->prox && strcmp(aux->prox->nome,nome)!= 0){
aux = aux->prox;
if(aux->prox){
remover = aux->prox;
aux->prox = remover->prox;
}
}
}
}
return remover;
}
int main(void){
char nome[40];
char telefone[15];
char celular[15];
char email[40];
pessoa *lista = (pessoa *) malloc(sizeof(pessoa));
pessoa *b = (pessoa *) malloc(sizeof(pessoa));
lista = criarLista();
b=criarLista();
int op;
while (op!=5){
printf("\n1- inserir contato \n2- listar contatos \n3- buscar contatos \n4- deletar contato\n5- sair\n");
scanf("%d", &op);
setbuf(stdin, NULL);
switch (op) {
case 1:
printf("Digite o nome: ");
fgets(nome,sizeof(nome),stdin);
printf("Digite o email: ");
fgets(email,sizeof(email),stdin);
printf("Digite o telefone: ");
fgets(telefone,sizeof(telefone),stdin);
printf("Digite o celular: ");
fgets(celular,sizeof(celular),stdin);
lista=inserir(lista,nome,telefone,celular,email);
break;
case 2:
exibir(lista);
break;
case 3:
printf("Digite o nome que deseja buscar: ");
fgets(nome,sizeof(nome),stdin);
b = busca(lista,nome);
if (b != NULL){
printf("%s",b->nome);
printf("%s",b->email);
printf("%s",b->telefone);
printf("%s\n",b->celular);
}
else{
printf("Contato não encontrado!");
}
break;
case 4:
printf("Digite o nome do contato que deseja excluir: ");
fgets(nome,sizeof(nome),stdin);
lista = remover(&lista,nome);
}
}
return 0;
}
我尝试放置一个数组来创建一个新的节点,列出所有节点,搜索并删除。但是当我尝试创建删除函数时,出现了一些错误,我无法继续。错误出现在函数删除器中,一个“类型'struct pessoa'的定义不完整”错误,奇怪的是什么原因导致我的typedef struct(prox)在所有其他函数中工作。有人能帮助我吗?
1条答案
按热度按时间rslzwgfq1#
您拥有:
您已经定义了一个名为
pessoa
的未标记结构类型;您尚未定义类型struct pessoa
。这是合法的,但不是您想要的。解决方法很简单:
现在您有了
struct pessoa
和(在typedef
完成之后)类型名称pessoa
。背景
如前所述,问题代码中使用的符号是合法的,但不是您想要的。对于您想要的自引用结构,您必须使用标记。您可以用途:
能够引用
struct tagname
而不定义结构中的内容允许您拥有“不透明类型”,其中客户端代码只能使用指向该类型的指针,并且只有实现函数可以看到该类型的内部结构。这通常是一种隐藏信息的有益方式。注意,该语言不要求标记名和typedef名以任何方式相关。然而,确保标记名和typedef名实际上相关是常规和明智的,这样人们更容易阅读代码。注意,标记名与typedef名在单独的命名空间中。