Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] inserimento lista ordinata - problema scorrere lista

    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




    codice:
                 
    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
    Ultima modifica di rosencrruetz; 04-01-2015 a 13:01

  2. #2
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,590
    codice:
                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.
    Ultima modifica di Scara95; 06-01-2015 a 02:16
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

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.