Precedente :: Successivo |
Autore |
Messaggio |
amok09 Comune mortale

Registrato: 12/01/09 20:42 Messaggi: 2
|
Inviato: 12 Gen 2009 20:44 Oggetto: [C] linked list problema di esecuzione |
|
|
ragazzi vorrei chiedervi gentilmente se riuscite a trovare il problema a questo mio programma. Lo descrivo brevemente.. si tratta di creare 3 liste che contengano rispettivamente tre polinomi P1, P2 e P3; e realizzare una funzione che sommi i primi due polinomi e restituisca il risultato nella lista P3. Il problema che riscontro è nella funzione somma (che sostanzialmente si tratta di un merge), dove il programma entra un unica volta nel primo while. Spero di esser stato abbastanza chiaro... mmm.. ecco il codice
Codice: | #include <stdio.h>
#include <stdlib.h>
typedef struct struttura{
int coef;
int esp;};
typedef struct linked_list{
struttura polinomio;
struct linked_list *next;}eq;
typedef eq *link;
void inserisci (struttura *nuovo);
void inserisciOrd (link *nodo, struttura nuovo);
void printlist (link nodo);
void somma (link nodo, link nodo_2, link *nodo_3);
void menu(void);
main()
{
menu();
printf("\n\t*** F I N E ***");
system("PAUSE");
}
void menu()
{
link P1=NULL, P2=NULL, P3=NULL;
P3=(eq*)malloc(sizeof(eq));
int scelta;
struttura nuovo;
printf("\n\t *** I S T R U Z I O N I ***\n\n");
printf("1)Inserisci nuovo membro al primo polinomio;\n2)Stampa primo polinomio;\n3)Inserisci nuovo membro al secondo polinomio;\n4)Stampa secondo polinomio;\n5)Somma polinomi;\n6)Esci.\n\n");
printf("?"); scanf("%d",&scelta);
if (scelta<=0 || scelta >6)
{
puts("Scelta sbagliata. <scelte possibili 1,2,3,4,5,6>");
printf("?"); scanf("%d",&scelta);
}
while (scelta<=5)
{
switch (scelta)
{
case 1 :
inserisci (&nuovo);
inserisciOrd (&P1, nuovo);
break;
case 2 :
printlist(P1);
break;
case 3:
inserisci (&nuovo);
inserisciOrd (&P2, nuovo);
break;
case 4 :
printlist(P2);
break;
case 5 :
somma (P1,P2,&P3);
printlist(P3);
break;
case 6:
return;
break;
}
printf("\n?"); scanf("%d",&scelta);
}
}
void inserisci (struttura *nuovo)
{
printf("coef = ");
scanf("%d",&(nuovo->coef));
printf("esp = ");
scanf("%d", &(nuovo->esp));
}
void inserisciOrd( link *nodo, struttura nuovo)
{
link succ, prec, temp;
temp=(eq*)malloc(sizeof(eq));
temp->polinomio=nuovo;
temp->next=NULL;
prec=NULL;
succ=*nodo;
while(succ!=NULL && nuovo.esp>succ->polinomio.esp)
{
prec=succ;
succ=succ->next;}
if (prec==NULL)
{
temp->next=*nodo;
*nodo=temp;}
else{
prec->next=temp;
temp->next=succ;
}
}
void printlist (link nodo)
{
system("PAUSE");
if (nodo==NULL)
printf("Nessun polinomio è stato memorizzato\n\n");
else{
while(nodo!=NULL)
{
system("PAUSE");
printf("%dx^%d ", nodo->polinomio.coef, nodo->polinomio.esp);
nodo=nodo->next;
system("PAUSE");
}
}
}
void somma (link nodo, link nodo_2, link *nodo_3)
{
*nodo_3=(eq*)malloc(sizeof(eq));
while( (nodo !=NULL) && (nodo_2 != NULL))
{
if ( (nodo->polinomio.esp) == (nodo_2->polinomio.esp))
{
((*nodo_3)->polinomio.coef) = (nodo->polinomio.coef) + (nodo_2->polinomio.coef);
(*nodo_3)->polinomio.esp= nodo->polinomio.esp;
nodo=nodo->next;
nodo_2=nodo_2->next;
}
else if ( (nodo->polinomio.esp) < (nodo_2->polinomio.esp))
{
((*nodo_3)->polinomio.esp)=(nodo->polinomio.esp);
((*nodo_3)->polinomio.coef)=(nodo->polinomio.coef);
nodo=nodo->next;
}
else {
((*nodo_3)->polinomio.esp) = (nodo_2->polinomio.esp);
((*nodo_3)->polinomio.coef) = (nodo_2->polinomio.coef);
nodo_2=nodo_2->next;
}
(*nodo_3)=(*nodo_3)->next;
}
if (nodo==NULL)
{
while(nodo_2 !=NULL)
{
(*nodo_3)->polinomio.esp=nodo_2->polinomio.esp;
(*nodo_3)->polinomio.coef=nodo_2->polinomio.coef;
nodo_2=nodo_2->next;
(*nodo_3)=(*nodo_3)->next;
}
} else if (nodo_2==NULL)
{
while(nodo!=NULL)
{
(*nodo_3)->polinomio.esp=nodo->polinomio.esp;
(*nodo_3)->polinomio.coef=nodo->polinomio.coef;
nodo=nodo->next;
(*nodo_3)=(*nodo_3)->next;
}
}
}
}
|
|
|
Top |
|
 |
chemicalbit Dio maturo


Registrato: 01/04/05 18:59 Messaggi: 18597 Residenza: Milano
|
Inviato: 12 Gen 2009 20:57 Oggetto: |
|
|
Ti dà errore?
Quale? |
|
Top |
|
 |
amok09 Comune mortale

Registrato: 12/01/09 20:42 Messaggi: 2
|
Inviato: 12 Gen 2009 21:05 Oggetto: |
|
|
Compila, e poi durante l'esecuzione si blocca. E inserendo varie istruzioni system("PAUSE") mi sono reso conto che qualunque siano i valori di P1 e P2 si blocca nella funzione somma dopo aver eseguito un unica volta il primo while. |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 22 Mar 2010 11:27 Oggetto: |
|
|
Salve, secondo voi, questo codice cos'ha che non va?
Codice: |
/*funzione di ricerca su lista*/
tipo_elemento *cerca_elemento(tipo_lista *t, void *contenuto)
{
tipo_elemento *trovato;
if( (t == NULL) || (contenuto == NULL) )
{
errno = EINVAL;
return NULL;
}
trovato = t->head; /*qui provoca segmentation fault*/
while(trovato!= NULL)
{
if(t->compare(trovato->contenuto, contenuto)==0)/*compare paragona 2 contenuti, funzione puntata da una campo della struct tipo_lista*/
return trovato;
else trovato = trovato->next;
}
return NULL;
}
|
Diciamo che il suddetto codice funziona bene...fino ad un certo punto del test che sto facendo (dove x altro non si fa niente di non già fatto prima, ovvero un riempimento della lista con interi(con compare(...) che punta ad una f.ne di confronto tra int) ).
Mi sta dando (gdb) un segmentation fault sull'istruzione indicata e non ne capisco il motivo.
Provato a compilare/eseguire/debuggare con ubuntu 8.4 e 9.10...stesso punto stesso problema.  |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11802 Residenza: Tokelau
|
Inviato: 22 Mar 2010 13:44 Oggetto: |
|
|
sembra giusto... tipo_lista come è definito? |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 22 Mar 2010 15:28 Oggetto: |
|
|
Codice: |
typedef struct
{
tipo_elemento *head;
int(*compare)(void *)(void *);/*f.ne di confronto*/
void *(copia_key)(void*);
void *(copia_payload)(void*);
}tipo_lista;
|
Citazione: |
typedef struct elemento
{
void *key;
void *payload;
struct elem *next;
}
tipo_elemento;
|
Tutto ciò viene utilizzato per gestire hashtables con liste di collisione (mediante altro set da me scritto di f.ni per le hashtables)
Più che altro mi chiedevo se il codice che ho postato ha qualche incongruenza che in alcune situazioni può dare segmentation fault.
 |
|
Top |
|
 |
SverX Supervisor Macchinisti


Registrato: 25/03/02 12:16 Messaggi: 11802 Residenza: Tokelau
|
Inviato: 22 Mar 2010 16:17 Oggetto: |
|
|
boh, da quello che vedo mi sembra impossibile che dia errore nella riga con l'assegnazione del puntatore...
 |
|
Top |
|
 |
saetta Eroe in grazia degli dei

Registrato: 25/02/08 11:52 Messaggi: 129
|
Inviato: 23 Mar 2010 12:03 Oggetto: |
|
|
Sistemato le funzioni hash e tutto è andato a posto.
Grazie. |
|
Top |
|
 |
|