Così sembra funzionare.. ti lascio ragionare sulla base del codice per trovare l'errore logico, per vendetta, visto che io mi sono dovuto concentrare abbastanza per ricostruire il meccanismo che hai utilizzato (della serie: qualche commento sarebbe stato ben accetto :-)
[notare che ho dovuto modificare le parti di input/output del tipo puts; fflush(stdin); gets(nuovo->info.nome); perche il compilatore che uso - gcc - le deprecava, e praticamente falliva l'esecuzione (v. output d'esempio che avevo postato)]
codice:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct
{
int n;
char nome[20];
}inf;
struct listalibera
{
inf info;
struct listalibera *next;
};
struct listadati
{
inf info;
struct listadati *next;
};
typedef struct listalibera l_list;
typedef struct listadati d_list;
void ins_testa(d_list **d, l_list **l)
{
d_list *nuovo;
char s[20];
nuovo=calloc(1,sizeof(d_list));
nuovo->info.n=(*l)->info.n;
printf("Stanza numero %d\n",nuovo->info.n);
printf("Inserisci nome cliente: ");
scanf("%s",s);
int u;
for (u=0;u<20;u++) {
nuovo->info.nome[u] = s[u];
}
//fflush(stdin);
//gets(nuovo->info.nome);
nuovo->next=*d;
*d=nuovo;
l_list *l_t;
l_t=(*l)->next;
free(*l);
*l=l_t;
}
void crea_l_t(l_list **testa)
{
l_list *h;
h=calloc(1,sizeof(l_list));
h->info.n=1;
h->next=*testa;
*testa=h;
}
void crea_l(l_list **pnt)
{
l_list *nuovo;
int i;
for(i=2;i<21;i++)
{
nuovo=calloc(1,sizeof(l_list));
nuovo->info.n=i;
nuovo->next=(*pnt)->next;
(*pnt)->next=nuovo;
*pnt=nuovo;
}
nuovo->next=NULL;
}
void ins_mezzo(d_list **pnt, l_list **l_h)
{
d_list *nuovo;
char s[20];
nuovo=calloc(1,sizeof(d_list));
nuovo->info.n=(*l_h)->info.n;
printf("Stanza numero %d\n",nuovo->info.n);
printf("Inserisci nome cliente: ");
scanf("%s",s);
int u;
for (u=0;u<20;u++) {
nuovo->info.nome[u] = s[u];
}
//fflush(stdin);
//gets(nuovo->info.nome);
nuovo->next=(*pnt)->next;
(*pnt)->next=nuovo;
*pnt=nuovo;
l_list *temp;
temp=(*l_h)->next;
free(*l_h);
*l_h=temp;
}
void libera(d_list **d, l_list **l, d_list **dp)
{
d_list *temp;
l_list *h;
int n;
temp=*d;
puts("Quale camera devi liberare?");
printf("La numero ");
scanf("%d",&n);
while(temp->info.n!=n)
{
temp=temp->next;
}
h=calloc(1,sizeof(l_list));
h->info.n=temp->info.n;
h->next=*l;
*l=h;
d_list *cur, *prev;
for (cur=*d, prev=NULL; cur!=NULL && cur->info.n!=n; prev=cur, cur=cur->next);
prev->next=cur->next;
*dp=prev;
free(cur);
}
void libera_t(d_list **d, l_list **l)
{
l_list *h;
d_list *temp;
temp=*d;
h=calloc(1,sizeof(l_list));
h->info.n=temp->info.n;
h->next=*l;
*l=h;
temp=(*d)->next;
free(*d);
*d=temp;
}
void visualizza_d(d_list *d)
{
if(d==NULL)
puts("Non ci sono capere occupate.");
else
{
puts("Camere occupate:");
while(d!=NULL)
{
printf("Numero camera: %d\n",d->info.n);
printf("Nome cliente: %s\n", d->info.nome);
d=d->next;
}
}
}
void visualizza_l(l_list *l)
{
if(l==NULL)
puts("Non ci sono capere libere.");
else
{
puts("Camere occupate:");
while(l!=NULL)
{
printf("Numero camera: %d\n",l->info.n);
l=l->next;
}
}
}
int main()
{
l_list *l_head, *l_punt;
d_list *d_head, *d_punt;
l_head=NULL;
d_head=NULL;
l_punt=calloc(1,sizeof(l_list));
crea_l_t(&l_head);
l_punt=l_head;
crea_l(&l_punt);
int sc;
while(sc!=5)
{
puts("Menu':\n1) Occupa stanza\n2) Libera stanza\n3) Visualizza camere occupate.\n4) Visualizza camere libere.\n5) Termina programma.");
scanf("%d",&sc);
switch(sc)
{
case 1: if(d_head==NULL){
ins_testa(&d_head,&l_head);
d_punt=d_head;
}
else
ins_mezzo(&d_punt,&l_head);
break;
case 2 : if(d_head->next!=NULL)
libera(&d_head, &l_head, &d_punt);
else
libera_t(&d_head, &l_head);
break;
case 3 : visualizza_d(d_head);
break;
case 4: visualizza_l(l_head);
}
}
return 0;
}