Visualizzazione dei risultati da 1 a 10 su 10
  1. #1

    [C] Liste e altre strutture

    Sera! Non ho trovato un 3D per le presentazioni, ammesso che ci sia quindi mi presento qui. Sono Max e frequento la facoltà di Ing. Informatica. Non è il primo forum dove chiedo, ma penso sia uno dei migliori per affrontare questa tematica. Mi sto cimentando nel mio primo linguaggio, per scopi accademici quale il C. Confesso che ancora non trovo un riscontro pratico, ma penso sia un buon inizio per un neofita. Martedì ho un esame () e sto provando a esercitarmi su liste "semplici",liste di liste e Alberi(ancora questa struttura non l'ho sperimentata).

    Arrivo al dunque. Riesco a implementare la struttura (una lista, dove ogni nodo contiene un altra lista-lista interna-) ma ho difficoltà a implementare le funzioni richieste, quali caricamento da file, inserimento e stampa (il minimo indispensabile).
    Volevo chiedere un parere su un esercizio che richiede la gestione di autobus(lista primaria) e dei vari conducenti assegnati ad ogni autobus(liste secondarie).

    Ho impostato cosi la struttura dati:

    codice:
    #include<stdio.h>#include<string.h>
    #include<stdlib.h>
    #define max 30
    
    
    typedef struct s_cond{
    	char nome[max];
    	int giorni,percorso;
    }cond;
    
    
    typedef struct s_nodo_cond{
    	cond info;
    	struct s_nodo_cond *next;
    }nodo_cond;
    
    
    typedef nodo_cond *lista_cond;
    
    
    typedef struct s_auto{
    	char targa[max];
    	int posti,km;
    }bus;
    
    
    typedef struct s_nodo_bus{
    	bus info;
    	lista_cond *punt_interno;
    	struct s_nodo_bus *next;
    }nodo_bus;
    
    
    typedef nodo_bus *lista_bus;
    e cosi le prime funzioni:

    codice:
    void inserimento_bus(lista_bus *lis,bus b){	lista_bus aux=NULL;
    	aux=(lista_bus)malloc(sizeof(nodo_bus));
    	aux->info=b;
    	aux->punt_interno=NULL;
    	aux->next=*lis;
    	aux=(*lis);
    }
    
    
    void inserimento_cond(lista_cond *lis,cond d){
    	lista_cond aux=NULL;
    	aux=(lista_cond)malloc(sizeof(nodo_cond));
    	aux->info=d;
    	aux->next=*lis;
    	*lis=aux;
    }
    
    
    
    
    int caricamento(lista_bus *lis){
    	FILE *fp;
    	bus b;
    	cond c;
    	fp=fopen("archivio.txt","r");
    	if(fp==NULL){
    		perror("");
    		exit(1);
    	}
    	while(fscanf(fp,"%s%d%d",b.targa,&b.posti,&b.km) ==3){
    		inserimento_bus(lis,b);
    		//inserimento_cond((*lis)->punt_interno,c);
    	}
    	fclose(fp);
    }
    
    
    
    
    void stampa_cond(lista_cond lis){
    	while(lis!=NULL){
    		printf("\nNome: %s",lis->info.nome);
    		printf("\nGiorni: %d",lis->info.giorni);
    		printf("\nPercorso: %d",lis->info.percorso);
    		lis=lis->next;
    	}
    }
    
    
    void stampa_bus(lista_bus lis){
    	lista_bus aux;
    	aux=lis;
    	while(aux!=NULL){
    		printf("\nTarga: %s",aux->info.targa);
    		printf("\nPosti: %d",aux->info.posti);
    		printf("\nKm: %d",aux->info.km);
    		//stampa_cond(aux->punt_interno);
    		aux=aux->next;
    	}
    	}
    e per completezza il main:
    codice:
    int main(){	lista_bus lista_bus=NULL;
    	lista_cond lista_cond=NULL;
    	int scelta;
    	do{
    		printf("\n1)Caricamento");
    		printf("\n2)Stampa");
    		printf("\n\n\tScelta: ");
    		scanf("%d",&scelta);
    		
    		switch(scelta){
    		case 1: caricamento(&lista_bus);
    			break;
    		case 2: stampa_bus(lista_bus);
    			break;
    		}
    	}while(scelta!=0);
    }
    Giusto l'essenziale per vedere se l'inizio è corretto, ma quando avvio il debug e procedo con la selezione delle opzioni, non vengono eseguite, o meglio carico ma non stampo.

    E' la strada giusta?

  2. #2
    Up! Suggerimenti?

  3. #3
    Ora lo provo e ti dico...
    Ultima modifica di FedeV92; 05-10-2015 a 20:35

  4. #4
    Allora la funzioni "inserimento_bus" deve ritornare una variabile di tipo lista_bus perché dopo l'inserimento devi sapere quale nodo stampare. Nel tuo codice la funzione non ritornava nulla, ed è per questo che non stampavi nulla. Fai la stessa cosa per la funzione "inserimento_cond".

    Nella funzione "caricamento" metti una condizione per decidere quale delle due struct caricare e nel main ti regoli ti conseguenza per stampare.

    Per qualunque chiarimento sono qui

    codice:
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define max 30
    
    
    //////////////Definizione STRUCT
    
    
    typedef struct s_cond{
        char nome[max];
        int giorni,percorso;
    }cond;
    
    
    
    
    typedef struct s_nodo_cond{
        cond info;
        struct s_nodo_cond *next;
    }nodo_cond;
    
    
    
    
    typedef nodo_cond *lista_cond;
    
    
    
    
    typedef struct s_auto{
        char targa[max];
        int posti,km;
    }bus;
    
    
    
    
    typedef struct s_nodo_bus{
        bus info;
        lista_cond *punt_interno;
        struct s_nodo_bus *next;
    }nodo_bus;
    
    
    
    
    typedef nodo_bus *lista_bus;
    
    
    
    
    /////////////////////////////////////////////////// FUNZIONI
    
    
    lista_bus inserimento_bus(lista_bus *lis,bus b){
        lista_bus aux=NULL;
        aux=(lista_bus)malloc(sizeof(nodo_bus));
        aux->info=b;
        aux->punt_interno=NULL;
        aux->next=*lis;
        return aux;
    
    
    }
    
    
    
    
    lista_cond inserimento_cond(lista_cond *lis,cond d){
        lista_cond aux=NULL;
        aux=(lista_cond)malloc(sizeof(nodo_cond));
        aux->info=d;
        aux->next=*lis;
        return aux;
    }
    
    
    
    
    
    
    
    
    lista_bus caricamento(lista_bus *lis){
        FILE *fp;
        bus b;
        cond c;
        lista_bus point=NULL;
        fp=fopen("archivio.txt","r");
        if(fp==NULL){
            perror("");
            exit(1);
        }
        while(fscanf(fp,"%s%d%d",b.targa,&b.posti,&b.km) ==3){
              point=inserimento_bus(lis,b);
            //inserimento_cond((*lis)->punt_interno,c);
        }
        fclose(fp);
    
    
        return point;
    }
    
    
    
    
    
    
    
    
    void stampa_cond(lista_cond lis){
        while(lis!=NULL){
    
    
    
    
            printf("\nNome: %s",lis->info.nome);
            printf("\nGiorni: %d",lis->info.giorni);
            printf("\nPercorso: %d",lis->info.percorso);
            lis=lis->next;
        }
    }
    
    
    
    
    void stampa_bus(lista_bus lis)
    {
        lista_bus aux=lis;
    
    
        while(aux!=NULL){
    
    
            printf("\nTarga: %s",aux->info.targa);
            printf("\nPosti: %d",aux->info.posti);
            printf("\nKm: %d",aux->info.km);
            //stampa_cond(aux->punt_interno);
            aux=aux->next;
        }
        }
    
    
        ////////// MAIN
    
    
        int main(){
        lista_bus lista_bus=NULL;
        lista_cond lista_cond=NULL;
        int scelta;
        do{
            printf("\n1)Caricamento");
            printf("\n2)Stampa");
            printf("\n\n\tScelta: ");
            scanf("%d",&scelta);
    
    
            switch(scelta){
            case 1:
                lista_bus=caricamento(&lista_bus);
                break;
            case 2: stampa_bus(lista_bus);
    
    
                break;
            }
        }while(scelta!=0);
    }
    Ultima modifica di MItaly; 05-10-2015 a 21:45 Motivo: %s~\[\(/\?\)quote\]~[\1code]~gi

  5. #5
    Ciao! Grazie per avermi risposto, e per la pazienza nell'aver testato
    Sulla funzione di inserimento ho avuto qualche dubbio. Ho provato a implementare la funzione di inserimento per le liste "semplici", lineari e il parametro da restituire seppur un void non influiva. Il problema più grande è nel caricamento, perchè il file da caricare è unico, le prime tre righe devono essere caricate nel nodo della lista esterna(b.informazione), e le altre 3 sono riferite al conducente, quindi c.informazione. Ho fatto due funzioni di inserimento come hai visto una per bus, una per conducente e le richiamo subito dopo la lettura del file, nella funzione di caricamento stessa. Per semplificarmi il tutto, invece di fare una funzione per il caricamento, posso farne due?
    Mi spiego, come posso leggere solo le prime 3 per inserire in una lista e le altre 3 nell'altra?

    codice:
    lista_bus caricamento(lista_bus *lis){    FILE *fp;
        bus b;
        cond c;
        lista_bus point=NULL;
        fp=fopen("archivio.txt","r");
        if(fp==NULL){
            perror("");
            exit(1);
        }
    	while(fscanf(fp,"%s%d%d%s%d%d",b.targa,&b.posti,&b.km,c.nome,&c.percorso,&c.giorni) != EOF){
              point=inserimento_bus(lis,b);
    		  inserimento_cond((*lis)->punt_interno,c);
        }
        fclose(fp);
    
    
    
    
        return point;
    }
    questo è quello che avevo immaginato all'inizio.

    questo è il tipo di file da caricare:

    AX111CX Targa
    54
    Numero di posti
    10435
    km
    Paperino
    nome del conduttore (senza spazi bianchi)
    2
    numero di giorni
    1 tipo di percorso[1 urbano 0 extraurbano]

  6. #6
    Allora non ho avuto bisogno di fare un'altra funzione, bastava usare una variabile esterna per appoggio. Ti posto il codice, con questo riesci a stampare tutto. (MItaly sicuramente modificherai il quote, mi puoi indirizzare alla pagina dove si spiega come postare i codici? Grazie in anticipo).


    codice:
    #include<stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #define max 30
    
    //////////////Definizione STRUCT
    
    typedef struct s_cond{
        char nome[max];
        int giorni,percorso;
    }cond;
    
    
    typedef struct s_nodo_cond{
        cond info;
        struct s_nodo_cond *next;
    }nodo_cond;
    
    
    typedef nodo_cond *lista_cond;
    
    
    typedef struct s_auto{
        char targa[max];
        int posti,km;
    }bus;
    
    
    typedef struct s_nodo_bus{
        bus info;
        lista_cond *punt_interno;
        struct s_nodo_bus *next;
    }nodo_bus;
    
    
    typedef nodo_bus *lista_bus;
    
    lista_cond ext=NULL; //Variabile esterna d'appoggio
    
    
    
    /////////////////////////////////////////////////// FUNZIONI
    
    lista_bus inserimento_bus(lista_bus *lis,bus b){
        lista_bus aux=NULL;
        aux=(lista_bus)malloc(sizeof(nodo_bus));
        aux->info=b;
        aux->punt_interno=NULL;
        aux->next=*lis;
        return aux;
    
    }
    
    
    lista_cond inserimento_cond(lista_cond lis,cond d){
        lista_cond aux=NULL;
        aux=(lista_cond)malloc(sizeof(nodo_cond));
        aux->info=d;
        aux->next=lis;
        return aux;
    }
    
    
    
    
    lista_bus caricamento(lista_bus *lis){
        FILE *fp;
        bus b;
        cond c;
        lista_bus point=NULL;
        lista_cond cond=NULL;
        fp=fopen("archivio.txt","r");
        if(fp==NULL){
            perror("");
            exit(1);
        }
        while(fscanf(fp,"%s%d%d%s%d%d",b.targa,&b.posti,&b.km,c.nome,&c.percorso,&c.giorni) != EOF)
        {
    
            point=inserimento_bus(lis,b);
    
            ext=inserimento_cond(cond,c);
    
    
    
        }
        fclose(fp);
    
    
        return point;
    
    
    
    }
    
    
    
    
    void stampa_cond(lista_cond lis){
        while(lis!=NULL){
    
    
            printf("\nNome: %s",lis->info.nome);
            printf("\nGiorni: %d",lis->info.giorni);
            printf("\nPercorso: %d",lis->info.percorso);
            lis=lis->next;
        }
    }
    
    
    void stampa_bus(lista_bus lis)
    {
        lista_bus aux=lis;
    
        while(aux!=NULL){
    
            printf("\nTarga: %s",aux->info.targa);
            printf("\nPosti: %d",aux->info.posti);
            printf("\nKm: %d",aux->info.km);
            //stampa_cond(aux->punt_interno);
            aux=aux->next;
        }
        }
    
        ////////// MAIN
    
        int main(){
        lista_bus lista_bus=NULL;
        int scelta;
        int n=0,y=1;
        do{
            printf("\n1)Caricamento");
            printf("\n2)Stampa");
            printf("\n\n\tScelta: ");
            scanf("%d",&scelta);
    
            switch(scelta){
            case 1:
    
                 lista_bus=caricamento(&lista_bus);
                 break;
    
            case 2:
    
                stampa_bus(lista_bus);
                stampa_cond(ext);
    
                break;
            }
        }while(scelta!=0);
    }
    Ultima modifica di LeleFT; 07-10-2015 a 08:56 Motivo: Modificati tag QUOTE con tag CODE

  7. #7
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,304
    Per postare i codici, invece di scrivere QUOTE basta scrivere CODE:


    [CODE]
    ... // codice
    [/CODE]


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

  8. #8
    Ok grazieee

  9. #9
    Ti ringrazio! Non avevo ancora provato in questo modo, proverò a riscriverlo cosi. Quindi il tipo restituito dalla funzione di inserimento deve esser obbligatoriamente di tipo lista?

    OT P.s= Ho passato lo scritto, domani ho l'orale e gli algoritmi di ordinamento non mi entrano proprio in testa

  10. #10
    Se vuoi stampare la lista si. Puoi far restituire alla lista il risultato che ti fa più comodo.

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 © 2024 vBulletin Solutions, Inc. All rights reserved.