Problema con liste in C
Problema con liste in C
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
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

- Messaggi: 349
- Iscrizione: venerdì 11 maggio 2007, 0:01
Re: Problema con liste in C
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;
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
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
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

- Messaggi: 349
- Iscrizione: venerdì 11 maggio 2007, 0:01
Re: Problema con liste in C
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

- Messaggi: 349
- Iscrizione: venerdì 11 maggio 2007, 0:01
Re: Problema con liste in C
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;
}
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
è 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
typedef struct nodo *lista;
struct nodo{
int x; /* Informazione*/
lista next; /*Puntatore al nodo successivo*/
};
grazie ancora per il tuo aiuto
Chi c’è in linea
Visualizzano questa sezione: 0 utenti iscritti e 4 ospiti