Visualizzazione dei risultati da 1 a 10 su 10

Discussione: [C] Aiuto lista

Visualizzazione discussione

  1. #6
    Utente di HTML.it L'avatar di filips
    Registrato dal
    Sep 2011
    residenza
    Seconda stella a destra (questo e' il cammino)
    Messaggi
    155
    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;
    }
    Ultima modifica di filips; 05-09-2016 a 07:42
    Per fare un tavolo ci vuole un fiore.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.