Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Linked list
Forum - C/C++ - Linked list

Avatar
finanza (Normal User)
Rookie


Messaggi: 24
Iscritto: 08/01/2008

Segnala al moderatore
Postato alle 15:05
Martedì, 19/02/2008
Ho un nuovo problema: ho implementato una linked list unidirezionale alla quale rimuovo elementi dalla testa e ne aggiungo di nuovi in coda. Funziona tutto bene se creo una lista sola, mentre se ne creao una, la cancello e poi ne creo un'altra non capisco più cosa fa!Queste sono le funzioni:

typedef struct node
{
   int x;
   int y;
   struct node* next;        
} pNode;

void initList(int x, int y)
{
     head = (pNode*)malloc(sizeof(pNode));
     tail = (pNode*)malloc(sizeof(pNode));
    
     if(head!=NULL)
     {                
          head->x = x;
          head->y = y;      
     }  
     else
     {
         printf("\nError while creating the list");
         getchar();
         exit(1);    
     }    
     tail = head;
}

// adds an element at the end of the list
void addNode(int x, int y)
{
     pNode* toAdd = (pNode*)malloc(sizeof(pNode));
    
     if(toAdd!=NULL)
     {
         tail ->next = toAdd;    
         toAdd->next = NULL;
         toAdd->x = x;
         toAdd->y = y;
         tail = toAdd;
     }
     else
     {
         printf("\nError while adding the new node to the address %p", toAdd);
         getchar();
         exit(1);
     }
}

// removes the first element of the list
void removeHead( )
{
     pNode* toDelete = head;
    
     if(toDelete->next==NULL)
     {
        printf("\nThe list is empty");
        head = NULL;  
     }
     else
        head = toDelete->next;
        
     free(toDelete);
}

void printList()
{
     int i=1;
     pNode* tmp = head;
     printf("\n\nPRINTING THE LIST\n");  
    
     while(tmp!=NULL)
     {
          printf("\nThe %dth element is: x:%d y:%d", i++, tmp->x, tmp->y);                
          tmp = tmp->next;          
     }
     printf("\n");
}


void freeList()
{
    pNode* tmp = head;

     while(tmp!=NULL)
     {
         free(tmp);
         tmp = tmp->next;
     }
}

Il programma fa per prima cosa
initList(x, y);
poi una serie di addNode(x,y) e removeHead()
infine freeList().
A questo punto rifaccio il procedimento da capo.

In pratica sembra che la testa non venga mai cancellata...inoltre non ho la certezza che sia la  lista la parte sbagliata, quindi vi chiedo se potete dare un occhio al codice e dirmi se è corretto! Grazie...

PM Quote
Avatar
bangirasu (Normal User)
Rookie


Messaggi: 39
Iscritto: 15/08/2007

Segnala al moderatore
Postato alle 22:19
Martedì, 19/02/2008
Da quello che riesco a capire, l'unico modo per fare funzionare queste funzioni è avere una lista globale, definita fuori dalle funzioni e anche fuori dal main...
Questa implementazione è parecchio strana... Naturalmente possibile ma parecchio strana... io ti consiglio di usare delle liste "normali". cioè nel tuo programma non puoi creare più di una lista... Volendo usando liste "normali" puoi comunque renderle globali e puoi renderne globali più di una senza dover ridefinire una funzione per lista....

PM Quote
Avatar
finanza (Normal User)
Rookie


Messaggi: 24
Iscritto: 08/01/2008

Segnala al moderatore
Postato alle 10:28
Mercoledì, 20/02/2008
Ho sempre usato liste globali, pensavo fossero l'unico modo:d...e inoltre non mi serve avere più liste allo stesso momento(anzi lo volevo evitare)...
Comunque ho risolto il tutto, portando una piccola modifica alla funzione di inizializzazione e alla condizione di un ciclo while che gestiva la lista!

PM Quote
Avatar
bangirasu (Normal User)
Rookie


Messaggi: 39
Iscritto: 15/08/2007

Segnala al moderatore
Postato alle 19:38
Mercoledì, 20/02/2008
In rete trovi tantissima "documentazione" su come fare liste in C e in altri linguaggi...
ti posto il primo risultato ke ho trovato cn google:
http://programmazione.html.it/guide/lezione/1111/introduzi ...
Forse è un minimo più difficile perchè devi considerare il concetto di puntatore e che un argomento passato come parametro può essere modificato dalla funzione.

Quando hai capito la dinamica delle liste e soprattuto dei puntatori dai un occhiata qui:
http://www.disi.unige.it/person/CostaG/ASD_06_07/esercizi_ ...
questo sito contiene varie implementazioni li liste:
-- liste semplici, realizzate in 4 modi
  - liste_semplici.c : funzioni e procedure quasi tutte iterative [QUESTO IL METODO STANDARD]
- rec_liste : versione ricorsiva del precedente
- liste_sempli_2.c : procedure quasi tutte iterative
- rec_liste_2 : versione ricorsiva del precedente
-- liste ordinate
-- liste ordinate "con header"
-- liste ordinate, doppiamente linkate
Penso ke sia mooolto completo.

PM Quote