Listas Encadeadas
// ************************************************************ // // Exemplo de uso de Estruturas Encadeadas // // ************************************************************#include <stdio.h> #include <string.h> #include <conio.h> #include <stdlib.h>// define a estrutura do nodo typedef struct Temp { int info; struct Temp *prox; }TNODO;// cria o inicio da lista TNODO *inicio=NULL;//-------------------------------------------------------- // Funcao que define a lista como vazia. void CriaLista() { inicio = NULL; }//-------------------------------------------------------- // Funcao que insere um elemento do inicio da lista. // Retorna: // 0 - se nao ha' memoria para inserir // 1 - se conseguiu inserir int Insere(int dado) { TNODO *p;p = (TNODO *) malloc(sizeof(TNODO)); if (p==NULL) { printf("Erro de alocacao\n"); return 0; }p->info = dado; p->prox = NULL;if (inicio==NULL) inicio = p; else { p->prox = inicio; inicio = p; } return 1; }//-------------------------------------------------------- // Funcao que remove um elemento do inicio da lista. // Retorna: // 0 - se a lista ja' estava vazia // 1 - se conseguiu removerint RemoveDoInicio() { TNODO *ptr;if (inicio==NULL) return 0; else { ptr = inicio; inicio = inicio->prox; free(ptr); return 1; } }//-------------------------------------------------------- // Funcao que imprime toda a lista. // void Imprime() { TNODO *ptr;if (inicio == NULL) { printf("--- fim da lista ---\n\n"); return; }// Caso a lista nao esteja vazia ptr = inicio; while (ptr !=NULL) { printf("Info = %d\n",ptr->info); ptr = ptr->prox; } printf("--- fim da lista ---\n\n"); } //-------------------------------------------------------- // Funcao que busca um elemento na lista. // Retorna: // - NULL caso nao encontre // - ponteiro para o NODO onde esta' o dado, se conseguir encontrarTNODO *BuscaDado(int dado) { TNODO *ptr;if (inicio == NULL) { return NULL; // Lista Vazia }// Caso a lista nao esteja vazia ptr = inicio; while (ptr !=NULL) { if (ptr->info == dado) // achou !! return (ptr); // retorna um ponteiro para //o inicio da lista else ptr = ptr->prox; } return NULL; } //-------------------------------------------------------- // Funcao que remove um elemento especificado por 'dado' // Retorna: // 0 - se nao conseguiu achar // 1 - se conseguiu removerint RemoveDado(int dado) { TNODO *ptr, *antes;if (inicio==NULL) { return 0; // Lista vazia !!! } else { // Caso a lista nao esteja vazia ptr = inicio; antes = inicio; while (ptr !=NULL) { if (ptr->info == dado) // achou !! { if (ptr == inicio) // se esta removendo o primeiro da lista { inicio = inicio->prox; free(ptr); return 1; // removeu !! } else // esta removendo do meio da lista { antes->prox = ptr->prox; // Refaz o encadeamento free(ptr); // Libera a area do nodo return 1; // removeu !! } } else // continua procurando no prox. nodo { antes = ptr; ptr = ptr->prox; } } return 0; // Nao achou !!! } }//-------------------------------------------------- void main() { int i, ret; TNODO *aux;clrscr();CriaLista();// Insere na lista os numeros 2, 4, 6, 8, 10, 12, 14, 16, 18 e 20 for (i=1; i<=10;i++) Insere(i*2); Imprime(); getch();// Busca dados de -2 a 25 for (i=-2; i<=25;i++) {aux = BuscaDado(i); if (aux != NULL) printf("+++Achou o %d\n", aux->info); else printf("---Nao achou o %d\n", i); } getch();printf("Antes da remocao do primeiro nodo\n"); Imprime(); printf("Apos a remocao dos dois primeiros nodos\n"); // Remove os dois primeiros nodos RemoveDoInicio(); RemoveDoInicio(); Imprime(); getch();// Remove um elemento do meio da lista // Tenta remover -3, 0, 3, 6, 9, 12, 15, 18, 21 printf("Remocao no meio da lista\n"); for (i=-3; i<=21;i+=3) { ret = RemoveDado(i); if (ret == 1) printf("+++Removeu o %d\n",i); else printf("---Nao achou o %d\n", i); }printf("Apos a remocao\n"); Imprime(); getch();// Remove Toda a Lista ret = 1; while (ret == 1) { ret = RemoveDoInicio(); }printf("Apos a remocao de todos os nodos\n"); Imprime(); getch(); }