PDA

Visualizza la versione completa : [c] Problema con liste doppie


JamesD
23-09-2002, 18:58
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)



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 :dh: !!
Chi sa aiutare un povero disgraziato..:cry:

Ciao e grazie in anticipo:ciauz:

Andrea Simonassi
23-09-2002, 19:54
se *punLL NULL


(*punLL)->prec = aux;

da' errore di accesso.

JamesD
23-09-2002, 20:29
e in che modo possibile evitare questo problema?:confused:

Andrea Simonassi
23-09-2002, 21:07
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.

Loading