Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    3

    [C]liste lineari semplici, problema a liberare memoria allocata

    Ciao a tutti, questo è il mio primo post! sono uno studente universiario e mi sto preparando per l'esame.. ho dei seri problemi con un esercizio che chiede di:
    - creare una struttura assegnare alla struttura un elemento char e un puntatore alla struttura stessa (lista lineare semplice)
    -di inserire caratteri con getchar() fino a quando non si inserisce il carattere di terminazione 0
    -di stampare la lista fino a quando non incontra NULL (terminatore di lista)
    -di liberare la memoria precedentemente allocata terminare il programma

    Bene adesso faccio una cosa piuttosto molesta e allego il sorgente che è raggruppato in unico file.
    P.S. se ci fosse un metodo meno invasivo di questo per allegare il codice fatemelo sapere!!

    #include <stdio.h>
    #include <malloc.h>

    typedef struct st_listElem
    {
    char elem;
    struct st_listElem *next;
    } listElementType;

    listElementType* initList();
    int myFlushInput();
    int printList(listElementType *p);
    void freeMemory(listElementType *p);

    int main()
    {
    listElementType *p;
    p=initList();
    printList(p);
    //freeMemory(p);
    return 0;
    }

    listElementType* initList()
    {
    listElementType *p, *punt;
    char elem;
    if (punt->elem=='0')
    {
    p= NULL; // LISTA VUOTA
    return (p);
    }
    else
    {
    p= (listElementType *) malloc(sizeof(listElementType));
    punt= p;
    printf("Inserisci il primo carattere della lista\n");
    punt->elem=getchar();
    myFlushInput();
    while(punt->elem!='0')
    {
    punt->next = (listElementType *) malloc(sizeof(listElementType));
    punt=punt->next;
    printf("Inserisci un altro carattere nella lista,"); printf("inserisci 0 per terminare..\n");
    punt->elem=getchar();
    myFlushInput();
    }
    punt->next= NULL; // MARCATORE DI FINE LISTA
    punt=p;
    }
    return (p);
    }



    int myFlushInput()
    {
    while(getchar() != '\n');
    return 0;
    }

    int printList(listElementType *p)
    {
    listElementType *punt;
    punt=p;
    printf("\nStampa degli elementi della lista\n");
    while(punt!=NULL)
    {
    printf("\t%c",punt->elem); // stampa il carattere della lista
    punt=punt->next; // scorre di un elemento
    }
    printf("\tNULL");
    punt=p;
    return 0;
    }


    void freeMemory(listElementType *p)
    {
    listElementType *punt;
    punt=p;
    while(p!=NULL);
    {
    punt=punt->next;
    free(punt);
    }
    punt=p;
    }

    provare per credere, se non chiamo la funzione frememory().. il programma va che è una meraviglia, se nel main chiamo la funzione frememory non stampa nulla, quasi come se la memoria venisse liberata anticipatamente.
    So che ci sono delle imperfezioni a livello di codice, per adesso però vorrei riuscire a risolvere questo problemino. Poi avrei un'altra domanda ma se qualcuno avrà pazienza di starmi dietro lo espongo più avanti.

    Grazie in anticipo.
    almeno ci proviamo..

  2. #2
    il motivo è che non modifichi p all'interno del while e vai quindi in loop infinito

    ciao
    sergio

  3. #3
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    3
    grazie sergio, mi potresti dare una mano indicandomi come modificheresti la parte in questione? inoltre non ho ben capito una cosa.. p segna la testa della lista e devo sempre accertarmi che rimanga fissa sull'inizio? e quindi utlizzare sempre un puntatore ausiliare che la scandisca?
    almeno ci proviamo..

  4. #4
    Anzitutto devi togliere quel ; dopo il while VVoVe:


    Poi all'interno del ciclo devi usare due puntatori, uno tiene memorizzata la posizione attuale, l'altro scorre all'elemento successivo, quindi fai free della posizione attuale e rimetti quel puntatore a quello successivo.

    qualcosa del tipo:

    void freeMemory(listElementType *p)
    {
    listElementType *punt;
    while(p!=NULL)
    {
    punt=p;
    p=p->next;
    free(punt);
    }
    }


    dovrebbe funzionare

  5. #5
    Utente di HTML.it
    Registrato dal
    Apr 2009
    Messaggi
    3
    grazie bzein.

    l'ho provato e funziona ringrazio anche sergio, che aveva detto le cose giuste ma non avevo capito bene..
    almeno ci proviamo..

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.