Struct and chained list

3

I created a person-type structure and I want to use it in a linked list, but the following errors appear:

  

'No' has no member named 'data', 'No' has no member named 'prox' and unknow type name 'p'.

The program did not even run, can anyone help me?

The .h file is as follows:

#ifndef Pessoa
#define Pessoa

typedef struct pessoa{
    char nome[25];
    char sobrenome[25];
    int registro;
}Pessoa;

typedef struct no{
    Pessoa dados;
    struct no *prox;
}No;

typedef struct lista{
    No *cabeca;
    No *cauda;
    int tamanho;
}Lista;

No* criaNo(Pessoa p);
Lista* criaLista();
void inserir(Lista *l, Pessoa p, int posicao);
void remover(Lista* l, int registro); //pesquisa registro e remove a pessoa
void imprimeLista(Lista* l);
void destruirLista(Lista* l);

#endif

The .c file is as follows:

#include <stdio.h>
#include <stdlib.h>
#include "Pessoa.h"

No* criaNo(Pessoa p)
{
    No* n;
    n=(No*)malloc(sizeof(No));
    n->dados = p;
    n->prox = NULL;
    return n;
}

Lista* criaLista()
{
    Lista* l = (Lista*)malloc(sizeof(Lista));
    l->cabeca = NULL;
    l->cauda = NULL;
    l->tamanho = 0;
    return l;
}
void inserir(Lista *l, Pessoa p, int posicao);

{
     //já está pronta, porém não achei necessário colocá-la
}

void remover(Lista* l, int registro)
{
     //já está pronta, porém não achei necessário colocá-la
}

void imprimeLista(Lista* l)
{
    //já está pronta, porém não achei necessário colocá-la
}

void destruirLista(Lista *l)
{
    //já está pronta, porém não achei necessário colocá-la
}
    
asked by anonymous 25.06.2014 / 20:58

3 answers

2

See, what's happening is that you're setting the word Pessoa as an empty string of characters to be replaced by pre-processor . Because of #define Pessoa , what is actually being compiled is:

typedef struct pessoa{
    char nome[25];
    char sobrenome[25];
    int registro;
};
typedef struct no{
    dados;
    struct no *prox;
}No;
typedef struct lista{
    No *cabeca;
    No *cauda;
    int tamanho;
}Lista;
No* criaNo( p);
Lista* criaLista();
void inserir(Lista *l, p, int posicao);
void remover(Lista* l, int registro); //pesquisa registro e remove a pessoa
void imprimeLista(Lista* l);
void destruirLista(Lista* l);

Notice that every occurrence of the word Pessoa disappeared, because of its #define Pessoa (I generated this code through the gcc -E -C -P pessoa.h command). If you had used #define Pessoa Animal , every instance of Pessoa would be replaced by Animal .

I believe that what you're trying to do with #define Pessoa is to use " include guards ". . Follow the link for more useful information on how to do it. In general, be careful that the words you use do not collide with preprocessor macros.

No problem with struct and typedef having the same name. In its place I would have simply done:

typedef struct Pessoa {
  /*...*/
} Pessoa;

In addition, I would change the #ifndef/#define Pessoa to #ifndef/#define PESSOA_H

    
01.07.2014 / 04:51
0

My solution to your problem was as follows (Person.h):

#ifndef Pessoa
#define Pessoa

struct pessoa{
    char nome[25];
    char sobrenome[25];
    int registro;
};

typedef struct no{
    struct Pessoa dados;
    struct no *prox;
}No;

typedef struct lista{
    No *cabeca;
    No *cauda;
    int tamanho;
}Lista;

No* criaNo(struct Pessoa p);
Lista* criaLista();
void inserir(Lista *l, struct Pessoa p, int posicao);
void remover(Lista* l, int registro); //pesquisa registro e remove a pessoa
void imprimeLista(Lista* l);
void destruirLista(Lista* l);

#endif

As you can see I removed typedef from the struct person.

    
26.06.2014 / 13:55
0

The problem was the conflict with your #Define Person ...

You can change the policy and put

#ifndef __PESSOA_H__
#define __PESSOA_H__
   // ... aqui seu código usando typedef
#endif
    
27.06.2014 / 02:47