Array di liste

di il
17 risposte

Array di liste

Salve a tutti.
Avrei un dubbio che mi attanaglia da un paio di giorni e non sono riuscito a trovare una risposta in nessun sito. Volevo creare un vettore di liste . La struttura della lista è cosi fatta
typedef struct {
char nome[N];
char cognome[N];
char descrizione[N];
}TB_Lista;

struct nodo_lista {
TB_Lista info;
struct nodo_lista *next;
};
typedef struct nodo_lista NODO_Lista;
typedef NODO_Lista * P_Lista;

Ora in pratica vorrei creare un vettore (es. V con i un intero da me scelto in fase di esecuzione ) che mi punti ad una lista e al variare di i mi cambia la lista di destinazione.
Avevo anche pensato ad un P_Lista l ma proprio non mi funziona.
Molti mi hanno detto di fare un altra struct ma cosi non sarei fuori tema ? Non creerei una lista di lista ? So che hanno lo stesso funzionamento ma non andrei fuori tema ?

17 Risposte

  • Re: Array di liste

    Personalmente ho parecchi dubbi sulla tua spiegazione del problema. Dovresti essere più preciso e magari fare un esempio pratico con dei dati.

    Inoltre non capisco il "fuori tema" ... rispetto a quale tema? E chi ti dice che non devi andare "fuori tema"?
  • Re: Array di liste

    Per fare un esempio. La lista è formata cosi
    typedef struct{
    char codice_articolo[N];
    char descrizione[N];
    char reparto[N];
    int numero_pezzi_presenti;
    int prezzo_unitario;
    }TB_Lista;
    struct nodo_list{
    TB_Lista info;
    nodo_list *next;
    };
    typedef struct nodo_list NODO_Lista;
    typedef NODO_Lista * Lista;

    La generica Lista relativa all'' elemento i del vettore contiene tutti gli elementi tali che : un equazione da soddisfare ( in questo caso la somma di tutti le lettere di codice_articolo modulo 5 ).
    Quello che sto chiedendo fa parte di un compito che chiede l' implementazione con un vettore di liste.
    Grazie della risposta
  • Re: Array di liste

    Mi spiace ma non si capisce ancora il problema

    Crea un vettore di puntatori ... Non sai scriverlo? Qualcosa come

    P_Lista vlist[100]

    per 100 liste
  • Re: Array di liste

    Ti ho semplicemente letto il testo del compito.
    Comunque ti ringrazio del "suggerimento" ma ho già risolto. Il mio problema era nel definire il vettore dinamicamente con malloc.
    Grazie e buona serata
  • Re: Array di liste

    Ok ... potevi chiedere "come allocare dinamicamente il vettore ... " sarebbe stato tutto molto più chiaro ...

    Questa frase

    La generica Lista relativa all'' elemento i del vettore contiene tutti gli elementi tali che : un equazione da soddisfare ( in questo caso la somma di tutti le lettere di codice_articolo modulo 5 ).

    non c'entra nulla con l'allocazione dinamica, anzi, è pure ambigua ...

    In ogni caso, il vettore che ti ho mostrato è statico ma non allocarlo dinamicamente non è molto difficile ...
  • Re: Array di liste

    La locazione dinamica l' avevo specificata prima.
    "Ora in pratica vorrei creare un vettore (es. V con i un intero da me scelto in fase di esecuzione )".
    Comunque davvero ti ringrazio.
    Ho risolto cosi
    printf("Inserisci n:");
    scanf("%d",&n);
    P_Lista lt=(P_Lista)malloc(n*sizeof(P_Lista));
  • Re: Array di liste

    A questo punto meglio la calloc, così azzeri tutto ...
  • Re: Array di liste

    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #define N 5 
    #define FFLUSH while(getchar()!='\n')
    typedef struct {
    	int collocazione_magazzino;
    	char codice_prodotto[N];
    	unsigned int prezzo_unitario;
    	unsigned int numero_pezzi;
    }TB_Lista;
    
    struct nodolista{
    	TB_Lista info;
    	nodolista *next;
    };
    typedef struct nodolista NODO_Lista;
    typedef NODO_Lista * P_Lista;
    
    P_Lista InserOrd(P_Lista l, TB_Lista x){
    	P_Lista temp, p;
    	temp=(P_Lista)malloc(sizeof(NODO_Lista));
    	temp->info=x;
    	if(l==NULL){
    	temp->next=NULL;
    	l=temp;
    	}else{
    		if(strcmp(l->info.codice_prodotto,x.codice_prodotto)>0){
    			temp->next=l;
    			l=temp;
    		}else{
    			p=l;
    			while(p->next!=NULL){
    				if(strcmp(p->next->info.codice_prodotto,x.codice_prodotto)<0) p=p->next;
    				else break;
    			}temp->next=p->next;
    			p->next=temp;
    		}
    	 
    	} return (l);
    }
    
    void VisualTB(TB_Lista x){
    		printf("Collocazione magazzino: %d\n",x.collocazione_magazzino);
    		printf("Codice prodotto: %s\n",x.codice_prodotto);
    		printf("Prezzo unitario: %d\n",x.prezzo_unitario);
    		printf("Numero pezzi: %d\n",x.numero_pezzi);
    }
    void VisualLista(P_Lista l){
    	while(l->next!=NULL){
    		VisualTB(l->info);
    		l=l->next;
    	}
    }
    
    int main(){
    	int scelta,n,magazzino;
    	P_Lista l=NULL;
    	TB_Lista ele;
    	do{
    	printf("Scegleire operazione\n");
    	printf("1)Scegliere dimensione del vettore\n");
    	printf("2)Inserire un nuovo prodotto\n");
    	printf("3)Vendere un prodotto\n");
    	printf("4)Visualizzare elementi\n");
    	printf("0)FINE\n");
    	printf("--->");
    	scanf("%d",&scelta);
    	switch (scelta){
    		case 1:{printf("Dimensione vettore\n");
    				scanf("%d",&n);
    				l=(P_Lista)calloc(n,sizeof(NODO_Lista));
    				free(l);
    			break;
    		}
    		case 2:{printf("Inserire collocazione magazzino:\n");
    				scanf("%d",&ele.collocazione_magazzino);
    				printf("Inserire codice prodotto:\n");
    				scanf("%s",&ele.codice_prodotto);
    				printf("Inserisci prezzo unitario:\n");
    				scanf("%d",&ele.prezzo_unitario);
    				printf("Inserisci numero pezzi:\n");
    				scanf("%d",&ele.numero_pezzi);
    				InserOrd(l[ele.collocazione_magazzino],ele);
    				
    			break;
    		}
    		case 3:{
    			break;
    		}
    		case 4:{printf("Scegliere magazzino\n");
    				scanf("%d",&magazzino);
    				VisualLista(l[magazzino]);
    			break;
    		}
    		
    	}
    		
    		
    	}while(scelta!=0);
    	
    }
    Ho creato questo programma seguendo il tuo consiglio del calloc ma nel compilarlo mi spunta
    [Error] cannot convert 'NODO_Lista {aka nodolista}' to 'P_Lista {aka nodolista*}' for argument '1' to 'NODO_Lista* InserOrd(P_Lista, TB_Lista)' .
    Non riesco proprio a capire dove sia l' errore. Quel calloc non mi crea un vettore di puntatori ?
  • Re: Array di liste

    In realtà quando scrivi

    P_Lista lt=(P_Lista)malloc(n*sizeof(P_Lista));

    è sbagliato perché dovrebbe essere

    P_Lista *lt=(P_Lista *)malloc(n*sizeof(P_Lista));

    ovvero lt deve essere un puntatore a P_Lista
  • Re: Array di liste

    P_Lista *lt=NULL;
    lt=(P_Lista*)malloc(n*sizeof(P_Lista));
    InserOrd(lt[ele.collocazione_magazzino],ele);

    Mettendolo cosi mi compila ma al momento di inserire si blocca il programma.
    Ho provato a far puntare lt->l (ad una variabile di P_Lista) ma mi dice che [Error] 'NODO_Lista' has no member named 'l'
    Tecnicamente dovrebbe compilare cosi dato che lt punta ad un tipo P_Lista.
  • Re: Array di liste

    Intanto devi usare la calloc per azzerare tutti i puntatori allocati.

    Poi non capisco cosa ci faccia la

    free(l);

    subito dopo la calloc ... così l'allocazione non serve a nulla ...
  • Re: Array di liste

    Eh si. Non aveva molto senso effettivamente. levando il free(l) l' inserimento mi funziona.
    Ora non funziona il visualizza lista.
    La funzi
    ona è implementata cosi:
    void VisualTB(TB_Lista x){
    		printf("Collocazione magazzino: %d\n",x.collocazione_magazzino);
    		printf("Codice prodotto: %s\n",x.codice_prodotto);
    		printf("Prezzo unitario: %d\n",x.prezzo_unitario);
    		printf("Numero pezzi: %d\n",x.numero_pezzi);
    }
    void VisualLista(P_Lista l){
    	while(l->next!=NULL){
    		VisualTB(l->info);
    		l=l->next;
    	}
    }
    
    e la richiamo così:
    case 4:{printf("Scegliere magazzino\n");
    				scanf("%d",&magazzino);
    				VisualLista(lt[magazzino]);
    			break;
    p.s. ti ringrazio davvero dell' aiuto che mi stai fornendo.Grazie a te sto davvero capendo gli errori compiuti.
  • Re: Array di liste

    Nella Visualizzazione la while deve essere

    while(l){

    e nella chiamata all'inserimento non hai modificato il puntatore che pure restituisci con

    lt[ele.collocazione_magazzino] = InserOrd(lt[ele.collocazione_magazzino],ele);
  • Re: Array di liste

    Funziona alla perfezione. Certo se metto l->next con un solo valore mi va direttamente al NULL no ?
Devi accedere o registrarti per scrivere nel forum
17 risposte