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.589 ]

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

Inicio_vetor

entendendo o return...

Fatorial

Decimal ( 8 bits ) para binário

Verificador de senhas: Comparando palavras


  

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