Pagina 1 di 1
Problema con liste in C
Inviato: mercoledì 6 giugno 2007, 14:45
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
Re: Problema con liste in C
Inviato: mercoledì 6 giugno 2007, 15:25
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;
Re: Problema con liste in C
Inviato: mercoledì 6 giugno 2007, 15:42
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
Re: Problema con liste in C
Inviato: mercoledì 6 giugno 2007, 15:51
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
Re: Problema con liste in C
Inviato: mercoledì 6 giugno 2007, 16:00
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;
}
Re: Problema con liste in C
Inviato: mercoledì 6 giugno 2007, 16:03
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