PDA

Visualizza la versione completa : [C] inserimento lista ordinata - problema scorrere lista


rosencrruetz
04-01-2015, 11:57
Buongiorno a tutti,
il programma che dovrei realizzare deve creare una lista ordinata in modo decrescente, pian piano che l'utente inserisce i dati. I nodi hanno una struttura chiamata nodo e composta da un nome, un numero reale e ovviamente il puntatore al nodo successivo.

Il pezzo di codice successivo quello relativo all'inserimento in mezzo alla lista.

p nodo iniziale
temp ausiliario, lo uso per memorizzare il dato appena inserito e per scorrere la lista.
Ho inserito un indice (i) e dei debug.
Inserendo come dati:
roma 5
milano 2

Il programma stampa
1 (prima printf per i)
entra qui
... (printf per tutti i passaggi)
entra qui10
1 (nuova printf per i prima che ricominci il ciclo)

Subito dopo crasha. Non capisco dov' il problema nello scorrere la lista (condizione del while? temp=temp->next; in fondo? qualche indirizzamento sbagliato?)

Grazie mille per l'aiuto che potrete darmi






temp = (struct nodo*)malloc(sizeof(nodo));
strcpy(temp->nome, buffer);
printf("Inserire il valore di concentrazione di inquinante:\n");
scanf("%lf", &temp->dato);
temp->next=NULL;
if (p==NULL) //se la lista e' vuota
{
p=(struct nodo*)malloc(sizeof(nodo));
strcpy(p->nome, temp->nome);
p->dato=temp->dato;
p->next=NULL;
}
else //se la lista non e' vuota
{
temp->next=p;
i=0;
while (temp->next!=NULL) //finche' non termina la lista
{
i++;
printf("%d\n", i);
printf("entra qui\n");
if (temp->next->dato<temp->dato) //se il nuovo dato e' maggiore dell'attuale massimo
{
printf("entra qui2\n");
nuovo=malloc(sizeof(struct nodo));
strcpy(nuovo->nome,temp->nome);
nuovo->dato=temp->dato;
printf("%lf\n", nuovo->dato);
nuovo->next=p;
temp->next=NULL;
}
else //se invece non e' il massimo
{
printf("entra qui3\n");
nuovo=malloc(sizeof(struct nodo));
printf("entra qui4\n");
strcpy(nuovo->nome,temp->nome);
printf("entra qui5\n");
nuovo->dato=temp->dato;
printf("entra qui6\n");
p->next=nuovo;
printf("entra qui7\n");
nuovo->next=NULL;
printf("entra qui8\n");
temp->next=NULL;
printf("entra qui9\n");
}
temp=temp->next; //scorro la lista verso il prossimo elemento
printf("entra qui10\n");
printf("%d\n", i);
}

Questo solo un estratto del programma, l'inserimento del primo elemento in testa alla lista vedo che funziona

Scara95
06-01-2015, 01:13
temp = (struct nodo*)malloc(sizeof(struct nodo)); strcpy(temp->nome, buffer);
printf("Inserire il valore di concentrazione di inquinante:\n");
scanf("%lf", &temp->dato);
temp->next = NULL;
if (p==NULL) //se la lista e' vuota
{
p=temp;
}
else //se la lista non e' vuota
{
if(temp->dato > p->dato) {
temp->next = p;
}
else while (p->next!=NULL) //finche' non termina la lista
{
if (temp->dato > p->next->dato) //se il nuovo dato e' maggiore dell'elemento successivo nella lista
{
temp->next = p->next;
p->next = temp;
}
else //se non maggiore consideriamo l'elemento successivo
{
p = p->next;
}
}
if(p->next == NULL) { //siamo arrivati alla fine della lista senza inserire l'elemento
p->next = temp;
}
}
ti ho corretto l'inserimento.
A dire il vero non sono sicuro che sia corretto visto che torno da 5 ore di macchina e non l'ho neanche testato, potrei aver fatto qualche errore logico o qualche errore di battitura.
Di sicuro non ha senso continuare ad allocare nuovi nodi e copiare dati visto che il vero vantaggio delle liste appunto poter muovere dati copiando solo puntatori.

Loading