Array di liste

di Anonimizzato18676 il
17 risposte
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

  • 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"?
  • 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
  • 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
  • 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
  • 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 ...
  • 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));
  • A questo punto meglio la calloc, così azzeri tutto ...
  • #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 ?
  • 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
  • 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.
  • 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 ...
  • 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.
  • 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);
  • 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