Ayuda

luchang
30 de Agosto del 2005
Necesito cambiar este código a doblemente enlazada.
/*MENU DE POSTRES por ADRIAN CAMPOS - LUIS CHANG*/
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#define CMAX 40

typedef struct ingre{
char ing[CMAX];
ingre *subliga;
};
typedef struct dato{
char nombre[CMAX];
ingre *ligaing;
dato *liga;
}postre;

/*---------------------------------------------------------*/
/* FUNCIONES UTILIZADAS */
/*---------------------------------------------------------*/

ingre *creain(ingre *n)
{

n=(ingre *)malloc(sizeof(ingre));
n->subliga=NULL;
if (n==NULL)
{
puts("NO HAY MEMORIA");
getch();
exit(1);
}
return(n);
}

/*---------------------------------------------------------*/

dato *crea(dato *g)
{

g=(dato *)malloc(sizeof(dato));
g->liga=NULL;
g->ligaing=NULL;

if (g==NULL)
{
puts("NO HAY MEMORIA");
getch();
exit(1);
}
return(g);
}

/*---------------------------------------------------------*/

dato *crealista(dato *p)
{
ingre *i,*f, *creaingre(ingre *i);
dato *sp=NULL,*up=NULL;


p=crea(p);
//clrscr();
printf("nNombre: ");
scanf("%[^n]",p->nombre);
fflush(stdin);

if(strcmp(p->nombre,"FIN")!=0 && strcmp(p->nombre,"fin")!=0)
{
i=creain(i);
i=creaingre(i);
p->ligaing=i;
sp=p;
for(;;)
{
up=crea(up);
printf("nNombre: ");
scanf("%[^n]",up->nombre);
fflush(stdin);

if(strcmp(up->nombre,"FIN")!=0 && strcmp(up->nombre,"fin")!=0)
{
sp->liga=up;
f=creain(f);
f=creaingre(f);
up->ligaing=f;
sp=up;
}

else
{
sp->liga=NULL;
free(up);
break;
}
}
}
else

p=NULL;

return(p);
}

/*---------------------------------------------------------*/

ingre *creaingre(ingre *i)
{
ingre *t=NULL,*q=NULL;
int cuenta=1;

printf("Ingrediente %d: ",cuenta);
scanf("%[^n]",i->ing);

fflush(stdin);
if(strcmp(i->ing,"FIN")!=0 && strcmp(i->ing,"fin")!=0)
{
t=i;

for(;;)
{
q=creain(q);
++cuenta;
printf("Ingrediente %d: ",cuenta);
scanf("%[^n]",q->ing);
fflush(stdin);
if(strcmp(q->ing,"FIN")==0 || strcmp(q->ing,"fin")==0)
{
t->subliga=NULL;
free(q);
break; }
else
{
t->subliga=q;
q->subliga=NULL;
t=q;
}
}
}
else
i=NULL;

return(i);
}

/*---------------------------------------------------------*/

void listarpostres(dato *p)
{
dato *q=NULL;
//clrscr();
q=p;
printf("ntttLISTA DE POSTRES CARIBEYOSn");
while(q!=NULL)
{
printf("ntt %s ",q->nombre);
q=q->liga;
}
q=NULL;
free(q);
return;
}

/*---------------------------------------------------------*/

void listaringre(dato *p)
{
if(p==NULL ||p->ligaing==NULL)
return;

ingre *q=NULL;
//clrscr();
printf("ntt %sn",p->nombre);
for(q=p->ligaing; q!=NULL;q=q->subliga)
{
printf("nt%s",q->ing); }
q=NULL;
free(q);
return;
}

/*---------------------------------------------------------*/

dato *nuevo_postre(dato *p)
{
ingre *i,*f, *creaingre(ingre *i);

p=crea(p);
//clrscr();
printf("nNombre: ");
scanf("%[^n]",p->nombre);
fflush(stdin);
if(strcmp(p->nombre,"FIN")!=0 && strcmp(p->nombre,"fin")!=0)
{
p->liga=NULL;
p->ligaing=NULL;
i=creain(i);
i=creaingre(i);
p->ligaing=i;

}
else
p=NULL;
i=NULL;f=NULL;
free(i);free(f);

return(p);
}

/*---------------------------------------------------------*/

ingre *nuevo_ingre(ingre *i)
{
printf("Ingrediente: ");
scanf("%[^n]",i->ing);
fflush(stdin);
if(strcmp(i->ing,"FIN")!=0 && strcmp(i->ing,"fin")!=0)
i->subliga=NULL;
else
i=NULL;
return(i); }

/*---------------------------------------------------------*/

dato *insertapostre(dato *p)
{
if(p==NULL)
return(NULL);

dato *a,*x;
dato *nuevo_postre(dato *p);
x=nuevo_postre(x);
for(a=p;a->liga!=NULL;a=a->liga);
a->liga=x;
x->liga=NULL;

x=NULL;a=NULL;
free(x);free(a);
return(p);
}

/*---------------------------------------------------------*/

ingre *insertaingre(ingre *i)
{
/*i apunta al comienzo de la listade ingredientes*/
if(i==NULL)
return(NULL);

ingre *a,*x,*nuevo_ingre(ingre *i);

x=nuevo_ingre(x);
for(a=i;a->subliga!=NULL;a=a->subliga);
a->subliga=x;
x->subliga=NULL;

x=NULL;a=NULL;
free(x),free(a);

return(i);
}

/*---------------------------------------------------------*/

dato *elimina_postre(dato *p)
{
/*donde p apunta al comienzo de la lista depostres*/
if(p==NULL)
return(NULL);

dato *buscapostre(dato *p);
dato *t=NULL,*sp=NULL;
//t:dato que se debe eliminar, sp:nodo anterior al dato a eliminar,

//clrscr();
printf("nttIntroduzca el postre que desea eliminar de la listan");
sp=p;

t=buscapostre(p);
if(t!=NULL)
{
if(t==p)
p=p->liga;
else
{
while(sp->liga!=t);
{
sp=sp->liga;
}
sp->liga=t->liga;
}
free(t);
}
return(p);
}

//---------------------------------------------------------
ingre *elimina_ingre(ingre *i)
{
//donde i apuntaal comienzo de la lista de ingredientes
if(i==NULL)
return(NULL);

//t:dato que se debe eliminar, si:nodo anterior al dato a eliminar,
dato *x;
ingre *t=NULL,*si=NULL,*buscaingre(ingre *i);

t=buscaingre(i);
if(t!=NULL)
{
if(t==i)
i=i->subliga;
else
{
while(si->subliga!=t);
{
si=si->subliga;
};
si->subliga=t->subliga;
}
free(t);
}
else
{
printf("No se encontro el dato en la lista");
getch();
}
return(i);
}

//---------------------------------------------------------

int menu()
{
int c;

//clrscr();
printf("nnt1. Crear lista de postres");
printf("nt2. Ver lista de postres");
printf("nt3. Nuevo postre");
printf("nt4. Eliminar postre");
printf("nt5. Nuevo ingrediente");
printf("nt6. Eliminar ingrediente");
printf("nt7. Grabar");
printf("nt8. Salir");
printf("nt Escoja su opcion:");
scanf("%d",&c);
fflush(stdin);
return(c);
}

//---------------------------------------------------------

dato *buscapostre(dato *p)

{//donde p apunta al comienzo de la lista de postres
if(p==NULL)
return(NULL);


dato *q=NULL;
char info[CMAX];

printf("nPostre: ");
scanf("%[^n]",info);
fflush(stdin);
for(q=p; q!=NULL; q=q->liga)
{
if(!strcmp(q->nombre,info))
return(q);
}
printf("nNo se encontro el postre");
return(NULL);
}
//--------------------------------------------------------
ingre *buscaingre(ingre *i)
{ //donde i apunta al comienzo de la lista de ingredientes
if(i==NULL)
return(NULL);
ingre *q=NULL;
char info[CMAX];

printf("ingrediente: ");
scanf("%[^n]",info);
fflush(stdin);
for(q=i; q!=NULL; q=q->subliga)
{
if(strcmp(q->ing,info)==0)
return(q);
}
return(NULL);
}

//--------------------------------------------------------

void liberamemoria(dato *p)
{
dato *q=NULL;
q=p;
while(p!=NULL)
{
p=p->liga;
free(q);
q=p;
}
free(q);
}

//--------------------------------------------------------

void grabar(dato *p)
{
if(p==NULL)
return;
dato *z=NULL;
//ingre *y=NULL;
FILE *fp;

fp=fopen("a:gina.dat","wb");
if(fp==NULL)
{
printf("nError al abrir el archivo");
getch();
return;
}

z=p;

while(z !=NULL);
{
//y-x->ligaing;
fwrite(z,sizeof(dato),1,fp);
/*while(y!=NULL)
{

fwrite(y,sizeof(ingre),1,fp);
y=y->subliga;
} */
z=z->liga;
}

fclose(fp);
return;
}

//--------------------------------------------------------

dato *cargar(dato *p)
{
dato *s=NULL,*t=NULL;

FILE *fp;

//clrscr();
fp=fopen("a:gina.dat","rb");
if(fp==NULL)
{
printf("nERROR AL LEER EL ARCHIVO");
getch();
return(NULL); }
if(p!=NULL)
liberamemoria(p);

p=crea(p);
s=p;
while(!feof(fp))
{
if(1 !=fread(s,sizeof(dato),1,fp))
break;
t=s;
s->liga=crea(s->liga);
s=s->liga;

}
t->liga=NULL;
free(s);
fclose(fp);
return(p);
}

//--------------------------------------------------------

//CUERPO DEL PROGRAMA

//--------------------------------------------------------

int main()
{
dato *comienzo,*ep=NULL;

int r;
char resp,nombre[CMAX];

comienzo=cargar(ep);
do
{
r=menu();
switch(r)
{

case 1:{
comienzo=crealista(comienzo);
break;
}
case 2:{
if(comienzo==NULL)
break;
do
{
listarpostres(comienzo);
printf("nn Desea conocer los ingredientes de algun postre?(s/n): ");
scanf("%c",&resp);
fflush(stdin);
if(toupper(resp)=='S')
{
listaringre(buscapostre(comienzo));
getch();
}
}while(toupper(resp)=='S');
break;
}

case 3:

{
comienzo=insertapostre(comienzo);
break;
}

case 4:

{
comienzo=elimina_postre(comienzo);
break;
}

case 5:

{
ep=buscapostre(comienzo);
ep->ligaing=insertaingre(ep->ligaing);
break;
}

case 6:

{
ep=buscapostre(comienzo);
ep->ligaing=elimina_ingre(ep->ligaing);
break;
}

case 7:

{
grabar(comienzo);
break;
}


case 8:

break;

default:
break;
}
}while(r!=8);
grabar(comienzo);
}


Caiman
30 de Agosto del 2005
En la estructura para indicar que nodo será el siguiente solo agrega otro puntero que apunte hacia atras y cuando agregues un nuevo nodo, copia la dirección anterior al nodo "atras" del nuevo nodo para que puedas tener acceso a el.