Pagina 1 di 3 1 2 3 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 25
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218

    [C] - Lista - Non mi aggancia i nodi nuovi.

    codice:
    void in_coda(BIN bin, LISTA* l){
    	if(l==NULL){
    	LISTA aux=calloc(1, sizeof(struct CELLA));
    	aux->info.chiave=bin.chiave;
    	aux->info.valore=bin.valore;
    	aux->next=NULL;
    	l=aux;
    	}
    	else{
    		printf("l non nulla...\n");
    		in_coda(bin, (*l)->next);
    	}
    }
    Non mi va mai nel ramo else.
    Sapete dirmi perchè? Non mi sembra di aver fatto grossi errori.

  2. #2
    Utente di HTML.it L'avatar di andbin
    Registrato dal
    Jan 2006
    residenza
    Italy
    Messaggi
    18,284

    Re: [C] - Lista - Non mi aggancia i nodi nuovi.

    Originariamente inviato da TheBestNeo
    codice:
    l=aux;
    Sapete dirmi perchè? Non mi sembra di aver fatto grossi errori.
    Uno sì, concettuale. Assegni 'aux' a 'l' ma quel 'l' è solo una variabile locale che contiene una copia del puntatore passato dal chiamante. Quindi impostare quel 'l' non ha alcun effetto per il chiamante.
    Andrea, andbin.devSenior Java developerSCJP 5 (91%) • SCWCD 5 (94%)
    java.util.function Interfaces Cheat SheetJava Versions Cheat Sheet

  3. #3
    dovresti allegarci un programma all'osso compilabile che si possa provare, incluse le definizioni di LISTA, CELLA etc

    Per esempio l per te è un puntatore a LISTA, ma aux è una istanza di LISTA, il compilatore dovrebbe darti errore. Inoltre come ti diceva andbin puoi modificare quello che è puntato da l ma una modifica ad l non ha effetto.
    La funzione la scriverei come

    LISTA * in_coda(BIN bin, LISTA* l);

    che ritorna il nuovo nodo creato e la chiamata
    l = in_coda(bin, l);

    ma le informazioni che ci hai dato non sono sufficienti per una analisi più dettagliata

    ciao
    sergio

  4. #4
    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 in_coda(BIN bin, LISTA* l);
    void mk_bintab(BIN* input, LISTA *tab);
    LISTA testa(LISTA* l);
    void print(LISTA *l);
    
    int main(){
    
    LISTA array[MAXNUM]={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);
    //printf("%d\n", (LISTA)testa((LISTA*)array[1])->info.chiave);
    /*LISTA a=calloc(1, sizeof(struct CELL));
    a= testa(array[0]);
    printf("%d", a->info.chiave);*/
    print(array);
    }
    
    LISTA testa(LISTA* l){
    LISTA aux= calloc(1, sizeof(struct CELLA));	
    	if(l!=NULL){
    		aux=(LISTA)l;
    		l=(*l)->next;
    	}
    return aux;
    }
    
    
    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* l){
    	if(l==NULL){
    	LISTA aux=calloc(1, sizeof(struct CELLA));
    	aux->info.chiave=bin.chiave;
    	aux->info.valore=bin.valore;
    	aux->next=NULL;
    	*l=aux;
    	printf("%p, %p\n", *l, l);
    	//printf("%d %c\n", (*l)->info.chiave, aux->info.valore);
    	}
    	else{
    		printf("l non nulla...\n");
    		in_coda(bin, (*l)->next);
    		
    	}
    	
    }
    
    
    
    void print(LISTA *l){
    int i;
    	for(i=0;i<MAXNUM;i++){
    		if(l[i]==NULL){	
    			printf("NULL\n");
    		}		
    		else{
    			printf("%d\n%c\n", l[i]->info.chiave, l[i]->info.valore);
    			print(l[i]->next);
    		}
    	}
    }

  5. #5
    faccio un po' fatica a seguire la tua logica, io la scriverei così
    codice:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int BOOL;
    
    typedef struct BIN {
    	int chiave;
    	char valore;
    } BIN;
    
    typedef struct CELLA {
    	BIN info;
    	struct CELLA * next;
    } CELLA ;
    
    
    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);
    
    	}
    }
    
    void print(CELLA *l){
    
    	while (l) {
    		printf("%d\n%c\n", l->info.chiave, l->info.valore);
    		l=l->next;
    	}
    }
    
    int main ()
    {
    
    	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';
    
    	CELLA *lista = in_coda(input[0], NULL);
    	// inserisci i restanti elementi
    	int i;
    	for (i = 1; i <8; i++)
    		in_coda(input[i], lista);
    	// stampa la lista
    	print(lista);
    }
    ciao
    sergio

  6. #6
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    Cerco di spiegartela la mia logica.

    Ho un array di puntatori a CELLA.

    Questi devono puntare al primo elemento della lista, quindi inizialmente a null.
    Poi ho l'array di BIN, devo scorrerlo e mettere il valore nel posto giusto, seguendo la chiave (se la chiave è ad esempio 2, devo agganciare la nuova cella nella posizione 2 - quindi 1 dell'array -).

    La funzione in coda deve fare questo algoritmo;
    Prendi il puntatore al primo elemento della lista.
    Se è NULL, crea una nuova cella e agganciala.
    Se non è nulla, cerca ricorsivamente l'ultima cella.

    Lascia perdere la funzione TESTA che l'ho scritta nel caso poi ne avessi avuto bisogno, non perchè mi servisse realmente.

  7. #7
    compila e prova quello che ti ho allegato che penso che faccia quello che vuoi tu.

    Nel tuo listato ci sono degli errori, uno su cui mi cade l'occhio è
    *l=aux;
    dove referenzi l che potrebbe essere NULL, e quindi darti errore a runtime.

    Una nota: normalmente è meglio non utilizzare funzioni ricorsive per le operazioni su liste in quanto spesso risultano meno chiare e sono più avide di memoria. Il classico scorrimento è while (nodo=nodo->next) ;

    ciao
    sergio

  8. #8
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    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!

  9. #9
    Non ho letto il codice: mi son fermato quando ho visto che usi l'identificatore "l" -> ILLEGGIBILE ;-)

  10. #10
    Utente di HTML.it
    Registrato dal
    Apr 2007
    Messaggi
    218
    Cioè? Potresti spiegare un pochino meglio?

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.