Visualizzazione dei risultati da 1 a 8 su 8
  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    27

    Cancellazione elemento da una lista in c

    Ciao,
    dovrei fare un programma che mi elimina un numero contenuto in una lista (se il numero si ripete più volte lo deve elinimare in tutte) e poi mi deve restituire la nuova lista.
    Il programma che ho fatto non mi da errori nel compilatore però non esegue quello che dovrebbe fare.
    Questo è il programma:
    typedef struct NODO_LISTA {
    int val;
    struct NODO_LISTA *next;
    } LISTA;

    LISTA* CancellaLista(LISTA *l, int v)
    {
    LISTA *r,*s;
    if ( v==l->val)
    {
    s=l;
    l=(l)->next;
    free(s);
    }

    while(l->next!=NULL)
    {
    if (v==l->next->val)
    {
    r=l->next;
    l->next=l->next->next;
    free(r);
    }
    else
    l=l->next;
    }

    return l;

    }

    LISTA* insertListaTesta(LISTA *l, int v)
    {
    LISTA *t = (LISTA *) malloc(sizeof(LISTA));
    if (t != NULL)
    {
    t->val = v;
    t->next = l;
    return t;
    }
    else
    return l;
    }




    void stampaListaR(LISTA *l)
    {
    if (l != NULL)
    {
    printf("%d\n", l->val);
    stampaListaR(l->next);
    }
    }

    int main()
    {
    int x, i,y;
    LISTA *p = NULL;

    for (i = 0; i < 20; ++i)
    {
    x = rand() % 100;
    p = insertListaTesta(p, x);
    }
    stampaListaR(p);
    printf("\n");
    scanf(" ",&y);

    CancellaLista(p,y);

    stampaListaR(p);
    system("pause");
    return 0;
    }
    Qualcuno riesce a capire dove ho sbagliato?
    ciao

  2. #2
    Compilando con gcc... (aggiungendo opportunamente gli header che hai omesso):
    Codice PHP:
    #include <stdlib.h>
    #include <stdio.h> 
    si ottiene:
    Codice PHP:
    gcc -Wall -ansi -pedantic -Wextra -Wconversion main.
    main
    .cIn function 'main':
    main.c:72warningtoo many arguments for format 
    da cui si deduce che la:
    Codice PHP:
    scanf(" ",&y); 
    e' certamente sbagliata. Non so il resto ;-)

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    (nella scanf() manca il codice di formato, ma sarà ovviamente un errore di copia visto che è fin troppo banale)

    La tua funzione di cancellazione restituisce un valore, ma questo non è assegnato ad alcuna variabile in main()... tra l'altro, restituire l non ti servirà a nulla perché questo viene modificato all'interno della funzione e alla fine conterrà l'indirizzo dell'ultimo nodo della lista. Al massimo lo puoi salvare in una variabile "temporanea" all'inizio della funzione e poi restituire questa stessa variabile, in maniera tale da non perdere il valore originario dell'indirizzo del nodo in testa della lista.

    Comunque, sembra strano ma ho provato a compilare e lanciare questo programma e funziona correttamente... dipende forse dal compilatore? In pratica i puntatori ai vari nodi della lista sono gli stessi sia all'interno del main() che nella funzione di cancellazione, quindi le modifiche che vengono fatte in quest'ultima hanno effetto anche sulla lista costruita in main() e il risultato finale è proprio quello che ci si aspetta.

    codice:
    36 72 26 40 26 63 59 90 27 62 21 49 92 86 35 93 15 77 86 83
    26
    36 72 40 63 59 90 27 62 21 49 92 86 35 93 15 77 86 83
    every day above ground is a good one

  4. #4
    ho data un'occhiatina velocissima... e mi sono fermato quando ho visto l'identificatore:
    Codice PHP:

    non sarebbe meglio un qualcosa di piu' leggibile?
    ad esempio
    Codice PHP:
    theList 
    ;-)

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    27
    thelist in che senso?
    Poi dopo aver corretto quell'errore banale nella scanf l'ho lanciato e anche col mio compilatore va...però non so quanto abbia senso come codice anche se funziona.

  6. #6
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Anna87_m
    Poi dopo aver corretto quell'errore banale nella scanf l'ho lanciato e anche col mio compilatore va...
    Scusa ma allora era davvero quello l'errore...? Come hai fatto a non accorgertene? Tra l'altro nel primo post avevi detto che il compilatore non segnalava errori...

    Originariamente inviato da Anna87_m
    però non so quanto abbia senso come codice anche se funziona.
    Quello che non ha senso (innanzitutto) è l'istruzione di return nella funzione di cancellazione, dato che questo valore di ritorno, in main(), non è assegnato a nessuna variabile.
    every day above ground is a good one

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2009
    Messaggi
    27
    ma il compilatore non mi dava errori questo era lo strano anche se c'erano quindi non so se è impazzito pure lui...
    e la tua seconda affermazione sul return è giusta cioè se non lo assegno non serve molto

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2008
    Messaggi
    1,326
    Originariamente inviato da Anna87_m
    ma il compilatore non mi dava errori questo era lo strano anche se c'erano quindi non so se è impazzito pure lui...
    In effetti, ora che ricontrollo, quell'errore della scanf() mi viene segnalato come warning compilando con -Wall... vabbè, comunque era lo stesso abbastanza evidente.

    Per l'affare di return, a questo punto lo puoi anche eliminare e definire la funzione di cancellazione come void function... in pratica tu non fai altro che passare alla funzione una copia del puntatore alla testa della lista e poi la scorri completamente per eliminare i nodi che vanno eliminati, modificando i puntatori, quindi in realtà ha senso che queste modifiche risultino effettive anche per la lista della funzione main().
    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.