Visualizzazione dei risultati da 1 a 6 su 6

Discussione: [C]Liste

  1. #1

    [C]Liste

    Dove sbaglio????
    codice:
     
    #include <stdio.h>
    #include <string.h>
    #include <stdio.h>
    #include <assert.h>
    #include <malloc.h>
    
    typedef int type;
    
    struct _list
    {
        type data;
        struct _list * next; 
    };
    
    typedef struct _list * lista;
    
    void inizializza(lista ptrls, type n);
    void aggiungi(lista ptrls, type n);
    void cancell(lista ptrls);
    
    void inizializza(lista ptrls, type n)
    {
        assert(ptrls != NULL);
        ptrls->data = n;
        ptrls->next = NULL;
    }
    
    void aggiungi(lista ptrls, type n)
    {
        assert(ptrls != NULL);
        lista aux = malloc(sizeof(struct _list));
        // new list
        aux->data = n;
        aux->next = NULL;
        // --------
        ptrls->next = aux; 
    }
    
    void cancell(lista ptrls)
    {
        lista aux;
        while (ptrls != NULL) 
        {
            aux = ptrls;
            ptrls = ptrls->next;
            free(aux);
        }
    }
    
    //main.cpp
    #include "list.h"
    
    int main( )
    {
        lista l;
        inizializza(l, 9);
        aggiungi(l, 7);
        aggiungi(l, 5);
        aggiungi(l, 8);
        while(l->next != NULL)
        {
            printf("%d \n", l->data);
            l = l->next;
        }
        // cancell(l);
        system( "PAUSE" );
        return 0;
    }
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  2. #2
    Utente di HTML.it L'avatar di Yojimbo
    Registrato dal
    Nov 2003
    Messaggi
    104
    quando crei la lista nel main non gli allochi memoria, è pur sempre un puntatore,sarà anche diverso da NULL ma non sai dove punta

  3. #3
    nn mi va lo stesso
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  4. #4
    Utente di HTML.it L'avatar di Yojimbo
    Registrato dal
    Nov 2003
    Messaggi
    104
    ne hai fatti di casini, un attimo che sistemo tutto e ti scrivo la spiegazione

  5. #5
    e che in C++ mi viene in C no
    La stupidità umana e l'universo sono infinite.
    Della seconda non sono certo(Einstein)

    Gnu/Linux User

  6. #6
    Utente di HTML.it L'avatar di Yojimbo
    Registrato dal
    Nov 2003
    Messaggi
    104
    codice:
    #include <stdio.h>
    #include <string.h>
    #include <stdio.h>
    #include <assert.h>
    #include <malloc.h>
    
    typedef int type;
    
    struct _list
    {
        type data;
        struct _list * next; 
    };
    
    typedef struct _list * lista;
    
    void inizializza(lista ptrls, type n);
    void aggiungi(lista ptrls, type n);
    void cancell(lista ptrls);
    
    void inizializza(lista ptrls, type n)
    {
        assert(ptrls != NULL);
        ptrls->data = n;
        ptrls->next = NULL;
    }
    
    void aggiungi(lista ptrls, type n)
    {
        assert(ptrls != NULL);
        
        // Aggiungeresti sempre l'elemto dopo il primo, perdendo la memoria
        // allocata agli altri elementi, oltre che perdendo gli elementi stessi
        // devi scorre fino al fondo della lista per inserire un dato in una lista di questo tipo
        lista aux = ptrls;
        while( aux->next != NULL ) {
            aux = aux->next;
        }
        aux->next = (lista)malloc(sizeof(struct _list));
        aux = aux->next;
        aux->data = n;
        aux->next = NULL;
        
    }
    
    void cancell(lista ptrls)
    {
        lista aux;
        while (ptrls != NULL) 
        {
            aux = ptrls;
            ptrls = ptrls->next;
            free(aux);
        }
    }
    
    int main( )
    {
        lista l = (lista)malloc( sizeof(struct _list));
        inizializza(l, 9);
        aggiungi(l, 7);
        aggiungi(l, 5);
        aggiungi(l, 8);
        
        // il ciclo tralascia sempre l'ultimo elemento, ci vuole un do while per usare questa condizione
        lista aux = l;
        do {
            printf("%d \n", aux->data);
            aux = aux->next;
        } while(aux != NULL);
        cancell(l);
        system( "PAUSE" );
        return 0;
    }
    funziona ora ?

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.