Lista Ligada C[Resolvido]

3 respostas
B

Ola pessoal venho pedir ajuda ao pessoal que conhece um pouquinho de C no caso estou com dificuldade para implementar uma lista ligada to achando que é problema de logica ou na funçao inserirFim ou na de imprimirLista o fato é esta tudo funcionando mais quando eu adiciono um valor ao final da lista ele sobrepoe em vez de deslocar para esquerda a lista como C é mais dificil que java as veses me perco com os ponteiros se puderem ajudar eu agradeço

//by Diabo Loiro
#include<conio.h>
#include<stdio.h>
#include<stdlib.h>

//Criando a estrutura 
struct list
{
    int iValor;
    struct list *proximo;   
};//não esquecer o ";"

typedef struct list Lista;//Diz que agora em vez de escrever "struct list" podemos escrever so Lista

void removerNoInicio(Lista **paramLista){
    if(*paramLista == NULL)//verirfica se a lista esta vazia
        printf("\nA lista ja esta vazia");
    else{//senão tiver ele cria uma lista auxiliar novamente 
        Lista *auxiliar;
        auxiliar = *paramLista;//coloca a lista atual dentro da auxiliar
        *paramLista = (*paramLista)->proximo;//pega a lista e converte para *paramLista
        free(paramLista);// a função free libera a memoria
    }
} 

//Funçao que insere no final da lista.
void inserirFim(Lista **paramLista, int v){
     Lista *nList;//criando ponteiro nova lista.
     nList=(Lista*)malloc(sizeof(Lista));//alocando o espaço em memória e usando cast.
     nList->iValor = v; //atribuindo valor para n nova lista. 
     nList->proximo = NULL;// apontando para fim da lista

     if(*paramLista == NULL){//verifica se é o final da fila
        *paramLista = nList;//se for insere a nova lista no final
     }else{          
       Lista *listaAux; //senao cria uma lista auxiliar
        listaAux = *paramLista; //coloca a lista atual na lista auxiliar
        while(listaAux->proximo != NULL){ //e vai percorrendo a lista ate encontrar o final ou seja NULL
            listaAux = listaAux->proximo; //enquato nao acha o final ela fica colocando "as estruturas listas" na lista temporaria
        }//obviamente uma ora ela vai chegar no final da lista ou seja nesta linha
        listaAux->proximo = nList;//como ele ja esta no final da fila ele so adiciona a nova lista
    }       
}          

//Esta funçao imprime toda a lista 
void imprimirLista(Lista * paramList)
{
   
  while(paramList != NULL)//enquanto nao é o final da lista leia e imprima o conteudo
  { 
     system("cls");//limpa a tela             
     printf("\nImprimindo a Lista\n");             
     printf("%d", paramList->iValor);//imprimindo o valor  
     paramList = paramList->proximo; //apontando a lista a proxxima lista   
     printf("\n");         
  }                   
}    
 int cont=0;
//inicio do programa 
main()
{
      int op=0;//controla a opçao escolida pelo usuario
      int tmp=0;//variavel temporaria para o valor que usuario digitar
      Lista *minhaLista;// cria um ponteiro do tipo lista
      minhaLista = NULL;//Seta ele com o valor NULL
      while(op!=5){
      system("cls");
      printf("\nO que gostaria de fazer\n");      
      printf("\n1 - Inserir no fim da fila\n2-Remover o primeiro da fila\n3 - Visualizar Lista\n4- Sair\n");
      scanf("%d",&op); 
      // inserir
      if(op==1){
      system("cls");
      printf("\nQual valor deseja inserir\n");          
      scanf("%d",&tmp);         
      inserirFim(&minhaLista,tmp); 
      imprimirLista(minhaLista);
      getch();             
      }
      //remover
      else if(op==2){
      removerNoInicio(&minhaLista);
      printf("\nPrimeiro item removido\n");                  
      imprimirLista(minhaLista);
      getch();
      //imprime a lista  
      }else if(op==3){
      imprimirLista(minhaLista);
      getch();     
      }  
      //sai do programa   
      else if(op==4){
      op=5;          
      }    
      }
}

Quem quiser testa esta anexado o arquivo .c esta rodando normal so que ele sobrepoe
Obrigado.

3 Respostas

L

Falae meu brother!

Seguinte, testei aqui, teu código de inserir ta rodando legal…
Aí é um poco de manha e olhar no código as funções que tão ligadas com inserção, nesse caso era a de imprimir a lista…

void imprimirLista(Lista * paramList)
{
     printf("\nImprimindo a Lista\n");   
  while(paramList != NULL)//enquanto nao é o final da lista leia e imprima o conteudo
  { 
     //system("cls");//limpa a tela             
    // printf("\nImprimindo a Lista\n");             
     printf("%d", paramList->iValor);//imprimindo o valor  
     paramList = paramList->proximo; //apontando a lista a proxxima lista   
     printf("\n");         
  }                   
}

O “CLS” tava dentro do while e tava limpando oq tava sendo impresso, ou seja ele imprimia apenas o ultimo elemento da lista oq dava a impressao de sobrescrição. Mas a lista estava carregada.
Fazendo essa mudança ai em cima funfou legal ,velho!

Qq duvida posta ai!

D

Muito obrigado velho rs sabe quando ja da ate dor de cabeça e tu nao ve mais nada.
nen vi o cls vlw msn.

L

Hahaha, sei sim!
pow, dah uma editada no tópico e coloca como resolvido!!!

[]s!

Criado 29 de setembro de 2009
Ultima resposta 29 de set. de 2009
Respostas 3
Participantes 3