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 :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");
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.
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");
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.
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:
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?
[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.
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.