Listas Encadeadas em C

Oi pessoal, tô com um probleminha nesse exercício e preciso de uma ajuda, criei uma struct e o acesso aos campo foi normal compilou direitinho, só que a partir desssa struct eu tenho que criar uma lista pra inseri, excluir e etc.

1 - Primeiro eu fiz uma função pra criar uma lista vazia, deu erro;

2 - Criei uma variável no main do tipo struct para acessar os campos, acredito que seja por isso o erro na função lista vazia, que ñ enxerga essa variável, mas quando eu coloco na struct (typedef struct Restaurantes campo), também dá erro! Depois mudei tudo mas continua dando erro :frowning: :shock:

[code]#include <stdio.h>

#include <stdlib.h>

struct Restaurantes{

char nome[51];

char Tcomida[31];

float nota;

char endereco[61];

struct Restaurantes *prox;

}campo;

int main()
{

int i, qtd;

printf ("\t\tCADASTRO DE RESTAURANTES\n\n");

printf (“Entre com a quantidade de restaurantes que deseja cadastrar: “);
scanf (”%d”, &qtd);
printf ("\n");

for (i = 0; i < qtd; i++)

{

printf ("Entre com o nome do Restaurante %d: ", i+1);
fgets (campo.nome,51,stdin);

printf ("\nEntre com o Endereco: ");
fgets (campo.endereco,61,stdin);

printf ("Entre com o tipo de comida que deseja: ");
fgets (campo.Tcomida,31,stdin);

do{
      
 printf ("Entre com uma nota de avaliacao para a cozinha [0,5]: ");
 scanf ("%f",&campo.nota);

} while (campo.nota<0||campo.nota>5);

printf ("\n");

}

system (“PAUSE”);

return (0);
}

campo* lst_cria (void)

{

return NULL;

}
[/code]

acho que assim deve funcionar

struct Restaurantes{

char nome[51];

char Tcomida[31];

float nota;

char endereco[61];

struct Restaurantes *prox;

};
typedef struct Restaurantes campo;

Esse código está compilando?? Você disse que usou o typedef no struct, mas nesse código não colocou… Eu acho que isso ai não compila. Nesse caso, campo não é um tipo e sim uma variável da struct. Assim, campo* lst_cria não faz sentido.

Ah, só uma dúvida… paloma == pernambuco? :wink:

Está dessa forma e continua dando erro!

[code]#include <stdio.h>

#include <stdlib.h>

struct Lista{

char nome[51];

char Tcomida[31];

float nota;

char endereco[61];

struct Lista *proxLista;

}typedef struct Lista item;

int main()
{

int i, qtd;

printf ("\t\tCADASTRO DE RESTAURANTES\n\n");

printf (“Entre com a quantidade de restaurantes que deseja cadastrar: “);
scanf (”%d”, &qtd);
printf ("\n");

for (i = 0; i < qtd; i++)

{

printf ("Entre com o nome do Restaurante %d: ", i+1);
fgets (item.nome,51,stdin);

printf ("\nEntre com o Endereco: ");
fgets (item.endereco,61,stdin);

printf ("Entre com o tipo de comida que deseja: ");
fgets (item.Tcomida,31,stdin);

do{
      
 printf ("Entre com uma nota de avaliacao para a cozinha [0,5]: ");
 scanf ("%f",&item.nota);

} while (item.nota<0||item.nota>5);

printf ("\n");

}

system (“PAUSE”);

return (0);
}

//FUNÇÃO CRIA LISTA VAZIA
item* lst_cria (void)

{

return NULL;

}[/code]

Eu vou criar a lista a partir dos dados da struct que serão inseridos pelo usuário.

mas que tipo de erro dá Paloma ?

 struct Lista{
 
 char nome[51];
 
 char Tcomida[31];
 
 float nota;
 
 char endereco[61];
 
 struct Lista *proxLista;
 
 }typedef struct Lista item;

Isso não cria a variável. Apenas define uma estrutura chamada Lista e depois, um tipo chamado item que é como se fosse um “apelido” para essa estrutura.
Crie a variável dentro do main normalmente:

item minhaLista;
e use-a ao invés de item dentro do seu código.

Nessa linha dá esse erro:two or more data types in declaration of `item’

}typedef struct Lista item;

Outro erro: In function `int main()’:

Tente assim:

typedef struct Lista {
    char nome[51];
    char Tcomida[31];
    float nota;
    char endereco[61];
    struct Lista *proxLista;
} item;

}typedef struct Lista item;
^
±---------- falta um ponto-e-vírgula aí

Mas como eu vou utilizar essa variável:

item minhaLista;

Vc pode explicar melhor por favor. :oops:

Do mesmo jeito que estava usando “item”: minhaLista.nome, por exemplo.
Só que do jeito que está o programa, você só tem um item nessa lista. Para criar os outros, tem que usar malloc, mais ou menos assim:

minhaLista.proxLista = (item *)malloc (sizeof(item));

Depois, para acessar o segundo nome da lista:

minhaLista.proxLista->nome

Na minha modesta opinião, talvez você deva usar um array de itens de tamanho fixo mesmo, até pegar o jeito, antes de fazer a lista ligada… :wink:

Olha, o typedef serve para dar um apelido a um tipo de dados. A primeira coisa que você fez aqui foi criar a struct:

struct ItemLista {
   // ... 
}

Essa struct representa cada no da sua lista encadeada.

typedef struct ItemLista {
   // ...
} No;

Com o typedef você vai dizer que quem quiser criar uma variável do tipo dessa struct pode fazê-lo usando o “apelido” que você deu, ou seja, você faria: No primeiroNo; no lugar de struct ItemLista primeiroNo. Entendeu?

Quer dizer que vou ter que usar alocação dinâmica para todos os itens da lista no caso:

Nome
Endereço
Tipo Comida
Nota

[quote=paloma]Quer dizer que vou ter que usar alocação dinâmica para todos os itens da lista no caso:[/quote]Não, você não já definiu que eles são vetores de char de tamanho fixo? Não precisa fazer alocação dinâmica. Também não seria absolutamente necessário para outros nós:

No primeiro;
No segundo;

printf("%s", primeiro.nome);
primeiro->proximoNo = segundo;
printf("%s", primeiro->segundo.nome);

Não precisa. Quando você fizer malloc da estrutura, os tipos dentro dela (nome, endereço, etc) já são alocados também. Você só vai ter que ir fazendo malloc’s para cada item. É por isso que eu acho mais fácil usar um vetorzão mesmo. :slight_smile:
Geralmente, quando se usa listas ligadas em C, você tem um ponteiro para o primeiro elemento da lista e um outro que seria o “elemento atual”, que serve para você ir percorrendo… é meio difícil explicar aqui. :frowning:

Paloma, acho que você esqueceu de responder… Era você que, antes do problema com o GUJ, usava o usuário pernambuco? Só curiosidade mesmo… :smiley:

Meu nick mudou depois do problema aqui no guj!

Eu já criei esse ponteiro aqui!

struct Lista *proxLista;

Olha eu tô toda enrolada com isso, eu vou dar uma pesquisada, ler algum material e depois quando compreender melhor, as dúvidas eu posto aqui.

Valeu pessoal!!