Sie sind auf Seite 1von 40

Tema Tema8: 8: Estructuras Estructurasde dedatos. datos.

Listas Listasenlazadas enlazadas

Fundamentos de Informtica
1 Ingeniera Industrial Escuela Superior de Ingenieros Universidad de Sevilla
Ismael Alcal Torrego Jos ngel Acosta Rodrguez Fernando Dorado Navas Fabio Gmez Estern-Aguilar Manuel Lpez Martnez Amparo Nez Reyes Carlos Vivas Venegas

TEMA TEMA8: 8: Estructuras Estructurasde dedatos. datos.Listas Listasenlazadas enlazadas

Lista enlazada

Estructura de datos lineal, formada por bloques de informacin, con un formato comn, enlazados entre s mediante punteros.

INICIO LISTA

Bloque 1

Bloque 2

Bloque 3

Bloque 4

FIN

Caractersticas Caractersticas de delistas listasenlazadas enlazadas Los elementos se distribuyen de forma dispersa por la memoria: Los bloques de informacin no ocupan posiciones consecutivas en la memoria. El orden de la lista la establecen los enlaces entre bloques de informacin. Acceso a los elementos aleatorio: Puede extraerse informacin de cualquier elemento o insertar un bloque en cualquier posicin. Acceso a los elementos no destructivo: Al contrario que en colas y pilas, la extraccin de un bloque no implica su eliminacin. El tamao de la lista puede modificarse de forma dinmica: Al contrario que en colas y pilas, no hay un nmero mximo de elementos de la lista (salvo limitaciones de la capacidad de almacenamiento de la mquina)

Listas Listassimplemente simplementeenlazadas enlazadas


Cada elemento contiene un enlace con el siguiente elemento de la lista. Conocida la posicin de un elemento, podemos recorrer la lista hacia delante No es posible recorrer la lista hacia atrs. INICIO LISTA

Bloque 1

Bloque 2

Bloque 3

Bloque 4

NULL

Listas Listassimplemente simplementeenlazadas enlazadasen enC C struct direc { char nombre[40]; char calle[40]; char ciudad[20]; int codigo; struct direc * sig; } info;

Por convenio, el fin de lista se indica como NULL

Informacin del Elemento Enlace con el siguiente elemento

Puntero a la propia estructura

Cada elemento requiere una reserva dinmica de memoria al ser creado (liberar memoria al ser eliminado). La gestin de la lista se hace con funciones apropiadas para aadir, insertar, borrar, buscar elementos, etc.

Listas Listassimplemente simplementeenlazadas enlazadas


Construccin Construccinde deuna unaLista Listasimplemente simplementeenlazada enlazadaen enC C

Dos Formas Lista Desordenada


No hay orden especfico para los elementos. La lista se construye aadiendo cada nuevo elemento al final de la lista existente. Si no existe lista, el nuevo elemento pasa a ser el primero y nico de la lista.

Lista Ordenada
Los elementos se aaden para que la lista final tenga un orden especfico. Hay que buscar el punto de insercin del elemento segn el orden establecido. La insercin puede ser al principio, en medio o al final. Si no existe lista, el nuevo elemento pasa a ser el primero y nico de la lista.

raiz

Elto 1

Elto 2

Elto 3

NULL

raiz

Elto 1

Elto 2

Elto 3

NULL

nuevo elemento AL FINAL raiz


Elto 1 Elto 2 Elto 3 nuevo

nuevo elemento INSERCIN

raiz
NULL
Elto 1 Elto 2 nuevo Elto 3

NULL

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

1.- Lista Desordenada struct direc * almac_fin( struct direc *top, struct direc * nuevo) { struct direc * p = top; /* puntero que recorrer la lista hasta el final */ if (top = = NULL) /* si no existe lista la crea */ return nuevo ; while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */ { p = p -> sig ; } p -> sig = nuevo; /* enlaza el nuevo elemento al final */ return top; /* devuelve la cabeza */ }

top

Elto. 1

Elto. 2

Elto. 3

NULL

nuevo

E. nuevo

NULL

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

1.- Lista Desordenada struct direc * almac_fin( struct direc *top, struct direc * nuevo) { struct direc * p = top; /* puntero que recorrer la lista hasta el final */ if (top = = NULL) /* si no existe lista la crea */ return nuevo ; while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */ { p = p -> sig ; } p -> sig = nuevo; /* enlaza el nuevo elemento al final */ return top; /* devuelve la cabeza */ } Recibe:

-Puntero al comienzo de la lista top -Puntero al nuevo elemento a insertar nuevo


top Elto. 1 Elto. 2 Elto. 3 NULL

(Se debe haber reservado memoria dinmicamente antes de llamar a la funcin)


nuevo E. nuevo NULL

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

1.- Lista Desordenada struct direc * almac_fin( struct direc *top, struct direc * nuevo) { struct direc * p = top; /* puntero que recorrer la lista hasta el final */ if (top = = NULL) /* si no existe lista la crea */ return nuevo ; while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */ { p = p -> sig ; } p -> sig = nuevo; /* enlaza el nuevo elemento al final */ return top; /* devuelve la cabeza */ Devuelve: }

-Puntero al comienzo de la lista

top

(En este caso la cabecera de la lista slo vara al Elto. 1 Elto. 2elemento) Elto. 3 insertar el primer NULL

nuevo

E. nuevo

NULL

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

1.- Lista Desordenada struct direc * almac_fin( struct direc *top, struct direc * nuevo) { struct direc * p = top; /* puntero que recorrer la lista hasta el final */ if (top = = NULL) /* si no existe lista la crea */ return nuevo ; while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */ { p = p -> sig ; } p -> sig = nuevo; /* enlaza el nuevode elemento al final */ la lista no Si el principio la lista es NULL, return top; /* devuelve la cabeza */ existe y la creamos: Su primer elemento es el }

que le pasamos, nuevo, y es tambin la nueva cabecera de la lista.


nuevo

top

NULL

top

E. nuevo

NULL

La lista no existe

El nuevo Elto es el primero y nico de la lista

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

Si el principio de la lista no es NULL, la lista ya tiene al menos un elemento. Recorremos la lista hasta encontrar el ltimo struct direc * almac_fin( struct direc *top, struct direc * nuevo) elemento (Al salir del while, p apunta al ltimo { struct direc * p = top; /* punteroelemento) que recorrer la lista hasta el final */ 1.- Lista Desordenada if (top = = NULL) /* si no existe lista la crea */ return nuevo ; while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */ { p = p -> sig ; } p -> sig = nuevo; /* enlaza el nuevo elemento al final */ return top; /* devuelve la cabeza */ }

top

Elto. 1

Elto. 2 p nuevo E. nuevo

Elto. 3

NULL

NULL

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

Alcanzado el final de la lista, slo queda enlazar el nuevo elemento a continuacn de ste. *top, struct direc * nuevo) struct direc * almac_fin( struct direc (El siguiente elemento al ltimo (p->sig) deber { a nuevo) struct direc * p = top; /* punteroapuntar que recorrer la lista hasta el final */ 1.- Lista Desordenada if (top = = NULL) /* si no existe lista la crea */ return nuevo ; while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */ { p = p -> sig ; } p -> sig = nuevo; /* enlaza el nuevo elemento al final */ return top; /* devuelve la cabeza */ }

top

Elto. 1

Elto. 2 p nuevo E. nuevo

Elto. 3

NULL

NULL

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

1.- Lista Desordenada struct direc * almac_fin( struct direc *top, struct direc * nuevo) Para finalizar devolvemos la cabecera de la lista { (Haya sta cambiado o no) struct direc * p = top; /* puntero que recorrer la lista hasta el final */ if (top = = NULL) /* si no existe lista la crea */ return nuevo ; while( p -> sig ) /* recorre la lista hasta que p apunte al ltimo */ { p = p -> sig ; } p -> sig = nuevo; /* enlaza el nuevo elemento al final */ return top; /* devuelve la cabeza */ }

top

Elto. 1

Elto. 2

Elto. 3

E. nuevo

NULL

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada Estructura base para ejemplo de insertar Estructura base parael ejemplo dela la funcin insertar struct ciclista *insertar (el struct ciclista *funcin top, struct ciclista * nuevo) { struct ciclista{ struct ciclista{ struct ciclista *actual = top; /* puntero para moverse por la lista */ int num; del ciclista int*anterior num;/* /*nmero nmero del ciclista*/ */ elemento anterior al "actual" */ struct ciclista = NULL; /*puntero al char /* char nombre[80]; /*nombre nombre delciclista ciclista*/ */ /* Bsqueda del nombre[80]; punto de insercin */ del int tiempo; /* tiempo en la clasificacin */ int != tiempo; tiempo en-> latiempo clasificacin */ -> tiempo) ) while ( (actual NULL)/* && (actual <= nuevo { structciclista ciclista**sig; sig;/* /*puntero punteroaasiguiente siguiente*/ */ anterior = struct actual; }; }; -> sig; actual = actual } es Elobjetivo objetivo esdisear disearla lafuncin funcininsertar insertarpara paracrear crearlistas listas /* El insercin */ ordenadas de elementos struct ciclista. ordenadas elementos struct ciclista. if (anterior != de NULL) /* insercin en medio o final */ El criterio de ordenacin ser de menor El criterio de = ordenacin ser de menoraamayor mayortiempo tiempo anterior -> sig nuevo; de clasificacin. de/* clasificacin. else insercin al principio de la lista */ top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) { struct ciclista *actual = top; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ /* Bsqueda del punto de insercin */ while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) { anterior = actual; actual = actual -> sig; Recibe: -Puntero al comienzo de la lista top } /* Insercin */ -Puntero al nuevo elemento a insertar nuevo if (anterior != NULL) /* insercin en medio o final */ anterior -> sig = nuevo; (Se debe haber reservado memoria dinmicamente else /* insercin al principio dede la llamar lista */a la funcin) antes top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) { struct ciclista *actual = top; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ /* Bsqueda del punto de insercin */ while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) { anterior = actual; actual = actual -> sig; Devuelve: } -Puntero al comienzo de la lista /* Insercin */ if (anterior != NULL) /* insercin en medio o final */ anterior -> sig = nuevo; (En este caso la cabecera de la lista vara si el else /* insercin al nuevo principio de la lista elemento tiene*/ un tiempo de clasificacin top = nuevo; inferior a todos los dems) nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) { struct ciclista *actual = top; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ /* Bsqueda del punto de insercin */ while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) { Recorreremos la lista con dos punteros: anterior = actual; actual = actual -> sig; -actual que apunta al elemento que queremos } examinar en ese momento /* Insercin */ - anterior, que apunta al elemento precedente a if (anterior != NULL) /* insercin actual en medio o final */ anterior -> sig = nuevo; else /* insercin al principio de la Elto lista */ Elto 2 1 Elto 3 Elto 4 Elto 5 top NULL top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ anterior actual }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) { struct ciclista *actual = top; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ /* Bsqueda del punto de insercin */ while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) { anterior = actual; actual = actual -> sig; } /* Insercin */ la lista if (anterior != NULL) /* insercinRecorremos en medio o final */ desde el principio mientras: anterior -> sig = nuevo; else /* insercin al principio de la lista */ 1.- No lleguemos al final top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) { struct ciclista *actual = top; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ /* Bsqueda del punto de insercin */ while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) { anterior = actual; actual = actual -> sig; Y } 2.- El elemento actual tenga un tiempo de clasificacin /* Insercin */ inferior al del nuevo elemento. if (anterior != NULL) /* insercin en medio o final */ Si no es as, el nuevo elemento debe insertarse entre los anterior -> sig = nuevo; elementos de la lista apuntados por anterior y actual. else /* insercin al principio de la lista */ Elto 1 Elto 2 Elto 3 Elto 4 Elto 5 top top = nuevo; NULL nuevo -> sig = actual; actual return top; /* devuelve la cabecera lista */ anterior de la nuevo }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada

Una vez localizado el punto de insercin, hay que distinguir dos casos:

struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) { 1.- Que el punto de insercin sea en medio o al final struct ciclista *actual = top; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; al elemento */ Elto 1 Elto 2 Eltoanterior 3 Elto 4al "actual" top /*puntero NULL /* Bsqueda del punto de insercin */ while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) actual ) nuevo anterior { anterior = actual; actual = actual -> sig; } /* Insercin */ if (anterior != NULL) /* insercin en medio o final */ anterior -> sig = nuevo; else /* insercin al principio de la lista */ top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

En cuyo caso Reconectamos como struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) { Elto 1 Elto 2 Elto 3 Elto 4 top NULL struct ciclista *actual = top; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ actual anterior nuevo /* Bsqueda del punto de insercin */ while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) anterior -> sig = nuevo { anterior = actual; actual = actual -> sig; } /* Insercin */ if (anterior != NULL) /* insercin en medio o final */ anterior -> sig = nuevo; else /* insercin al principio de la lista */ top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

2.- Lista Ordenada

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) { struct ciclista *actual = top; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ Si no /* Bsqueda del punto de insercin */ while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) 2.- La insercin es al principio de la lista. { anterior = actual; actual = actual -> sig; } /* Insercin */ if (anterior != NULL) /* insercin en medio o final */ anterior -> sig = nuevo; else /* insercin al principio de la lista */ top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada

En cuyo caso reconectamos como

struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) NULL Elto 1 Elto 2 Elto 3 Elto 4 top NULL { struct ciclista *actual = top; /* puntero para moverse por la lista */ nuevo struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ top = nuevo /* Bsqueda del punto de anterior insercin */ actual while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) { anterior = actual; actual = actual -> sig; } /* Insercin */ if (anterior != NULL) /* insercin en medio o final */ anterior -> sig = nuevo; else /* insercin al principio de la lista */ top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada

En cualquiera de los dos casos:

struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) nuevo -> sig = actual { Caso 1: struct ciclista *actual = top; /* puntero para moverse por la lista */ Elto 1 Elto 2 Elto 3 Elto 4 top /*puntero NULL struct ciclista *anterior = NULL; al elemento anterior al "actual" */ /* Bsqueda del punto de insercin */ actual while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) anterior nuevo { Caso 2: anterior = actual; actual = actual -> sig; NULL Elto 1 Elto 2 Elto 3 Elto 4 top } /* Insercin */ nuevo if (anterior != NULL) /* insercin en medio o final */ anterior -> sig = nuevo; anterior actual else /* insercin al principio de la lista */ top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

NULL

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Lista Ordenada struct ciclista *insertar ( struct ciclista * top, struct ciclista * nuevo) { struct ciclista *actual = top; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ /* Bsqueda del punto de insercin */ while ( (actual != NULL) && (actual -> tiempo <= nuevo -> tiempo) ) { anterior = actual; actual = actual -> sig; Para finalizar devolvemos la } cabecera de la lista (Haya sta /* Insercin */ cambiado o no) if (anterior != NULL) /* insercin en medio o final */ anterior -> sig = nuevo; else /* insercin al principio de la lista */ top = nuevo; nuevo -> sig = actual; return top; /* devuelve la cabecera de la lista */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde deRecuperacin Recuperacinde deelementos elementosde deListas Listassimplemente simplementeenlazadas enlazadas

1.- Recorrer la lista completa void listado (struct ciclista * top) { struct ciclista *p = top; /* Puntero para recorrer la lista */ while (p) { /* Bucle que recorre la lista */ printf("%s %d\n", p -> nombre, p -> tiempo); p = p -> sig; } }

Funcin que recorre la lista al completo desde el primer al ltimo elemento, mostrando los miembros nombre y tiempo.

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde deRecuperacin Recuperacinde deelementos elementosde deListas Listassimplemente simplementeenlazadas enlazadas

1.- Recorrer la lista completa void listado (struct ciclista * top) { struct ciclista *p = top; /* Puntero para recorrer la lista */ while (p) { /* Bucle que recorre la lista */ printf("%s %d\n", p -> nombre, p -> tiempo); p = p -> sig; } }

Esta sentencia pude sustituirse en el caso general por cualquier otra secuencia en funcin de los se desee hacer con los datos de la lista.

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones Funcionesde deRecuperacin Recuperacinde deelementos elementosde deListas Listassimplemente simplementeenlazadas enlazadas

2.- Bsqueda de un elemento concreto struct ciclista * busca (struct ciclista *top, char *c) { struct ciclista *p = top; /* Puntero para recorrer la lista */ while (p) { if ( !strcmp(c, p -> nombre) ) return p; /* devuelve el puntero*/ p = p -> sig; } return NULL; /* no encontrado */ } Funcin que busca el elemento cuyo miembro nombre coincida con el que se le pasa como argumento (char *c). Devuelve un puntero al elemento encontrado, o NULL en caso de no encantarlo.

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones FuncionesAdicionales Adicionalespara paraListas Listassimplemente simplementeenlazadas enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c) { struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */ struct ciclista * aux; /* servir para poder liberar memoria */ while(p) { if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */ { if (ant = = NULL) /* es el primero */ { aux = p -> sig; free(p); Funcin que borra un elemento return aux;} de una lista enlazada. Para localizar el elemento, le pasa el else /* el elemento se a eliminar vamiembro en medio o al final */ nombre del elemento eliminar *c), y la {anta-> sig = p (char -> sig; cabecera de la lista (top) free(p); return top;} Devuelve } un puntero a la nueva cabecera de la lista. ant = p; /* avance */ p = p -> sig; } /* fin del while */ return top; /* no encontrado o lista vaca */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones FuncionesAdicionales Adicionalespara paraListas Listassimplemente simplementeenlazadas enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c) { struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */ struct ciclista * aux; /* servir para poder liberar memoria */ while(p) { if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */ { if (ant = = NULL) /* es el primero */ { aux = p -> sig; free(p); return aux;} else /* el elemento a eliminar va en medio o al final */ {ant -> sig = p -> sig; free(p); return top;} } ant = p; /* avance */ Se definen punteros para recorrer la p = p -> sig; lista (similar a la funcin insertar) } /* fin del while */ return top; /* no encontrado o lista vaca */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones FuncionesAdicionales Adicionalespara paraListas Listassimplemente simplementeenlazadas enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c) { struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */ struct ciclista * aux; /* servir para poder liberar memoria */ while(p) { if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */ { if (ant = = NULL) /* es el primero */ { aux = p -> sig; free(p); return aux;} Recorremos else /* el elemento a eliminar va en medio o al final */ la lista hasta {ant -> sig = p -> sig; el final free(p); return top;} } ant = p; /* avance */ p = p -> sig; } /* fin del while */ return top; /* no encontrado o lista vaca */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones FuncionesAdicionales Adicionalespara paraListas Listassimplemente simplementeenlazadas enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c) { struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */ struct ciclista * aux; /* servir para poder liberar memoria */ while(p) { if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */ { if (ant = = NULL) /* es el primero */ { aux = p -> sig; free(p); con el que se le pasa como Si el miembro nombre coincide return aux;} argumento, entonces el elemento a borrar est apuntado por else /* el elemento a eliminar va en medio o al final */ actual {ant -> sig = p -> sig; free(p); Elto 1 Elto 2 Elto 3 Elto 4 top NULL return top;} } ant = p; /* avance */ p p = p -> sig; ant } /* fin del while */ return top; /* no encontrado o lista vaca */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones FuncionesAdicionales Adicionalespara paraListas Listassimplemente simplementeenlazadas enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c) { struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */ struct ciclista * aux; /* servir para poder liberar memoria */ while(p) { if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */ { if (ant = = NULL) /* es el primero */ { aux = p -> sig; free(p); return aux;} Dos casos: else /* el elemento a eliminar va en medio o al final */ {ant -> sig = p -> sig; 1.- El elemento a borrar es el primero free(p); return top;} Elto 1 Elto 2 Elto 3 Elto 4 top NULL NULL } ant = p; /* avance */ ant p = p -> sig; p } /* fin del while */ return top; /* no encontrado o lista vaca */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones FuncionesAdicionales Adicionalespara paraListas Listassimplemente simplementeenlazadas enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c) { struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */ struct ciclista * aux; /* servir para poder liberar memoria */ while(p) { if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */ { if (ant = = NULL) /* es el primero */ { aux = p -> sig; free(p); return aux;} else /* el elemento a eliminar va en medio o al final */ {ant -> sig = p -> sig; free(p); Dos casos: return top;} Liberamos memoria} y devolvemos la nueva cabecera ant = p; /* avance */ Elto 1 Elto 2 Elto 3 Elto 4 top NULL NULL p = p -> sig; } /* fin del while */ return o lista vaca */ ant top; /* no p encontrado aux (nueva cabecera) }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones FuncionesAdicionales Adicionalespara paraListas Listassimplemente simplementeenlazadas enlazadas

Borrado de elementos

struct ciclista * Dos borrar (struct ciclista * top, char * c) casos: { struct ciclista * 2.p =El top , * ant = a NULL; /*est Punteros paraorecorrer elemento borrar en medio al final lista */ struct ciclista * aux; /* servir para poder liberar memoria */ Elto 1 Elto 2 Elto 3 Elto 4 NULL while(p) { top if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */ { if (ant =ant = NULL) p /* es el primero */ { aux = p -> sig; free(p); return aux;} else /* el elemento a eliminar va en medio o al final */ {ant -> sig = p -> sig; free(p); return top;} } ant = p; /* avance */ p = p -> sig; } /* fin del while */ return top; /* no encontrado o lista vaca */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones FuncionesAdicionales Adicionalespara paraListas Listassimplemente simplementeenlazadas enlazadas

Borrado de elementos

struct ciclista * Enlazamos borrar (struct ciclista * top, char * c) a borrar y liberamos saltndonos el elemento { memoria. Devolvemos la cabecera de lista. struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */ struct ciclista * aux; /* servir para poder liberar memoria */ Elto 1 Elto 2 Elto 3 Elto 4 NULL while(p) { top if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */ { if (ant =ant = NULL) /* es el primero */ p { aux = p -> sig; free(p); return aux;} else /* el elemento a eliminar va en medio o al final */ {ant -> sig = p -> sig; free(p); return top;} } ant = p; /* avance */ p = p -> sig; } /* fin del while */ return top; /* no encontrado o lista vaca */ }

Listas Listassimplemente simplementeenlazadas enlazadas


Funciones FuncionesAdicionales Adicionalespara paraListas Listassimplemente simplementeenlazadas enlazadas

Borrado de elementos

struct ciclista * borrar (struct ciclista * top, char * c) { struct ciclista * p = top , * ant = NULL; /* Punteros para recorrer lista */ struct ciclista * aux; /* servir para poder liberar memoria */ while(p) { if ( !strcmp(c , p -> nombre)) /* lo hemos encontrado */ { if (ant = = NULL) /* es el primero */ { aux = p -> sig; free(p); return aux;} else /* el elemento a eliminar va en medio o al final */ {ant -> sig = p -> sig; free(p); Si return llegamos al final de la lista, significa que no se top;} ha encontrado el elemento a eliminar. } la cabecera de lista. ant = p; /* avanceDevolvemos */ p = p -> sig; } /* fin del while */ return top; /* no encontrado o lista vaca */ }

Listas Listasdoblemente doblementeenlazadas enlazadas


Cada elemento contiene dos enlaces con el siguiente y anterior elemento de la lista. Conocida la posicin de un elemento, podemos recorrer la lista en ambas direcciones INICIO LISTA NULL Listas Listasdoblemente doblementeenlazadas enlazadasen enC C struct direc { char nombre[40]; char calle[40]; char ciudad[20]; int codigo; struct direc * sig; struct direc * ante; } info;
Por convenio, el fin de lista, y el elemento precente al primero se indican como NULL

Bloque 1

Bloque 2

Bloque 3

Bloque 4

NULL

Informacin del Elemento

Punteros a la propia estructura

Enlace con el siguiente elemento y el anterior

DE NUEVO: Cada elemento requiere una reserva dinmica de memoria al ser creado (liberar memoria al ser eliminado). La gestin de la lista se hace con funciones apropiadas para aadir, insertar, borrar, buscar elementos, etc.

Listas Listasdoblemente doblementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listasdoblemente doblementeenlazadas enlazadas

1.- Lista Desordenada struct direc * d_almac_fin(struct direc *top, struct direc * nuevo) { struct direc * p = top; /* puntero que recorrer la lista hasta el final */ if (top = = NULL) return nuevo ; /* si no existe lista la crea */ while( p -> sig ) { p = p -> sig ; } /* recorre la lista hasta que p apunte al ltimo */ p -> sig = nuevo; /* enlaza el nuevo elemento al final */ nuevo -> ante = p; /* enlace con el ltimo */ return top; /* devuelve la cabeza */ }

INICIO LISTA NULL

Bloque 1

Bloque 2

Bloque 3

NULL

nuevo NULL

NULL E. nuevo

Listas Listasdoblemente doblementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listasdoblemente doblementeenlazadas enlazadas

2.- Lista Ordenada struct ciclista * dinsertar (struct ciclista * ppio, struct ciclista * nuevo) { Estructura Estructurabase basepara parael elejemplo ejemplode dela lafuncin funcindinsertar dinsertar struct ciclista *actual = ppio; /* puntero para moverse por la lista */ struct ciclista{ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ struct ciclista{ int num; /* del */ /* Bsqueda del punto de insercin */ int num; /*nmero nmero delciclista ciclista */ char nombre[80]; del while ( (actual != NULL) && ( /*nombre actual -> tiempo <= nuevo -> tiempo) ) char nombre[80]; /*nombre delciclista*/ ciclista*/ int tiempo; /* tiempo en la clasificacin {anterior = actual; int tiempo; /* tiempo en la clasificacin*/ */ struct ciclista * sig; /* puntero a siguiente actual = ciclista actual -> sig;}/* puntero a siguiente*/ struct * sig; */ struct ciclista * ant; /* puntero a anterior */ /* insercin struct */ ciclista * ant; /* puntero a anterior */ }; if (anterior != }; NULL) { anterior -> sig = nuevo; /* insercin en medio o final */ El es funcin nuevo -> ant =la anterior;} Elobjetivo objetivo esdisear disear la funcindinsertar dinsertarpara paracrear crearlistas listas ordenadas de elementos struct ciclista. else ordenadas de elementos struct ciclista. El de aamayor tiempo { ppio = nuevo; /*ser insercin al principio de la lista */ Elcriterio criterio deordenacin ordenacin serde demenor menor mayor tiempo de nuevo -> ant = NULL;} declasificacin. clasificacin. nuevo -> sig = actual; if ( actual != NULL ) actual -> ant = nuevo; return ppio; /* devuelve la cabecera de la lista */ }

Listas Listasdoblemente doblementeenlazadas enlazadas


Funciones Funcionesde decreacin creacinde deListas Listasdoblemente doblementeenlazadas enlazadas

2.- Lista Ordenada struct ciclista * dinsertar (struct ciclista * ppio, struct ciclista * nuevo) { struct ciclista *actual = ppio; /* puntero para moverse por la lista */ struct ciclista *anterior = NULL; /*puntero al elemento anterior al "actual" */ /* Bsqueda del punto de insercin */ while ( (actual != NULL) && ( actual -> tiempo <= nuevo -> tiempo) ) {anterior = actual; actual = actual -> sig;} /* insercin */ if (anterior != NULL) { anterior -> sig = nuevo; /* insercin en medio o final */ nuevo -> ant = anterior;} else { ppio = nuevo; /* insercin al principio de la lista */ nuevo -> ant = NULL;} nuevo -> sig = actual; if ( actual != NULL ) actual -> ant = nuevo; return ppio; /* devuelve la cabecera de la lista */ }

Listas Listasdoblemente doblementeenlazadas enlazadas

Borrado de elementos

struct ciclista * dborrar (struct ciclista * top, char * c) { struct ciclista * p = top; while(p) { if ( !strcmp(c, p->nombre) ) /* lo hemos encontrado */ { if ( p -> ant = = NULL ) /* es el primero */ {top = p -> sig; if (top) top -> ant = NULL; /* si el borrado no era nico */ free(p);return top;} if ( p -> sig = = NULL ) /* si no, es el ltimo */ {p -> ant -> sig = NULL; free (p);return top;} else {p -> ant -> sig = p -> sig; /* va en medio */ p -> sig -> ant = p -> ant; free(p); return top;} } /*fin de if */ p = p -> sig; /* avance */ } /* fin del while */ return top; /* no encontrado o lista vaca */ }

Das könnte Ihnen auch gefallen