Jump to content
Fórum Script Brasil
  • 0

Struct recursivo


Macelo Laian de Andrade
 Share

Question

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?

Edited by Macelo Laian de Andrade
Link to comment
Share on other sites

3 answers to this question

Recommended Posts

  • 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 to comment
Share on other 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];

Edited by Macelo Laian de Andrade
errei a tag code
Link to comment
Share on other 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 to comment
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Answer this question...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

 Share

  • Forum Statistics

    • Total Topics
      149.6k
    • Total Posts
      646.2k
×
×
  • Create New...