Visualizzazione dei risultati da 1 a 4 su 4
  1. #1
    Utente di HTML.it L'avatar di JamesD
    Registrato dal
    Oct 2001
    Messaggi
    415

    [c] Problema con liste doppie

    O voi forumisti dalle ampie conoscenze saprete risolvere il seguente arcano (sarà sicuramente un errore del c@##o ma non ci cavo un ragno dal buco)

    codice:
    typedef struct cella * LIST;
    
    struct cella{
    	int cont;
    	LIST succ;
    	LIST prec;
    };
    
    void inser_dup(int x, LIST * punLL);
    void print (LIST LL);
    
    void main(){
    	LIST L=NULL;
    	int val=0;
    
    	while(val != 10000){
    		printf("\nInserisci un valore nella lista. 10000 per uscire\n");
    		scanf("%d", &val);
    		if (val!=10000)	inser_dup(val, &L);
    	}
    
    	print(L);
    }
    
    void inser_dup(int x, LIST * punLL){
    	LIST aux, scorri=NULL;
    
    	aux = (LIST) calloc (1, sizeof (struct cella));
    	aux->cont = x;
    
    	if((* punLL == NULL) || x < (* punLL)->cont){
    		aux->prec=NULL;
    		aux->succ = * punLL;
    		(* punLL)->prec = aux;//acces violation
    	}
    	else{
    		scorri = * punLL;
    		while((scorri != NULL) && (scorri->cont < x)){
    			scorri = scorri->succ;
    		}
    		(scorri->prec)->succ = aux;
    		aux->prec = scorri->prec;
    		scorri->prec = aux;
    		aux->succ = scorri;
    	}
    }
    Il mio problema è l'iserimento ordinato in una lista doppia. Ho da poco "scoperto" il mondo delle liste e quando si tratta di inserire valori in liste che puntano solo all'allocazione successiva non ci sono problemi! L'errore si genera in esecuzione e aprendo il debug mi dice che è "Access violation"!! Non so più dove sbattere la testa !!
    Chi sa aiutare un povero disgraziato..

    Ciao e grazie in anticipo

  2. #2
    se *punLL è NULL
    codice:
      (*punLL)->prec = aux;
    da' errore di accesso.

  3. #3
    Utente di HTML.it L'avatar di JamesD
    Registrato dal
    Oct 2001
    Messaggi
    415
    e in che modo è possibile evitare questo problema?

  4. #4
    codice:
    void inser_dup(int x, LIST * punLL){
    	LIST aux, scorri=NULL, scorri2;
    
    	aux = (LIST) calloc (1, sizeof (cella));
    	aux->cont = x;
    
    	if((* punLL == NULL)){
    		aux->prec=NULL;
    		aux->succ = NULL;		
    		*punLL = aux;
    		return;
    	}	
    	if(x < (* punLL)->cont)
    	{
    		aux->prec = NULL;
    		aux->succ = *punLL;
    		(*punLL)->prec = aux;
    		*punLL = aux;
    	}
    	else{
    		scorri = (*punLL)->succ;
    		scorri2 = *punLL;
    		while(scorri != NULL && scorri->cont < x)
    		{
    			scorri2 = scorri;
    			scorri = scorri->succ;
    		}
    		
    		aux->prec = scorri2;
    		aux->succ = scorri!=NULL?scorri:NULL;
    		if(scorri!=NULL)
    			scorri->prec = aux;				
    		
    		scorri2->succ = aux;
    	}
    }
    Codice brutto il mio, prova a fare di meglio.

    Ciao.

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.