Problema con liste in C

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
maghico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 297
Iscrizione: martedì 13 febbraio 2007, 12:02

Problema con liste in C

Messaggio da maghico »

Ciao a tutti devo fare un esercizio che legga da tastiera due insiemi di numeri non negativi memorizzandoli in due liste dinamiche ordinate in senso crescente L1 e  L2 e di queste liste calcolare:
L'unione ordinata L1 U L2.
Le liste devono essere implementate per mezzo di memoria dinamica.
Il mio problema è che non riesco ad  implementare questa funzione: lista unione(lista L1, lista L2), crea la lista L1 U L2 e ritorna il puntatore al nodo di testa. Cosa posso fare? sono due giorni che ci sclero >:( >:(
il codice che ho fatto io è questo:

lista unione(lista L1, lista L2){
      lista temp;
     
     
      if((L1 == NULL) && (L2 == NULL)) return NULL;
      else if((L1 == NULL) && (L2 != NULL))return L2;
      else if((L1 != NULL) && (L2 == NULL))return L1;
     
      while(L1 != NULL){
          temp->x = L1->x;
          temp = temp->next;
          L1 = L1->next;
          }
          while(L2 != NULL){
                    temp->x = L2->x;
                    temp = temp->next;
                    L2 = L2->next;
                    }
                    return temp;
          }

la compilazione avviene con successo mi fa inserire i dati però quando deve stampare a video esce dal programma...grazie mille
Ultima modifica di maghico il mercoledì 6 giugno 2007, 14:48, modificato 1 volta in totale.
max.achille
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: venerdì 11 maggio 2007, 0:01

Re: Problema con liste in C

Messaggio da max.achille »

E' proprio sbagliato il concetto cheimplementi.. la concatenazione di due liste va fatta scorrendo una delle due liste (e solo una, quale la scegli tu..) e quindi arrivato all'ultimo elemento, settando il campo next dell'ultimo elemento al primo della lista successiva. Devi inoltre memorizzare in una variabile a parte la testa della prima lista, quella che inizi a scorrere, questo valore verrà ritornato
Indicativamente, considero che ti fai passare un puntatore alla testa della lista L1 (non è quello che fai, mi pare, non sapendo cosa è il tipo lista non saprei..)

lista* testa =L1;
lista* temp= L1;
while (temp!=NULL)
    temp=temp->next;
//a questo punto temp è un puntatore all'ultimo elemento della prima lista, bene ora:
temp->next=L2; //supponendo L2 puntatore alla testa della seconda lista
return testa;
Avatar utente
maghico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 297
Iscrizione: martedì 13 febbraio 2007, 12:02

Re: Problema con liste in C

Messaggio da maghico »

ho seguito il tuo consiglio però mi esce sempre dal programma ,adesso non mi fa neanche inserire i dati.


Se ti può essere d'aiuto devo fare tre file uno chiamato liste.c dove c'è l'implementazione della lista unione, un altro chiamato main dove devo implementare altre funzioni ma che ho già fatto e funzionano e infine un file chiamato defns.h dove metto i prototipi delle mie funzioni
max.achille
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: venerdì 11 maggio 2007, 0:01

Re: Problema con liste in C

Messaggio da max.achille »

Come ti dicevo, devo capire che tipo di dato è "lista" un puntatore o un dato >? Il fatto che esce dal programma è sicuramente dovuto ad un problema di gestione della memoria (e agli * che non ci vanno se lista è un tipo di dato puntatore). Trovi qui: http://home.earthlink.net/~jrhay/src/li ... linklist.c un ottimo esempio di gestione delle liste anche se non c'è l'unione ci sono tutte le altre funzioni utili
max.achille
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 349
Iscrizione: venerdì 11 maggio 2007, 0:01

Re: Problema con liste in C

Messaggio da max.achille »

Ups ho in effetti scritto una cavolata anch'io  :-[ il while si deve fermare quando temp->next==NULL e non quando temp==NULL!!
Per il resto, a questo link trovi un ottimo esempio http://www.c.happycodings.com/Data_Stru ... ode22.html
ed in particolare iul codice per inserire un elemento nellalista:
void add(struct node **q,int num)
{
struct node *temp;
temp = *q;
if(*q==NULL)
{
*q=malloc(sizeof(struct node));
temp = *q;
}
else
{
while((temp->link)!=NULL) //While che scorre la lista fino all'ultimo elemento
{
temp=temp->link;
}
            //creazione di un nuovo elemento e inserimento in coda alla lista
temp->link = malloc(sizeof(struct node));
temp=temp->link;
            //se non vuoi inserire un nuovo elemento ma semplicemente concatenare 2 liste basta sostituire quanto sopra con
            temp->link = L2; //dove L2 è il classico puntatore alla testa della seconda lista
}
temp->data = num;
temp->link  = NULL;
}
Avatar utente
maghico
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 297
Iscrizione: martedì 13 febbraio 2007, 12:02

Re: Problema con liste in C

Messaggio da maghico »

è un puntatore perchè nel file defns.h ho questo codice :

typedef struct nodo *lista;
struct nodo{
int x;          /* Informazione*/
lista next;    /*Puntatore al nodo successivo*/
};

grazie ancora per il tuo aiuto
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti