Ir para conteúdo
Fórum Script Brasil
  • 0

Struct recursivo


Macelo Laian de Andrade

Pergunta

Bom dia a todos!

Estou aqui lendo um material e me deparei com um trecho de código que gostaria de saber se é um erro ou é assim mesmo.

===================

1 typedef struct {

2   char infor[30];

3   struct t_no *prox;

4 } t_no;

5 t_no L;

===================

na linha 3, menciona t_no sem antes mesmo de ele existir, isso é recursividade?

Editado por Macelo Laian de Andrade
Link para o comentário
Compartilhar em outros sites

3 respostass a esta questão

Posts Recomendados

  • 0

Em C qualquer estrutura pode conter um ponteiro ao seu mesmo tipo, pois um ponteiro é apenas uma variável que aponta a um lugar da memória, em todo o caso, mais tarde você teria que se encarregar de fazer que essa variável aponte a tal objeto(atribuiçao), uma coisa que você não pode fazer é algo como struct t_no prox;, pois nesse caso realmente não há nenhuma estrutura declarada, isso seria um disparate. XD

Link para o comentário
Compartilhar em outros sites

  • 0

Vangodp, muito grato pela resposta.

Gostaria de continuar nesse mesmo tópico, para sanar outra dúvida. Estou lendo LED em C, de tanto olhar aprendi os conceitos, e vejo o codigo funcionando perfeitamente. Porém, não consigo entender onde estão sendo salvos os dados de uma LED. Observem o código abaixo:

 


 

1 #include <stdio.h>
2
3 typedef struct {
4 char nome[50];
5 int idade;
6 float altura;
7 } t_info;
8
9 typedef struct {
10 t_info info;
11 struct t_no *prox;
12 } t_no;
13
14 t_no *L;
15 t_info novoDado;
16
17 void inicializa() {
18 L == NULL;
19 }
20
21 void inserir(t_info info) {
22 t_no *p = malloc(sizeof (t_no));
23 p->info = info;
24 p->prox = L;
25 L = p;
26 }
27
28 void mostrar() {
29 t_no *aux = L;
30
31 if (aux == NULL) {
32 printf(“\n Lista vazia! \n”);
33 return;
34 }
35
36 while (aux != NULL) {
37 printf(“\n%s\n”, aux->info.nome);
38 printf(“%d\n”, aux->info.idade);
39 printf(“%3.2f\n”, aux->info.altura);
40 aux = aux->prox;
41 }
42 }
43
44 void lerDados() {
45 printf(“\n\n=== Lendo os dados ===\n”);
46 printf(“Nome..: “);
47 fflush(stdin);
48 gets(novoDado.nome);
49 printf(“Idade.: “);
50 scanf(“%d”, &novoDado.idade);
51 printf(“Altura: “);
52 scanf(“%f”, &novoDado.altura);
53 }
54
55 int menu() {
56 int opcao;
57
58 printf(“\n\n Opcoes possiveis \n”);
59 printf(“0 - Sair\n”);
60 printf(“1 - Inserir\n”);
61 printf(“2 - Mostrar\n”);
62 printf(“\nO que deseja fazer? “);
63 scanf(“%d”, &opcao);
64 return opcao;
65 }
66
67 int main() {

68
69 int opcao;
70 inicializa();
71
72 do {
73 opcao = menu();
74 switch (opcao) {
75 case 0:
76 break;
77 case 1: // inserir
78 lerDados();
79 inserir(novoDado);
80 break;
81 case 2: // exibir lista
82 mostrar();
83 break;
84 default:
85 printf(“_____________Opcao invalida_____________\n\n”);
86 }
87 } while (opcao != 0);
88
89 return 0;
90 }

O que está acontecendo na linha 40, onde mostra aux = aux->prox;

Testando tag code...



int idade;

char nome[50];

Editado por Macelo Laian de Andrade
errei a tag code
Link para o comentário
Compartilhar em outros sites

  • 0

Trata-se de uma lista encadeada simples, é uma lista dinâmica, para você fazer uma idéia melhor isso é uma espécie de vetor que cresce "infinitamente" conforme a necessidade do programador, cada vez que invocamos a função inserir() a lista cresce.
As listas não se parecem em absoluto com os vetores, pois os vetores sabemos que estão na memória de forma consecutiva, um dado atrás do outro, já as listas dinâmicas isso não acontece, um dado pode estar distante de outro, simplesmente invocamos a funçao inserir() e o sistema operativo se encarrega de buscar o primeiro "buraco" na memória disponível para armazenar nossos dados, para não se perder um do outro cada dado aponta ao seguinte da lista dai o que a linha faz com aux = aux->prox; é preparar o próximo dado a ser operado pelo laço, a menos que topamos com que não exista próximos dados, quando isso acontecer aux->prox vai valer null, e aux vai receber esse null por atribuição, que é justo o que se confere no laço while ( aux != NULL ), em outras palavras esse laço pega o aux confere que não seja nulo, isso significaria que chegou no fim da lista, é feito as operações pertinentes com os dados e a linha aux = aux->prox; faz aux apontar ao seguinte dado, depois disso toda a operação se repete como falei até aux valer null.

Espero ter servido para tirar sua duvida. você pode ler mais sobre listas aqui: http://br.ccm.net/faq/10263-listas-simplesmente-encadeadas

Link para o comentário
Compartilhar em outros sites

Participe da discussão

Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.

Visitante
Responder esta pergunta...

×   Você colou conteúdo com formatação.   Remover formatação

  Apenas 75 emoticons são permitidos.

×   Seu link foi incorporado automaticamente.   Exibir como um link em vez disso

×   Seu conteúdo anterior foi restaurado.   Limpar Editor

×   Você não pode colar imagens diretamente. Carregar ou inserir imagens do URL.



  • Estatísticas dos Fóruns

    • Tópicos
      152,3k
    • Posts
      652,5k
×
×
  • Criar Novo...