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

Dúvida com Lista encadeada


Valder

Pergunta

Olá, pessoal, meu nome é Valder, estou estudando Estrutura de Dados usando a linguagem C. Estou tendo dificuldades seríssimas com essa disciplina, sinseramente, não consigo entender muita coisa, já comprei 3 livros e nenhum deles consegue me fazer entender.

Quando penso que estou entendendo, começa a dar um monte de erros nos códigos, já estou até desencanando.

Será que alguém pode me ajudar com esse pequeno problema de lista encadeada ?

É o seguinte, criei uma lista simplesmente encadeada com os dados número, nome, endereço e cidade. As coisas até que estão funcionando bem, alocação de memória, inserção na lista, liberação de espaço em memória, etc.

O problema é que na hora de imprimir os dados ocorrem algumas coisas que não entendo. Estou usando o gets para capturar os dados do tipo char e o scanf para o dado inteiro. na hora da impressão o programa simplesmente não imprime o nome do dado, ou o nome da cidade, ou algum dado do tipo char, dependendo da mudança que faço no código. já fiz inúmeras, em todas o programa não imprime algum tipo de dado.

Outra coisa que não entendo é por que na explicação da teoria o autor usa ponteiro e no exemplo prático recebe um ponteiro de ponteiro na função void cria_lista e void insere_esquerda, por exemplo.

Tenho outras dúvidas, mas prefiro ir pedindo ajuda aos poucos.

Alguém pode me ajudar, por favor ?

O código está abaixo:

#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h> 
#include <malloc.h>

struct lista
{
    int nro;
    char nome[40];
    char endereco[30];
    char cidade[20];
    struct lista *prox;
};

void cria_lista(struct lista **inicio, struct lista **fim)
{
    *inicio = NULL;
    *fim = NULL;
}

void insere_esquerda(struct lista **inicio, struct lista **fim, int numero,
                     char *nome, char *endereco, char *cidade, int *status)
{
    struct lista *p; //variável p representa um ponteiro
    p = (struct lista*)malloc(sizeof(struct lista));
    if(p == NULL)
       *status = 0;
    else
    {
        p->nro = numero;
        strcpy(p->nome, nome);
        strcpy(p->endereco, endereco);
        strcpy(p->cidade, cidade);
        p->prox = *inicio;
        if(*inicio = NULL)
           *fim = p;
        *inicio = p;
        *status = 1;
    }
}

void mostra_lista(struct lista *inicio)
{
     struct lista *aux;
     aux = inicio;
     printf("Lista  :");
     while(aux!=NULL)
     {
        printf("\nNumero.....: %d\t", aux->nro);
        printf("\nNome.......: %s\t", aux->nome);
        printf("\nEndereco...: %s\t", aux->endereco);
        printf("\nCidade.....: %s\t", aux->cidade);
        aux = aux->prox;
        printf("\n");
     }
}

void libera_lista(struct lista **inicio, struct lista **fim)
{
    struct lista *aux;
    aux = *inicio;
    while(aux != NULL)
    {
       *inicio = (*inicio)->prox;
       free(aux);
       aux = *inicio;
    }
    *fim = NULL;
}

int main ()
{
    struct lista *ptri, *ptrf;
    int x;
    int num, ok;
    char nome[20], endereco[15], cidade[15];
    
    // Chama a rotina cria_lista
    
    cria_lista(&ptri, &ptrf);
    
    // Lê dados digitados e os insere na lista
    
    for (x = 1; x <= 2; x++)
    {
         printf("Digite o numero do dado: ");
         scanf("%d", &num); fflush(stdin);
         printf("Digite o nome do dado: ");
         gets(nome); fflush(stdin);
         printf("Digite o endereco do dado: ");
         gets(endereco); fflush(stdin);
         printf("Digite a cidade do dado: ");
         gets(cidade); fflush(stdin);
         
         printf("\n");
         
         insere_esquerda(&ptri, &ptrf, num, nome, endereco, cidade, &ok);
         if(ok == 0) printf("Problema na alocacao de memoria");
    }
    
    // Procedimnt para mostrar a lista
    
    mostra_lista(ptri);
    scanf("%i", &num);
    libera_lista(&ptri, &ptrf);
    return 0;
    getch();
}

Link para o comentário
Compartilhar em outros sites

0 respostass a esta questão

Posts Recomendados

Até agora não há respostas para essa pergunta

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,3k
×
×
  • Criar Novo...