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;