Lista circular

Solo disponible en BuenasTareas
  • Páginas : 3 (505 palabras )
  • Descarga(s) : 9
  • Publicado : 7 de mayo de 2010
Leer documento completo
Vista previa del texto
#include
#include // LISDOB.CPP
#include

//Lista doble encadenada ( sin orden ) y recorrido en ambas direcciones.
// Contiene la rutina de borrado de un nodo.Se utilza doble punterostruct tipo { long dni; //estructura de registros
char apynom[20]; // estructura auxiliar
};

struct nodo
{ tipo datos ;
nodo *sigui, *ant; //estructura del nodo
} ;

intlista_vacia (nodo * t)
{ //funcion que retorna el valor nulo
return (t==NULL);
}

nodo * nuevonodo()
{ nodo *p =(nodo*) malloc (sizeof (nodo)); //mallocverifica memoria
if (p==NULL) { puts ("No hay suficiente memoria");exit(1); }
return p;
}

// ************************************************** **********
// Crea lista doble
//************************************************** **********

nodo * creadoble(nodo *r,nodo **f,tipo per)
{ nodo *p = nuevonodo();
nodo *actual = *f, *ante=*f;
p->datos = per;
if (lista_vacia(r)) // listavacia; crea primer nodo, en lugar de r, *f
{ p->sigui=NULL;
p->ant = NULL;
r=p;
*f=p; //guarda la direccion de p (el primero que se ingreso)
}
else // agruegati
{ while (actual!=NULL &&per.dni>actual->datos.dni)
{ ante = actual;
actual = actual->sigui;
}
if (ante ==actual) //inserta adelante del primero
{ p->sigui=*f;
p->ant = NULL;
p->sigui->ant=p;
//actual->ant=p; //igual al dearriba
//(*f)->ant=p; //igual al de arriba
*f = p;
}
else
{ if (actual) //inserta entre dos nodos
{ p->sigui = actual;
p->ant = ante;
ante->sigui = p;
actual->ant=p;
}
else //inserta al finalde la lista
{ p->sigui = NULL;
p->ant = ante;
ante->sigui =p;
r=p; //p es el nuevo último
}
}
}
return r;
}

void vernodo(struct nodo *s)
{
clrscr();
nodo *p=s;
while (p)
{ printf ("\n %-7ld %-15s" , p->datos.dni,p->datos.apynom );
p = p->sigui;
}
}

void reves (nodo *s)
{ nodo *p=s;
printf ("\n\n");
while (p)
{ printf ("\n %-7ld %-15s", p->datos.dni, p->datos.apynom);...
tracking img