Pagina 2 di 3 primaprima 1 2 3 ultimoultimo
Visualizzazione dei risultati da 11 a 20 su 25
  1. #11
    Originariamente inviato da TheBestNeo
    Cioè? Potresti spiegare un pochino meglio?
    Il carattere "l" si confonde con "1", con "|" e con "I".
    Identificatori di quel genere (ad esempio anche "O" che si confonde con "0") vengono generalmente usati per "offuscare" il codice sorgente con lo scopo di renderlo "illeggibile" ad un essere umano.

    Supponendo che il tuo scopo non sia quello di "offuscare" il tuo codice sorgente, anziché utilizzare "l" come identificatore, potresti usare un qualcosa di simile a "theList".

  2. #12
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    #define MAXNUM 3
    
    typedef struct CELLA *LISTA;
    
    typedef struct BIN{
    	int chiave;
    	char valore;
    }BIN;
    
    typedef struct CELLA{
    	BIN info;
    	LISTA* next;
    }CELLA;
    
    
    
    
    void mk_bintab(BIN* input, LISTA *tab);
    void in_coda(BIN bin, LISTA* testa);
    void print(LISTA *l);
    
    int main(){
    
    LISTA array[MAXNUM]={NULL, NULL, NULL};
    
    BIN input[8];
    input[0].chiave=2;
    input[0].valore='A';
    input[1].chiave=1;
    input[1].valore='B';
    input[2].chiave=1;
    input[2].valore='C';
    input[3].chiave=3;
    input[3].valore='D';
    input[4].chiave=2;
    input[4].valore='E';
    input[5].chiave=1;
    input[5].valore='F';
    input[6].chiave=3;
    input[6].valore='G';
    input[7].chiave=2;
    input[7].valore='H';
    mk_bintab(input, array);
    
    print(array);
    }
    
    void mk_bintab(BIN* input, LISTA *tab){
    int i;
    	for(i=0;i<8;i++){
    		in_coda(input[i], (LISTA*)tab[input[i].chiave-1]);
    	}	
    }
    
    void in_coda(BIN bin, LISTA* testa){
    	while(testa!=NULL){
    	printf("Testa non nulla...\n");
    	testa=(*testa)->next;
    	}
    	printf("Testa nulla...\n");
    	LISTA aux=(LISTA) calloc(1, sizeof(struct CELLA));
    	aux->info.chiave=bin.chiave;
    	aux->info.valore=bin.valore;
    	aux->next=NULL;
    	testa=aux;
    }
    
    
    
    void print(LISTA *l){
    int i;
    	for(i=0;i<MAXNUM;i++){
    		while(l[i]!=NULL){	
    			printf("%d\n%c\n", l[i]->info.chiave, l[i]->info.valore);
    			l[i]=l[i]->next);
    		}		
    			printf("NULL\n");
    	}
    }
    Nella funzione che crea problemi l'ho sostituito. Provvederò nelle altre...

  3. #13
    Originariamente inviato da TheBestNeo
    Non lo fa, quello che devo fare io è l'ordinamento tramite algoritmo binsort.

    *l=aux è sbagliato, era una prova mia.
    Ho messo l=aux, il problema rimane cmq, non mi aggancia le celle!
    non vedo dove usi binsort.

    Comunque anche la versione nuova è sbagliata

    testa=aux;

    non ha l'effetto che tu desideri perchè modifica una copia del puntatore.

    Inoltre non capisco perchè hai bisogno di un vettore di puntatori a CELLA. Infine il membro next di CELLA deve essere un puntatore a CELLA.

    Devi riguardarti la logica del programma oppure chiariscici le consegne che hai.
    ciao
    sergio

  4. #14
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    L'esercizio che devo fare è così.

    Ho un array di puntatori a cella.
    3 in questo caso.
    Ognuno di questi 3 puntatori punta ad una lista.
    Nella prima lista devo mettere i BIN con valore "chiave"=1.

    Sto cercando di implementarlo in un altro modo.

    Creo una variabile di tipo puntatore a cella. La chiamo aux.
    Faccio aux=head, così aux punterà al primo elemento della lista.
    Se aux!= NULL allora cerco in quelle successive (aux->next).
    Altrimenti creo una nuova cella.

    Così logicamente va bene?

  5. #15
    tanto per iniziare non devi utilizzare promisquamente CELLA con LISTA.
    Potresti anche dare un nome più significativo a CELLA, come per esempio ELEMENTO, NODO in quanto elemento o nodo della tua lista linkata.
    La definizione di CELLA va bene la prima che hai dato
    codice:
    typedef struct CELLA {
    	BIN info;
    	struct CELLA * next;
    } CELLA ;
    dove next punta all'elemento successivo della lista linkata. Quando next è NULL la lista linkata è finita.

    Per aggiungere un nuovo elemente utilizza la funzione sotto, o una analoga che ti soddisfi. Questa funzione riceva i dati e la testa della lista a cui appendere i nuovi dati e ritorna un puntatore alla testa della lista. Se passi NULL crea la testa della lista,
    codice:
    CELLA * in_coda(BIN bin, CELLA* testa){
    
    	// se non esiste inizializza la lista
    	if (!testa) {
    		CELLA *aux = (CELLA *) malloc(sizeof(CELLA));
    		aux->info.chiave=bin.chiave;
    		aux->info.valore=bin.valore;
    		aux->next = NULL;
    		return (aux);
    	}
    	else {
    		// aggiungi l'elemento successivo
    		CELLA * n=testa;
    
    		// cerca l'ultimo nodo
    		while (n->next) n = n->next;
    
    		// crea un nuovo nodo
    		CELLA *aux = (CELLA *) malloc(sizeof(CELLA));
    		aux->info.chiave=bin.chiave;
    		aux->info.valore=bin.valore;
    		n->next = aux;
    
    		return (testa);
    
    	}
    }
    con
    codice:
    	CELLA *testa = in_coda(bin, NULL);
    creai il primo elemento
    con
    codice:
    	in_coda(bin, testa);
    aggiungi gli elementi successivi in coda.

    Se ti serve puoi crearti un vettore di CELLA o un vettore di puntatori a CELLA che ti permetta di manipolare le liste che hai creato ma sempre cercando di mantenere chiaro il flusso del programma.
    ciao
    sergio

  6. #16
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    codice:
    void add(BIN bin, LIST head){
    	if (head==NULL) {
      			head = (LIST)calloc(1, sizeof(struct CELL));
      			head->info.key = bin.key;
      			head->info.value = bin.value;
      			head->next = NULL;
    			
    	}
    	else{
    		LIST aux=head;
    		while(aux!=NULL){
    			printf("Nodo non nullo.\n");
    			aux=aux->next;
    		}
    		printf("Nodo nullo. Aggiungo...!\n");
    		aux= calloc(1, sizeof(struct CELL));
    		aux->info.key=bin.key;
    		aux->info.value=bin.value;
    		aux->next=NULL;
    	}
    	
    }
    Ho fatto questa funzione, ma la chiamata a questa gli passa sempre null.
    Vuol dire che non aggancia le celle.
    Perdonami per le definizioni dei nomi, abitudine perchè solitamente facciamo così.
    il tipo LIST è un CELL*.
    Mi sembra di aver fatto come te all'incirca, ma non capisco perchè non aggiunga i nodi.
    Nel caso head==null, gli ho detto di allocare la memoria in corrispondenza della memoria puntata da quel puntatore e di inizializzare i valori. Ma non lo fa.

  7. #17
    è ancora pasticciato
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    // CELL sarà il vecchio CELLA e BIN rimarrà uguale
    typedef struct BIN {
    	int key;
    	char value;
    } BIN;
    
    typedef struct CELL {
    	BIN info;
    	struct CELL * next;
    } CELL ;
    
    // suppongo che sia un puntatore a CELL
    typedef CELL * LIST ;
    
    
    /*
    	non puoi assegnare un valore a head
    	e averlo tal quale nel chiamante 
    	perchè head è a tutti gli effetti
    	una variabile locale.
    	per ottenere il nuovo nodo devi farlo
    	ritornare dalla funzione
    	quindi sostituisci
    void add(BIN bin, LIST head){
    */
    LIST add (BIN bin, LIST head){
    	if (head==NULL) {
      			head = (LIST)calloc(1, sizeof(struct CELL));
      			head->info.key = bin.key;
      			head->info.value = bin.value;
      			head->next = NULL;
    			// qui aggiungi i return
    			return head;
    	}
    	else{
    /*
    		questo confonde
    		LIST aux=head;
    		while(aux!=NULL){
    		inoltre devo controllare
    		head->next in modo che
    		in head alla fine
    		ho il nodo a cui legare
    		il nuovo elemento
    */
    		// copio head e lavoro con la copia
    		// così posso ritornare il 
    		// valore di head dalla funzione
    		LIST nodo = head;
    		while(nodo->next != NULL){
    
    /*
    			messo qui lo stampa per ogni nodo
    			printf("Nodo non nullo.\n");
    */
    			nodo = head->next;
    		}
    /*
    		il nodo è non nullo qui
    		printf("Nodo nullo. Aggiungo...!\n");
    */
    		printf("Nodo non nullo.\n");
    		
    // ok creo un nuogo nodo da appendere
    		LIST aux= calloc(1, sizeof(struct CELL));
    		aux->info.key = bin.key;
    		aux->info.value = bin.value;
    		aux->next = NULL;
    // lo devo legare alla lista
    		nodo->next = aux;
    		// ritorno il nodo testa, se serve
    		return (head);
    
    	}
    	
    } 
    
    void print(LIST head){
    
    	while (head) {
    		printf("%d\n%c\n", head->info.key, head->info.value);
    		head=head->next;
    	}
    }
    
    
    // facciamo una prova
    int main () {
    	BIN bin;
    	bin.key=2;
    	bin.value='A';
    
    	BIN altro_bin;
    	altro_bin.key=3;
    	altro_bin.value='B';
    
    	LIST testa = add(bin, NULL);
    	add(altro_bin, testa);
    
    	print(testa);
    
    	return (0);
    }
    ti aggiungo il risultato di quello che ti ho allegato sul mio sistema
    [sergio@localhost prove_c]$ gcc lista2.c
    [sergio@localhost prove_c]$ ./a.out
    Nodo non nullo.
    2
    A
    3
    B
    [sergio@localhost prove_c]$

    ciao

  8. #18
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    non puoi assegnare un valore a head
    e averlo tal quale nel chiamante
    perchè head è a tutti gli effetti
    una variabile locale.
    per ottenere il nuovo nodo devi farlo
    ritornare dalla funzione
    quindi sostituisci
    Ho capito. Se volessi invece passare il riferimento di head invece che il valore e modificare l'head del chiamante come dovrei fare?

  9. #19
    lo puoi fare ma rendi il programma un po' più difficile da seguire.
    In questo caso devi passare un puntatore la LIST
    codice:
    typedef LIST * PLIST;
    la tua add avrebbe come prototype
    codice:
    void add (BIN bin, PLIST p_head);
    tutto andrà però modificato di conseguenza.
    Per ottenere la tua lista devi dereferenziare PLIST

    LIST head = *p_head;

    e così via.
    Però, mi ripeto, il programma diventa più difficile da manutenere e da leggere, ed è più facile fare degli errori se non si ha troppa dimistichezza nel maneggiare i puntatori.

    Comunque prova a buttarlo giù che gli do' una occhiata.
    ciao
    sergio

  10. #20
    Originariamente inviato da TheBestNeo
    Ho capito. Se volessi invece passare il riferimento di head invece che il valore e modificare l'head del chiamante come dovrei fare?
    gli passi l'indirizzo utlizzando "&" e lo dereferenzi con "*"
    ;-)

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