Listas Encadeadas em C

31 respostas
paloma

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:

#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;

}

31 Respostas

C

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;
David

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:

paloma

Está dessa forma e continua dando erro!

#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;

}
paloma

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

ramilani12

mas que tipo de erro dá Paloma ?

C
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.

paloma

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

}typedef struct Lista item;

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

David

Tente assim:

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

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

paloma

Mas como eu vou utilizar essa variável:

item minhaLista;

Vc pode explicar melhor por favor. :oops:

C

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:

David

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?

paloma

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

David

paloma:
Quer dizer que vou ter que usar alocação dinâmica para todos os itens da lista no caso:
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);
C

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:

David

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:

paloma

Meu nick mudou depois do problema aqui no guj!

paloma

Eu já criei esse ponteiro aqui!

struct Lista *proxLista;
paloma

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!!

paloma

Carambra continua dando erro, agora o problema é no main

#include <stdio.h>

#include <stdlib.h>

struct Lista{

char nome[51];

char Tcomida[31];

float nota;

char endereco[61];

Lista *prox;

}typedef item;


int main(void)  // Erro: In function `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 ("Entre 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;

}
C

Você declarou errado sua estrutura. Veja as mensagens anteriores para saber como é a sintaxe.
Além disso, mesmo que estivesse certa, você esqueceu de declarar a variável da estrutura. As mensagens anteriores falam como fazer isso também.
Boa sorte :wink:

paloma

Ñ estou identificando onde está o erro, eu declarei item que é a variável da struct :roll: :oops:

struct Lista{

char nome[51];

char Tcomida[31];

float nota;

char endereco[61];

Lista *prox;

}typedef item;
David

O typedef é no começo:

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

Mas isso é no caso de estar trabalhando com listas, pq já fiz algums exercícios de strcut e ñ colocava no começo!! :roll:

David

Uma outra opção, que é a que você pode estar tentando usar é essa:

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

typedef struct Lista item;
paloma

Eu já tentei assim também, mas dá o seguinte erro:

struct Lista{

char nome[51];

char Tcomida[31];

float nota;

char endereco[61];

Lista *prox;

}typedef struct Lista item; erro:two or more data types in declaration of `item'
paloma

O erro era por conta da vírgula que é antes do typedef.

paloma

Agora tá dando erro no main

int main()

O erros são esses:

1 - expected init-declarator before “int”

2 -expected ,' or;’ before “int”

paloma

Acho que é alguma coisa com esse fgets também, pq tá dando erro em todas as linhas onde ele está!

C

o problema deve ser essa variavel sua
stdin
nao está declarada

C
 achou o erro? <img src="https://cdn.jsdelivr.net/gh/twitter/twemoji@14/assets/72x72/w.pngink.png?v=9" title=":wink:" class="emoji" alt=":wink:">

Você não declarou a variável item.  que você vai ter que mudar de nome,  que, com seu typedef, item agora é um tipo (como int, double e struct Lista)

Simplesmente declare, dentro da main a variável:

item umItem;

e use-a onde aparece o item, por exemplo:

fgets (item.nome,51,stdin);

vira

fgets (umItem.nome,51,stdin);
Criado 31 de março de 2006
Ultima resposta 3 de abr. de 2006
Respostas 31
Participantes 5