Certamen 1 Estructuras de Datos y Algoritmos. Primer Semestre

Anuncio
Certamen 1
Estructuras de Datos y Algoritmos.
Primer Semestre 2008
1. Se tiene una lista simplemente enlazada. Cada nodo tiene, además de una clave entera,
un puntero al próximo nodo.
a) Diseñar la función con prototipo: int BuscarDescartar(pnodo * lista, int k);
Que busca un nodo con valor de clave igual a k, y retorna: -1 si la lista está vacía, 1 si la
encuentra y descarta el nodo con esa clave en el primer lugar, 2 si encuentra la clave y la
descarta, y 0 si no la encuentra.
2. Se tienen dos listas simplemente enlazadas que se mantienen ordenadas ascendentes por
el campo entero clave.
a) Diseñar una función que mezcle dos listas la y lb, retornando un puntero a la nueva lista,
que queda también ordenada: pnodo Mezclar(pnodo la, pnodo lb);
b) Asumiendo que existen las listas: lista1 y lista2, escribir el código, usando la función
Mezclar, que deja la nueva lista en lista1 y la lista2 quede vacía.
Solución 1.
int BuscarDescartar(pnodo *lista, int k)
{ pnodo t=*lista; pnodo q;
if (*lista==NULL) return(-1); //lista vacía
if(t->clave==k) {*lista=t->proximo; free(t); return(1);} //t era el primero
else
{ q=t; t=t->proximo;
while(t!=NULL) //Recorre lista O(n)
if (t->clave==k) {q->proximo=t->proximo; free(t); return(2);}
else {q=t; t=t->proximo;}
}
return(0); //no estaba en la lista
}
Solución 2.
//mezcla dos listas ordenadas por campo clave.
pnodo Mezclar(pnodo lista1, pnodo lista2)
{ pnodo lista=NULL, t;
if (lista1==NULL ) return lista2;
//si una de las listas es vacía.
else if(lista2==NULL) return lista1;
else
{ if (lista1->clave < lista2->clave)
//Inicio de nueva lista
{lista=lista1; lista1=lista1->proximo;}
else {lista=lista2; lista2=lista2->proximo;}
t=lista;
//con t se recorre la nueva lista.
while(lista1!=NULL && lista2!=NULL) // Procesa hasta agotar una de las listas
{ if (lista1->clave < lista2->clave)
{t->proximo=lista1; lista1=lista1->proximo;}
else {t->proximo=lista2; lista2=lista2->proximo;}
t=t->proximo;
}
if(lista1!=NULL ) t->proximo=lista1; //copia el resto
else t->proximo=lista2;
return(lista);
}
}
b)
lista1= Mezclar(lista1, lista2); lista2=NULL;
Descargar