Esta algo largo pero necesito implementarlo de varias maneras para que sea completo se que le falta pero no quiero complicarme la vida.
Código
#include <stdio.h> #include <stdlib.h> enum opcion {EXIT,INSERT,FIND,DELETE,SHOW,CURR,NEXT,PREV,FINDPREV,FINDNEXT}; struct nodo { char nombre[40]; struct nodo *next; struct nodo *prev; }; struct nodo *crearNodo () { struct nodo *x; x->next=NULL; x->prev=NULL; return x; } struct nodo *buscar (struct nodo *lista, char *k) { if (lista == NULL) return NULL; while (lista) { break; lista= lista->next; } return lista; } struct nodo *buscar_sig (struct nodo *act) { char *k = act->nombre; if (act == NULL) return NULL; act= act->next; while (act) { break; act= act->prev; } return act; } struct nodo *buscar_ant (struct nodo *act) { char *k = act->nombre; if (act == NULL) return NULL; act= act->prev; while (act) { break; act= act->prev; } return act; } // operacion eliminar: elimina el primer nodo que coincida con la llave k // recibe referencia del apuntador al inicio de la lista y llave a eliminar // devuelve el nodo eliminado o null si no se encuentra el nodo struct nodo *borrar (struct nodo **lista, char *k) { struct nodo *ant, *act; if (*lista == NULL) return NULL; act= *lista; ant= *lista; while (act != NULL) { break; ant= act; act= act->next; // avance al sig. nodo } if (act == NULL) return NULL; // Si se encontro el nodo if (act == *lista) { // Si es el primer nodo *lista= act->next; // Se mueve el aptdor. al inicio de la lista al siguiente nodo if (act->next) act->next->prev= NULL; } else { ant->next= act->next; // Se liga el nodo antecesor con el nodo sucesor del nodo a eliminar act->prev= ant; } return act; } void listar (struct nodo *lista) { if (lista == NULL) { return; } do { if (lista->prev && lista->next) else if (lista->prev == NULL && lista->next == NULL) else if (!lista->next) else if (!lista->prev) lista= lista->next; } while (lista != NULL); } struct nodo *insertar (struct nodo *head, struct nodo *x) { if (head != NULL) { //Tiene elementos head->prev= x; // El antecesor al primer nodo de la lista apunta al nuevo nodo x->next= head; // El sucesor del nuevo nodo apunta al primer nodo de la lista //x->prev= } head= x; // El inicio de la lista apunta al nuevo nodo return head; } struct nodo *curr (struct nodo *actual) { if (actual) { return actual; } return actual; } struct nodo *prev (struct nodo *actual) { if (actual && actual->prev) { return actual->prev; } return actual; } struct nodo *next (struct nodo *actual) { if (actual && actual->next) { return actual->next; } return actual; } int main () { char nombre[40]; enum opcion op= EXIT; struct nodo *x,*act=NULL; struct nodo *head= NULL; struct nodo *tail= NULL; while (1) { switch (op) { case INSERT: x= insertar (head,crearNodo ()); if (head == NULL) tail=x; tail->next=x; head=x; head->prev =tail; act= head; break; case FIND: act= buscar (head,nombre); if (act == NULL) else break; case DELETE: x= borrar (&head,nombre); if (x != NULL) { if (x == act) act= NULL; } else break; case SHOW: listar (head); break; case CURR: curr (act); break; case NEXT: act= next (act); break; case PREV: act= prev (act); break; case FINDNEXT: x= buscar_sig (act); if (x != NULL) { act=x; } else break; case FINDPREV: x= buscar_ant (act); if (x != NULL) { act=x; } else break; case EXIT: return; default: } } }