Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di dash
    Registrato dal
    Jan 2008
    Messaggi
    46

    [C] Problema inserimento ordinato in lista

    Salve a tutti, devo sviluppare 2 funzioni, una che legga dall'input un intero e l'altra che lo inserisca in una lista in maniera ordinata crescente, ho sviluppato le due funzioni nel seguente modo:


    codice:
    void inserisci_dati(struct elemento *p0) {
    
    int num;
    printf("Inserisci numero intero positivo:\n");
    scanf("%d", &num);
    while(num < 0) {
    printf("Non puoi inserire numero negativo\n");
    printf("Inserisci numero intero positivo:\n");
    scanf("%d", &num);
    }
    struct elemento *s = NULL;
    s = (struct elemento *)malloc(sizeof(struct elemento));
    s->valore = num;
    inserisci_ordinatamente(p0, s);
    
    }
    codice:
    void inserisci_ordinatamente(struct elemento *p0, struct elemento *e){
    
    struct elemento *p1, *p2;
    
    if(p0 == NULL) { p0 = e; p0->succ = NULL; }
    else if ( e->valore < p0->valore) { p1 = e; p1->succ = p0; p0 = p1; }
    else {
               p1 = p0;
               while(e->valore > p1->succ->valore && p1->succ != NULL) { p1 = p1->succ; }
               if (p1->succ != NULL) { p2 = p1->succ; p1->succ = e; p1->succ->succ = p2; }
               else { p1->succ = e; p1 = p1->succ; p1->succ = NULL; }
    }
    }
    la struttura elemento è definita da un intero e un puntatore, p0 è stato dichiarato nel main come tipo struttura e inizializzato a NULL, la compilazione non dà nessun errore, nell'esecuzione il programma chiede i numeri interi come previsto finchè non si ferma il ciclo, ma poi non vengono stampati a video (c'è un'altra funzione per la stampa a video che non ho incollato poichè è semplicemente un ciclo while)...avete qualche consiglio, suggerimento o qualsiasi altra cosa..accetto tutto!!!! GRAZIE!
    dash

  2. #2
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Se non hai ancora risolto, posta il programma completo e compilabile se non è troppo lungo e contorto; se lo è, isola il problema estraendo le righe di codice che che lo generano (in un programma completo però), perché in questi casi è meglio avere una visione di insieme.

    E soprattutto indenta il codice, perché così non è che si capisca molto :)
    every day above ground is a good one

  3. #3
    Utente di HTML.it L'avatar di dash
    Registrato dal
    Jan 2008
    Messaggi
    46
    Grazie intanto per l'interessamento, il programma completo è il seguente, in compilazione continua a non dare errori e anche l'esecuzione sembra funzionare...ma al momento della stampa a video niente.

    codice:
    #include <stdio.h>
    #include <malloc.h>
    
    struct elemento {
    int valore;
    struct elemento *succ;
    };
    
    void inserisci_dati(struct elemento *);
    void inserisci_ordinatamente(struct elemento *, struct elemento *);
    void stampa_lista(struct elemento *);
    
    int main() {
    
    int a = 1;
    struct elemento *p0 = NULL;
    
    while(a != 0) { 
                              inserisci_dati(p0); 
                              printf("continuare a inserire? 1 si 0 no"); 
                              scanf("%d", &a); }
                              stampa_lista(p0);
                              return(0);
    }
    
    void inserisci_dati(struct elemento *p0) {
    int num;
    printf("Inserisci numero intero positivo:\n");
    scanf("%d", &num);
    while(num < 0) {
                                 printf("Non puoi inserire numero negativo\n");
                                 printf("Inserisci numero intero positivo:\n");
                                 scanf("%d", &num);
                               }
    struct elemento *s = NULL;
    s = (struct elemento *)malloc(sizeof(struct elemento));
    s->valore = num;
    inserisci_ordinatamente(p0, s);
    }
    
    void inserisci_ordinatamente(struct elemento *p0, struct elemento *e){
    struct elemento *p1, *p2;
    if(p0 == NULL) { 
                                p0 = e; p0->succ = NULL; 
                              }
    else if ( e->valore < p0->valore) { 
                                p1 = e; p1->succ = p0; p0 = p1; 
                              }
    else {
                              p1 = p0;
                              while(e->valore > p1->succ->valore && p1->succ != NULL) { 
                                                                                                                                     p1 = p1->succ; }
                              if (p1->succ != NULL) { 
                                                                     p2 = p1->succ; 
                                                                     p1->succ = e; 
                                                                     p1->succ->succ = p2; }
                              else { 
                                                                     p1->succ = e; 
                                                                     p1 = p1->succ; 
                                                                     p1->succ = NULL; 
                                        }
             }
    }
    
    
    void stampa_lista(struct elemento *p0) {
    while(p0 != NULL) {
    printf("Elemento %d\n", p0->valore);
    p0 = p0->succ;
    }
    }
    dash

  4. #4
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Nelle funzioni inserisci_dati() e inserisci_ordinatamente() il puntatore p0 va passato per riferimento. Così come quando si vuole modificare una qualsiasi variabile all'interno di una funzione la si deve passare per riferimento, allo stesso modo dovrai passare per riferimento un puntatore (quindi, un puntatore a puntatore) se hai intenzione di modificarlo all'interno della funzione, e in effetti è proprio quello che fai qui:

    codice:
        struct elemento *p1, *p2;
        if (p0 == NULL) {
    	p0 = e;
    	p0->succ = NULL;
        }
    insomma la modifica è locale alla funzione e non ha effetti in main(), tant'è che anche dopo aver fatto tutti gli inserimenti che vuoi, se provi a stampare il puntatore p0 prima della chiamata alla funzione di stampa, con

    codice:
    printf("p0: %p\n", (void *) p0);
    stampa_lista(p0);
    avrai sempre NULL come valore.
    every day above ground is a good one

  5. #5
    Utente di HTML.it L'avatar di dash
    Registrato dal
    Jan 2008
    Messaggi
    46
    quindi dovrei definire nel main un puntatore a p0 e passare quello alle 2 funzioni inserisci e inserisci ordinatamente? comunque ora provo poi farò sapere, grazie mille!
    dash

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Non c'è bisogno di definire una variabile "puntatore a puntatore", basta fare una cosa del genere

    codice:
    inserisci_dati(&p0);
    lasciando p0 dichiarato così com'è. Chiaramente andranno modificati i prototipi delle funzioni

    codice:
    void inserisci_dati(struct elemento **);
    void inserisci_ordinatamente(struct elemento **, struct elemento *);
    void stampa_lista(struct elemento *);
    così come nelle intestazioni delle funzioni stesse. Nota che per la funzione di stampa non c'è bisogno di passare un puntatore a puntatore, in quanto non lo devi modificare.

    Chiaramente se ridefinisci il parametro p0 come "struct elemento **p0" nelle funzioni, dovrai andare a sostituire (*p0) ad ogni occorrenza di p0. Tra l'altro ti anticipo già che al secondo inserimento da un segmentation fault, quindi ricontrolla come fai gli aggiornamenti e se hai problemi posta :)

    Giusto per fare un esempio, con le modifiche che ti ho consigliato se provi ad inserire un solo elemento (perché al secondo crasha, come ti dicevo) per poi interrompere l'immissione, ottieni correttamente la stampa di quel valore.
    every day above ground is a good one

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.