SoloCodigo

Programación General => C/C++ => Mensaje iniciado por: Maikol miguel en Sábado 7 de Abril de 2012, 06:56

Título: Lista doblemente enlazada
Publicado por: Maikol miguel en Sábado 7 de Abril de 2012, 06:56
Necesito su ayuda para que me den una idea por lo menos de como hacer un programa con listas doblemente enlazadas que calcule la nomina de un empleado  el profesor los unico que nos dio para hacer fue este codigo:

#include <stdio.h>
#include <stdlib.h>

#define ASCENDENTE 1
#define DESCENDENTE 0

typedef struct _nodo {
   int valor;
   struct _nodo *siguiente;
   struct _nodo *anterior;
} tipoNodo;

typedef tipoNodo *pNodo;
typedef tipoNodo *Lista;

/* Funciones con listas: */
void Insertar(Lista *l, int v);
void Borrar(Lista *l, int v);

void BorrarLista(Lista *);
void MostrarLista(Lista l, int orden);

int main() {
   Lista lista = NULL;
   pNodo p;

   Insertar(&lista, 20);
   Insertar(&lista, 10);
   Insertar(&lista, 40);
   Insertar(&lista, 30);

   MostrarLista(lista, ASCENDENTE);
   MostrarLista(lista, DESCENDENTE);

   Borrar(&lista, 10);
   Borrar(&lista, 15);
   Borrar(&lista, 45);
   Borrar(&lista, 30);

   MostrarLista(lista, ASCENDENTE);
   MostrarLista(lista, DESCENDENTE);

   BorrarLista(&lista);

   getchar();
   return 0;
}

void Insertar(Lista *lista, int v) {
   pNodo nuevo, actual;

   nuevo = (pNodo)malloc(sizeof(tipoNodo));
   nuevo->valor = v;
   
   
   actual = *lista;
   if(actual) while(actual->anterior) actual = actual->anterior;
 
   if(!actual || actual->valor > v) {
      nuevo->siguiente = actual;
      nuevo->anterior = NULL;
      if(actual) actual->anterior = nuevo;
      if(!*lista) *lista = nuevo;
   }
   else {
     
      while(actual->siguiente &&actual->siguiente->valor <= v)
    actual = actual->siguiente;
      nuevo->siguiente = actual->siguiente;
      actual->siguiente = nuevo;
      nuevo->anterior = actual;
      if(nuevo->siguiente) nuevo->siguiente->anterior = nuevo;
   }
}

void Borrar(Lista *lista, int v) {
   pNodo nodo;

   nodo = *lista;
   while(nodo && nodo->valor < v) nodo = nodo->siguiente;
   while(nodo && nodo->valor > v) nodo = nodo->anterior;

   if(!nodo || nodo->valor != v) return;

   
   if(nodo == *lista)
     if(nodo->anterior) *lista = nodo->anterior;
     else *lista = nodo->siguiente;

   if(nodo->anterior)
      nodo->anterior->siguiente = nodo->siguiente;
   if(nodo->siguiente)
      nodo->siguiente->anterior = nodo->anterior;
   free(nodo);
}

void BorrarLista(Lista *lista) {
   pNodo nodo, actual;

   actual = *lista;
   while(actual->anterior) actual = actual->anterior;

   while(actual)
    {
      nodo = actual;
      actual = actual->siguiente;
      free(nodo);
   }
   *lista = NULL;
}

void MostrarLista(Lista lista, int orden) {
   pNodo nodo = lista;

   if(!lista) printf("Lista vacía");

   nodo = lista;
   if(orden == ASCENDENTE) {
      while(nodo->anterior) nodo = nodo->anterior;
      printf("Orden ascendente: ");
      while(nodo) {
         printf("%d -> ", nodo->valor);
         nodo = nodo->siguiente;
      }
   }
   else {
      while(nodo->siguiente) nodo = nodo->siguiente;
      printf("Orden descendente: ");
      while(nodo) {
         printf("%d -> ", nodo->valor);
         nodo = nodo->anterior;
      }
   }
   
   printf("\n");
}
y la verdad no entiendo nada si alguien podria darme alguna idea....
Título: Re:Lista doblemente enlazada
Publicado por: Eternal Idol en Domingo 8 de Abril de 2012, 14:12
Conseguite un libro de C/C++, nadie puede suplir los conocimientos que no adquiriste.