Professional Documents
Culture Documents
5: Listas
5-Listas
5.1 Definiciones y operaciones 5.2 Listas simplemente enlazadas 5.3 Listas doblemente enlazadas 5.4 Listas circulares 5.5 Listas auto organizadas y ordenadas
5: Listas
Definiciones y operaciones
Cada elemento o nodo se representa por una
estructura, cuyos campos pueden ser ledos y escritos a travs de un puntero a la estructura. Suele existir un campo que se denomina clave, que identifica nicamente al nodo. La clave puede ser numrica o alfanumrica. Operaciones posibles sobre listas incluyen:
r r r r r
5-Listas
5.1 Definiciones y operaciones 5.2 Listas simplemente enlazadas 5.3 Listas doblemente enlazadas 5.4 Listas circulares 5.5 Listas auto organizadas y ordenadas
5: Listas
enlace (puntero) entre un nodo y su sucesor Elementos se direccionan en tiempo constante O(1), los elementos tienen un costo de acceso de O(n) en el peor caso Las operaciones deben considerar que estas listas pueden estar vacas lo cual requiere un tratamiento especial El uso de un centinela simplifica las operaciones al hacer que todos los nodos sean tratados de forma igual
5: Listas 5
pnodo lista=NULL;
pnodo q; if ( (q= Buscar(lista, 5)) == NULL) { /* no encontr nodo con clave = 5*/ } else { /* lo encontr. ..*/ }
pnodo t;
Listas: insercin
Hay dos variables de tipo puntero a
nodo: p apunta a un nodo de una lista y n apunta a un nodo correctamente inicializado (e.g. retorno de CreaNodo). El nodo apuntado por n puede ser insertado despus del nodo apuntado por p usando: n->proximo = p->proximo; Para completar la lista se usa: p->proximo = n; Como seria el diagrama final?
5: Listas 11
Ejemplo de uso:
Si el argumento posicin toma valor NULL, se producir un error, por eso se verifica su existencia,
pnodo nuevo)
pnodo lista=NULL; //inicializar lista pnodo pos=NULL; lista=InsDespues(pos, CreaNodo(1)); pos =Buscar(lista, 1); InsDespues(pos, CreaNodo(2)); pos =Buscar(lista, 2); InsDespues(pos, CreaNodo(3)); pos =Buscar(lista, 2); InsDespues(pos, CreaNodo(4));
pnodo InsDespues( pnodo posicin, { if (nuevo == NULL) return (NULL); if (posicion != NULL) { nuevo->proximo = posicion->proximo; posicion->proximo=nuevo; return (posicion); } return(nuevo); }
5: Listas
12
se requiere una variable temporal para efectuar el intercambio (i.e. temp) : pnodo p = NULL; //inicializar lista p = InsDespues(p,CreaNodo(1)); InsDespues(p,CreaNodo(2)); pnodo n = CreaNodo(3); // Como es el diagrama? int temp; n->proximo = p->proximo; p->proximo = n; temp=p->clave; p->clave=n->clave; n->clave=temp; // Como es el diagrama final?
p 1 n 3 2
5: Listas
13
pnodo InsertaNodoalFinal(pnodo posicion, int dato) { pnodo temp=posicion; if (temp != NULL) { while (temp->proximo !=NULL) temp=temp->proximo; //O(n) temp->proximo=CreaNodo(dato); return (temp->proximo); //retorna NULL si no se pudo crear } else return (CreaNodo(dato)); } // Ejemplo uso?
5: Listas 14
pnodo insertainicio(int clave) { pnodo t=CreaNodo(clave); if(cabeza==NULL) cola=t; t->proximo=cabeza; cabeza=t; //O(1) return(t); }
Insertafinal( )?
pnodo insertafinal(int clave) { pnodo t =CreaNodo(clave); if(cola==NULL) { cola=cabeza=t;} else { cola->proximo=t; cola=t;} //O(1) 5: Listas return(t); }
15
void ins_nodo_ref(pnodo *p, pnodo t) { if (*p==NULL) *p=t; //inserta en lista vaca. else { t->proximo=*p; //lee var. externa. *p=t; //escribe en var. externa. } }
pnodo lista1=NULL; Insertanodo_ref(&lista1, CreaNodo(4)); Insertanodo_ref(&lista1, CreaNodo(3)); Insertanodo_ref(&lista1, CreaNodo(2)); Insertanodo_ref(&lista1, CreaNodo(1));
5: Listas
16
Listas: descarte
La variable p apunta al nodo
anterior al que se desea descartar, t apunta al nodo que se desea desligar de la lista despus de ejecutada la accin: t=p->proximo; Para mantener la lista ligada: p->proximo = t->proximo;
Despus se libera el espacio del
5-Listas
5.1 Definiciones y operaciones 5.2 Listas simplemente enlazadas 5.3 Listas doblemente enlazadas 5.4 Listas circulares 5.5 Listas auto organizadas y ordenadas
5: Listas
18
enlaces (punteros) entre un nodo, su sucesor y su antecesor: typedef struct moldecelda { int clave; struct moldecelda *nx; //next struct struct modecelda *pr; // previous } nodo, *pnodo;
5: Listas
19
antes de insertar el nodo apuntado por q a la lista dada por p. Como seria el cdigo para insertar? q->nx = p->nx; q->pr = p; p->nx = q ; q->nx->pr = q; Como seria descartar el nodo q? q->pr->nx = q->nx; q->nx->pr = q->pr; free(q);
5: Listas 20
considerar las condiciones en los bordes, y que la lista pueda estar vaca. Una forma usual de tratar simplificadamente las condiciones de borde, es definir un nodo vaco, denominado cabecera o centinela.
5: Listas
21
5-Listas
5.1 Definiciones y operaciones 5.2 Listas simplemente enlazadas 5.3 Listas doblemente enlazadas 5.4 Listas circulares 5.5 Listas auto organizadas y ordenadas
5: Listas
22
Listas circulares
En listas simplemente enlazadas, sin o con cabecera,
puede escogerse que el ltimo nodo apunte al primero, con esto se logra que el primer nodo pueda ser cualquier nodo de la lista.
tratarse de manera especial, con costo O(n), para que el ltimo nodo apunte al nuevo primero. Si la lista es con centinela, y si el ltimo apunta al centinela, no es necesario introducir cdigo adicional.
5: Listas 23
5-Listas
5.1 Definiciones y operaciones 5.2 Listas simplemente enlazadas 5.3 Listas doblemente enlazadas 5.4 Listas circulares 5.5 Listas auto organizadas, ordenadas
5: Listas
24
De esta manera los elementos ms buscados van quedando cerca del inicio.
ordenados segn el orden de las claves. Se puede tratar las listas en base a arreglos. Pudiendo ser stos: arreglos de nodos, en los cuales se emplean punteros; o bien arreglos que contienen la informacin de vnculos en base a cursores que almacenan ndices.
5: Listas 25