Вы находитесь на странице: 1из 5

Listas simplemente encadenadas

La diferencia entre una lista y una cola o pila es que los elementos de la lista pueden insertarse en cualquier lugar , logrando de esta forma que la lista quede ordenada. Solamente trabajaremos con listas simplemente encadenadas que son aquellas que tienen una referencia al elemento siguiente. Cada elemento de la lista ser una estructura autoreferenciada , la cul esta formada por los datos y un puntero a la estructura del mismo tipo. La estructura que utilizaremos es la siguiente: typedef struct lista { }Nodo; int dato; struct lista *prox;

como se puede ver la estructura contiene datos (este ejemplo solo trata un entero) y un puntero a struct lista. Cada elemento de la lista lo representaremos por medio del diagrama de la Figura 1

Donde aux es el puntero al comienzo de la estructura , el 8 representa el dato cargado y la flecha que sale es el punero que va a apuntar al prximo elemento de la lista. La lista comleta quedara representada por la Figura 2

La nica forma de poder recorrer una lista simplemente encadenada es accediendo por el primer elemento (que nunca debe perderse) . El final de la lista se encuentra por que el puntero al prximo elemento apunta a NULL. Bsicamente existen 3 casos distintos para insertar un elemento en una lista. Para el anlisis trataremos cada uno por separado para luego generar una funcin que permita insertar un elemento en la lista. Los 3 casos bsicos son: 1- Insertar un elemento al comienzo de la lista 2- Insertar un elemento al final de la lista 3- Insertar un elemento en algun lugar intermedio. Antes de empezar a analizar cada caso en particular conviene ponernos de acuerdo en cuanto al significado y nomenclatura de los punteros a usar. Siempre , en algn lugar del programa , normalmente en main se debe llevar actualizado el puntero al comienzo de la lista. Vamos a utilizar 4 punteros a saber Inicio Contiene la direccin de comienzo de la lista. Cuando la lista esta vaca vale NULL. aux Contiene la direccin de comienzo del nuevo elemento p,w Son 2 punteros que sirven para recorrer la lista. Para agregar un elemento a la lista se deben seguir los pasos que a continuacin se enumeran: 1- Realizar la solicitud de memoria dinmica por medio del operador new 2- Cargar los datos en la estructura. 3- Enlazar el nuevo elemento con los que existan en la lista 4- Actualizar el puntero al primer elemento.

Primer elemento de la lista - Lista Vacia


Inicialmente no existen elementos en la lista. Para identificar fcilmente esta condicin asignamos a NULL el puntero al primer elemento (Inicio=NULL) El primer ingreso se representa en la Figura 3 p=Inicio como es el primer elemento p apunta a NULL

SI ( p==NULL) { Inicio=aux aux->prox=NULL }

Si es verdadero entonces es el nico elemento de la lista El inicio de la lista es la direccin del nuevo elemento

Insertar al final de la lista


Para saber donde se va a insertar el nuevo elemento se debe comparar el valor del dato del nuevo

elemento contra cada uno de los elementos de la lista. Inicialmente se apunta p al comienzo de la lista y w al proximo elemento. p=Inicio w=p->prox ----------------------------SI (w==NULL) { p->prox=aux aux->prox=w }

Insertar al comienzo de la lista


La representacin grfica de este caso se observa en la Figura 5 p=Inicio

w=p->prox SI (aux->dato < p->dato ) { Inicio=aux aux->prox=p }

Insertar en una posicin intermedia


Para saber en que posicin de la lista se debe insertar el elemento se debe recorrer la lista y detenerse cuando el valor del dato nuevo sea menor al valor del dato del prximo elemento. La figura 6 representa esta condicin.

p=Inicio w=p->prox MIENTRAS (w !=NULL ) { SI (aux->dato < w->dato ) { p->prox=aux aux->prox=w BREAK } p=w w=p->prox }

Funcin para insertar un elemento en una lista


La funcin para insertar un elemento necesita como parmetro formal el puntero al primer elemento de la lista y devolver la nueva direccin de comienzo para que se pueda actualizar desde la funcin que realiz el llamado. Dentro de la funcin se pueden ver identificados cada uno de los casos analizados anteriormente. Nodo * Insertar(Nodo *Inicio) { Nodo *p,*w,*aux; aux=new Nodo; if(!aux) { puts("\nNo hay memoria disponible"); return Inicio; } printf("\nIngrese Dato: "); scanf("%d",&aux->dato); //Si Lista vacia,Primer elemento que se carga en la lista if ( !Inicio) //Si Inicio es NULL { Inicio=aux; aux->prox=NULL; return Inicio; } //Verifico si el elemento a insertar es el primero de la lista p=Inicio; w=p->prox; if(aux->dato<p->dato) { aux->prox=Inicio; Inicio=aux; return Inicio; } while(w) { if(aux->dato<w->dato) { aux->prox=w; p->prox=aux;

} if(w==NULL) { p->prox=aux; aux->prox=NULL; } return Inicio; }

break; } p=w; w=p->prox;

Funcin para eliminar un elemento de la ista


Nodo * Remover(Nodo *Inicio,int nro) { Nodo *p,*w; p=Inicio; w=p->prox; if(p->dato==nro) { Inicio=p->prox; delete p; return Inicio; } while(w) { if (w->dato==nro) { p->prox=w->prox; delete w; break; } p=w; w=p->prox; } if(!w) puts("\nNo se encontro el numero en la lista"); return Inicio; }

Funcin para mostrar todos los elementos de la lista


void Listar(Nodo *Inicio) { Nodo *p; p=Inicio; while(p) { printf("|%4d|-->",p->dato); p=p->prox; } }

Funcin para eliminar la lista completa


void Eliminar(Nodo *Inicio) {

Nodo *p,*w; p=Inicio; w=p->prox; while(p) { //printf("|%4d|---",p->dato); delete p; p=w; w=p->prox; } }

Вам также может понравиться