Lista doble problemas
Buenas
En la facu me pidieron hacer este TP
Se dispone de una lista enlazada doble cuyos nodos tienen el siguiente diseño:
Numero de Vuelo(entero)
Pasajes disponibles (entero)
Puntero al anterior y al sisguiente.
Escriba una funcion que recibiendo el puntero al primero y al ultimo nodos de la lista, elimine los nodos en los que los pasajes disponibles son iguales a 0. Escriba el main para invocar a la funcion.
yo tengo echo esto,
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct pasajes {int vuelo;
int npasaje;};
struct nodo {struct nodo *ant;
struct pasajes datos;
struct nodo *sigui;};
int listavacia (struct nodo *);
struct nodo *nuevonodo ();
struct nodo *creadoble (struct nodo *, struct nodo **, struct pasajes);
void vernodo (struct nodo *);
void reves (struct nodo*);
void borranodo (struct nodo **, struct nodo **,int ); //int o long?
void borranpasajes (struct nodo *,int);
//************************************************** ***************
//************************************************** ***************
void main()
{ struct nodo *ultimo=NULL, *primero=NULL;
struct pasajes x;
long d;
clrscr();
printf ("Ingrese Vuelo (0 para finalizar):");
scanf ("%d",&x.vuelo);
while (x.vuelo)
{
printf ("Ingrese Pasaje:");
scanf("%d",&x.npasaje);
ultimo=creadoble (ultimo,&primero,x);
printf ("Ingrese Vuelo (0 para finalizar):");
scanf ("%d",&x.vuelo);
}
if (listavacia (primero))
{ clrscr();
printf ("No se ingresaron datos");
getch ();exit(0);}
else
{vernodo (primero);
reves (ultimo);
while (primero &&d)
{borranodo (&primero,&ultimo,d);
vernodo (primero) ; reves (ultimo);
}
getch();
}
}
int listavacia (struct nodo *p)
{return (p==NULL);}
struct nodo *nuevonodo()
{struct nodo *p=(struct nodo *) malloc (sizeof (struct nodo));
if (p==NULL)
{printf ("Memoria Insuficiente"); getch();exit(0);}
return p;
}
struct nodo *creadoble (struct nodo *ult, struct nodo **pri, struct pasajes x)
{ struct nodo *p;
p= nuevonodo ();
p->datos=x;
if (listavacia (ult))
{p-> sigui=NULL;
p->ant=NULL;
ult=p;
*pri=p;
}
else
{p-> ant=ult;
p->sigui=NULL;
ult-> sigui=p;
ult =p;
}
return ult;
}
void vernodo (struct nodo *p)
{while (p)
{printf("vuelo:%d, npasaje:%d
",p->datos.vuelo, p->datos.npasaje);
p=p->sigui;
}
}
void reves (struct nodo *p)
{while (p)
{printf("vuelo:%d, npasaje:%d
",p->datos.vuelo, p->datos.npasaje);
p=p->ant;
}
}
void borranodo (struct nodo **pri, struct nodo**ult, int d) //long o int??
{struct nodo *anterior, *actual, *aux;
anterior=actual=*pri;
while (actual&&d!=actual->datos.npasaje)
{anterior=actual;
actual=actual->sigui;}
if (actual==NULL)
{printf("Pasaje Inexistente
");
getch();}
else
{
if (anterior==actual) //borra el primero
{actual=actual->sigui;
if (actual!=NULL)
actual->ant=NULL;
else
*ult=NULL;
*pri=actual;
free(anterior);
}
else
if (actual->sigui==NULL) //borra el ultimo
{*ult=anterior;
anterior->sigui=NULL;
free(actual);
}
{anterior->sigui=actual->sigui;
aux=actual->sigui;
aux->ant=anterior;
free(actual);
}
}
}
pero le falta el IF con la pregunta si los pasajes son 0 y la ordenacion para borrar ya sea al principio de la lista, al medio , o al final, estoy hace una mes ya y no lo puedo hacer y lo tengo que entregar el Lunes, por favor si alguien sabe donde va el IF y el codigo de como hacerlo, MUCHAS GRACIAS.
Buenas
En la facu me pidieron hacer este TP
Se dispone de una lista enlazada doble cuyos nodos tienen el siguiente diseño:
Numero de Vuelo(entero)
Pasajes disponibles (entero)
Puntero al anterior y al sisguiente.
Escriba una funcion que recibiendo el puntero al primero y al ultimo nodos de la lista, elimine los nodos en los que los pasajes disponibles son iguales a 0. Escriba el main para invocar a la funcion.
yo tengo echo esto,
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
struct pasajes {int vuelo;
int npasaje;};
struct nodo {struct nodo *ant;
struct pasajes datos;
struct nodo *sigui;};
int listavacia (struct nodo *);
struct nodo *nuevonodo ();
struct nodo *creadoble (struct nodo *, struct nodo **, struct pasajes);
void vernodo (struct nodo *);
void reves (struct nodo*);
void borranodo (struct nodo **, struct nodo **,int ); //int o long?
void borranpasajes (struct nodo *,int);
//************************************************** ***************
//************************************************** ***************
void main()
{ struct nodo *ultimo=NULL, *primero=NULL;
struct pasajes x;
long d;
clrscr();
printf ("Ingrese Vuelo (0 para finalizar):");
scanf ("%d",&x.vuelo);
while (x.vuelo)
{
printf ("Ingrese Pasaje:");
scanf("%d",&x.npasaje);
ultimo=creadoble (ultimo,&primero,x);
printf ("Ingrese Vuelo (0 para finalizar):");
scanf ("%d",&x.vuelo);
}
if (listavacia (primero))
{ clrscr();
printf ("No se ingresaron datos");
getch ();exit(0);}
else
{vernodo (primero);
reves (ultimo);
while (primero &&d)
{borranodo (&primero,&ultimo,d);
vernodo (primero) ; reves (ultimo);
}
getch();
}
}
int listavacia (struct nodo *p)
{return (p==NULL);}
struct nodo *nuevonodo()
{struct nodo *p=(struct nodo *) malloc (sizeof (struct nodo));
if (p==NULL)
{printf ("Memoria Insuficiente"); getch();exit(0);}
return p;
}
struct nodo *creadoble (struct nodo *ult, struct nodo **pri, struct pasajes x)
{ struct nodo *p;
p= nuevonodo ();
p->datos=x;
if (listavacia (ult))
{p-> sigui=NULL;
p->ant=NULL;
ult=p;
*pri=p;
}
else
{p-> ant=ult;
p->sigui=NULL;
ult-> sigui=p;
ult =p;
}
return ult;
}
void vernodo (struct nodo *p)
{while (p)
{printf("vuelo:%d, npasaje:%d
",p->datos.vuelo, p->datos.npasaje);
p=p->sigui;
}
}
void reves (struct nodo *p)
{while (p)
{printf("vuelo:%d, npasaje:%d
",p->datos.vuelo, p->datos.npasaje);
p=p->ant;
}
}
void borranodo (struct nodo **pri, struct nodo**ult, int d) //long o int??
{struct nodo *anterior, *actual, *aux;
anterior=actual=*pri;
while (actual&&d!=actual->datos.npasaje)
{anterior=actual;
actual=actual->sigui;}
if (actual==NULL)
{printf("Pasaje Inexistente
");
getch();}
else
{
if (anterior==actual) //borra el primero
{actual=actual->sigui;
if (actual!=NULL)
actual->ant=NULL;
else
*ult=NULL;
*pri=actual;
free(anterior);
}
else
if (actual->sigui==NULL) //borra el ultimo
{*ult=anterior;
anterior->sigui=NULL;
free(actual);
}
{anterior->sigui=actual->sigui;
aux=actual->sigui;
aux->ant=anterior;
free(actual);
}
}
}
pero le falta el IF con la pregunta si los pasajes son 0 y la ordenacion para borrar ya sea al principio de la lista, al medio , o al final, estoy hace una mes ya y no lo puedo hacer y lo tengo que entregar el Lunes, por favor si alguien sabe donde va el IF y el codigo de como hacerlo, MUCHAS GRACIAS.