Sie sind auf Seite 1von 14

Estructura de Datos

Implementacin TDA LISTA Lista Enlazada Circular con Nodo Cabecera

TDA LISTA implementacin Lista Enlazada Circular


Esta lista enlazada esta formada por un conjunto de nodos con un campo de enlace (LINK) y al menos un campo de datos (ITEM) Todos los nodos tienen un sucesor, incluso el ltimo nodo cuyo sucesor es el cabecera.

TDA LISTA implementacin Lista Enlazada Circular


typedef unsigned int Uint; typedef int T; typedef struct NODO { T Item; struct NODO *Link; }TIPONODO;

typedef struct LISTA { TIPONODO *Header,*NewNodo; }TIPOLISTA;

TDA LISTA implementacin Lista Enlazada Circular

Item

Link

NODO

LISTA
Header

Item

Link

Item

Link

Item

Link

NODO CABECERA

TDA LISTA implementacin Lista Enlazada Circular


void MakeEmpty(TIPOLISTA *L) { L->Header=(TIPONODO *)malloc(sizeof(TIPONODO)); if (L->Header==NULL) exit(0); else L->Header->Link=L->Header; }

LISTA

Header

0xFF2844

Item

Link = 0xFF2844 0xFF2844

TDA LISTA implementacin Lista Enlazada Circular


Uint IsEmpty(TIPOLISTA L) { return L.Header->Link==L.Header; } LISTA

Header

0xFF2844

LISTA VACA Item Link = 0xFF2844

0xFF2844

TDA LISTA implementacin Lista Enlazada Circular


Uint IsFull(TIPOLISTA *L) { L->NewNodo=(TIPONODO *)malloc(sizeof(TIPONODO)); return (L->NewNodo==NULL); }

NewNodo

0xFF2622

Item NODO

Link

0xFF2622

TDA LISTA implementacin Lista Enlazada Circular


void Insert_(TIPOLISTA *L,T It) { TIPONODO *Ptr; L->NewNodo->Item=It; L->NewNodo->Link=L->Header; for (Ptr=L->Header;Ptr->Link!=L->Header;Ptr=Ptr->Link); Ptr->Link=L->NewNodo; }

void Insert(TIPOLISTA *L,T It) { if (!IsFull(L)) Insert_(L,It); else printf("LISTA COMPLETA \n"); }

TDA LISTA implementacin Lista Enlazada Circular


void Show_(TIPOLISTA L) { TIPONODO *Ptr; for(Ptr=L.Header->Link;Ptr!=L.Header;Ptr=Ptr->Link) printf("%d ",Ptr->Item); printf("\n"); } void Show(TIPOLISTA L) { if (!IsEmpty(L)) Show_(L); else printf("LISTA VACIA \n"); }

TDA LISTA implementacin Lista Enlazada Circular


Uint Search_(TIPOLISTA L,T It) { TIPONODO *Ptr; for(Ptr=L.Header->Link; Ptr!=L.Header; Ptr=Ptr->Link) if (Ptr->Item==It) return 1; return 0; } void Search(TIPOLISTA L,T It) { if (!IsEmpty(L)) if (Search_(L,It)!=NULL) printf("Elemento se encuentra en LISTA \n"); else printf("Elemento NO se encuentra en LISTA \n"); else printf("LISTA VACIA \n"); }

TDA LISTA implementacin Lista Enlazada Circular


void Delete_(TIPOLISTA *L,T It) { TIPONODO *Ant,*Act; Ant=SearchPos(*L,It); if (Ant!=L->Header) //NO DEBERIA OCURRIR!!!!! { Act=Ant->Link; Ant->Link=Act->Link; free(Act); } } void Delete(TIPOLISTA *L,T It) { if (!IsEmpty(*L)) { int Esta=Search_(*L,It); if (Esta) Delete_(L,It); else printf("Elemento no se encuentra en LISTA, no se elimino \n"); } else printf("LISTA VACIA \n"); }

TDA LISTA implementacin Lista Enlazada Circular


TIPONODO *SearchPos(TIPOLISTA L,T It) { TIPONODO *Ant,*Act; Ant=L.Header; Act=(L.Header)->Link; while (Act!=L.Header) { if (Act->Item==It) return Ant; else { Ant=Act; Act=Act->Link; } } return Act; }

TDA LISTA implementacin Lista Enlazada Circular


#include <stdio.h> #include <stdlib.h> #include <LISTACIRCC.H>

int main() { TIPOLISTA L; MakeEmpty(&L); Insert(&L,12); Insert(&L,42); Insert(&L,56); Search(L,110); Search(L,12); Show(L); Delete(&L,11); Delete(&L,42); system("PAUSE"); return 0; }

Das könnte Ihnen auch gefallen