Lista ligada simples, algoritmos de inserção, busca e impressão

Publicado por Ewerton Daniel de Lima (última atualização em 19/03/2010)

[ Hits: 14.585 ]

Download lista_ligada.c




Olá pessoal,

Escrevi uma lista ligada  (com alocação dinâmica) em C e comentei o código. Procurei explicar o máximo possível. Depois eu posto a rotina de remoção.

Espero que seja útil para o pessoal!

Grande abraço! :D

  



Esconder código-fonte

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

/*Declaração do tipo nó para a lista, composto de
ponteiro para o próximo nó e de um campo para dado
que no caso é o campo char dado[30];
*/
typedef struct no {
       
       char dado[30];
       struct no *proximo;
       
       } no;
       
no *primeiro = NULL; //Ponteiro para o primeiro elemento da lista
no *ultimo = NULL; //Ponteiro para o último elemento da lista
no *alocar; //Ponteiro para fazer alocação

/*Rotina de busca
Insere o dado em string e ela retorna o ponteiro em hexa
para a região da memória para o qual o ponteiro está
apontando.
*/
no * buscar(char *dado) {
       
      no *ponteiro;
      
      ponteiro = primeiro;
       
      while ((ponteiro)&&(strcmp(dado, ponteiro->dado)!=0)) { 
            
            ponteiro = ponteiro->proximo;
                
      }
      
      return ponteiro; //Retorna o ponteiro para a região da memória
                       //que está apontando (caso encontre)
                       //Retorna o ponteiro NULL (caso em que não encontra)
}

/*Rotina que faz a inserção ao final da lista ligada
O Parâmetro dado recebe um ponteiro para string 
A função não retorna valor algum
*/
void inserirAoFinal(char *dado) {
     
    alocar = (struct no *) malloc(sizeof(struct no)); //Faz alocação na memória
        
    if (!alocar) { //Se não for possível a alocação, sai do programa
       printf("Falta de memória"); 
       exit(0);
    }
    
    strcpy(alocar->dado, dado); //Copia o dado para o novo nó alocado
     
     if (!primeiro) { //Se não houver elemento ainda na lista, insere
                      //insere na primeira posição apontando o ponteiro
                      //"primeiro" e último
         primeiro = alocar;
         ultimo = alocar;
         
     }
     
     else //se não...
     
     {
         ultimo->proximo = alocar; //Aponta o "próximo" do último elemento
                                   //para o novo nó alocado
         ultimo = alocar;          //Aponta o marcador de "ultimo" para o
                                   //novo nó alocado
         
     }
     ultimo->proximo = NULL; //Aponta o "próximo" do último nó para o ponteiro
                             //nulo, para verificação de fim de lista
}

/*Imprime todos os elementos da lista na tela
na ordem em que foram inseridos
*/
void imprimir() {
     no *ponteiro = primeiro;
     while (ponteiro) {
           printf("\n%s", ponteiro->dado);
           ponteiro = ponteiro->proximo;
          }
     }

/*Rotina principal
com algumas inserções, uma impressão e uma busca no final
*/       
int main() {
   char dado[30];
    printf("\nInserir: ");
    gets(dado);
    inserirAoFinal(dado);
    printf("\nInserir: ");
    gets(dado);
    inserirAoFinal(dado);
    printf("\nInserir: ");
    gets(dado);
    inserirAoFinal(dado);
    printf("\nInserir: ");
    gets(dado);
    inserirAoFinal(dado);
    imprimir();
    printf("\nInserir para buscar: ");
    gets(dado);
    printf("%p", buscar(dado));
  
    getchar();
}

Scripts recomendados

pegavalor.c - Interação com usuário

Barra de carregamento (Loading Bar)

Criar diretorios

Funções de comparação de String

Cálculo da circunferência de um círculo


  

Comentários

Nenhum comentário foi encontrado.


Contribuir com comentário




Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts