有人能帮助我吗?我试图做一个代码,创建一个动态数组在C中,但出了一些问题,我找不到哪里的问题[duplicate]

aiazj4mn  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(92)

此问题在此处已有答案

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)在所有其他函数中工作。有人能帮助我吗?

rslzwgfq

rslzwgfq1#

您拥有:

typedef struct {
    char nome[40];
    char telefone[15];
    char celular[15];
    char email[40];
    struct pessoa *prox;
} pessoa;

您已经定义了一个名为pessoa的未标记结构类型;您尚未定义类型struct pessoa。这是合法的,但不是您想要的。
解决方法很简单:

typedef struct pessoa
{
    char nome[40];
    char telefone[15];
    char celular[15];
    char email[40];
    struct pessoa *prox;
} pessoa;

现在您有了struct pessoa和(在typedef完成之后)类型名称pessoa

背景

如前所述,问题代码中使用的符号是合法的,但不是您想要的。对于您想要的自引用结构,您必须使用标记。您可以用途:

typedef struct pessoa pessoa;
struct pessoa
{
    char nome[40];
    char telefone[15];
    char celular[15];
    char email[40];
    pessoa *prox;        // struct not needed, though still valid
};

能够引用struct tagname而不定义结构中的内容允许您拥有“不透明类型”,其中客户端代码只能使用指向该类型的指针,并且只有实现函数可以看到该类型的内部结构。这通常是一种隐藏信息的有益方式。
注意,该语言不要求标记名和typedef名以任何方式相关。然而,确保标记名和typedef名实际上相关是常规和明智的,这样人们更容易阅读代码。注意,标记名与typedef名在单独的命名空间中。

相关问题