Macelo Laian de Andrade Postado Janeiro 21, 2016 Denunciar Share Postado Janeiro 21, 2016 (editado) 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 Janeiro 21, 2016 por Macelo Laian de Andrade Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 vangodp Postado Janeiro 21, 2016 Denunciar Share Postado Janeiro 21, 2016 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 Macelo Laian de Andrade Postado Janeiro 22, 2016 Autor Denunciar Share Postado Janeiro 22, 2016 (editado) 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 Janeiro 22, 2016 por Macelo Laian de Andrade errei a tag code Citar Link para o comentário Compartilhar em outros sites More sharing options...
0 vangodp Postado Janeiro 22, 2016 Denunciar Share Postado Janeiro 22, 2016 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 Citar Link para o comentário Compartilhar em outros sites More sharing options...
Pergunta
Macelo Laian de Andrade
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 AndradeLink para o comentário
Compartilhar em outros sites
3 respostass a esta questão
Posts Recomendados
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.