Indice del forum Olimpo Informatico
I Forum di Zeus News
Leggi la newsletter gratuita - Attiva il Menu compatto
 
 FAQFAQ   CercaCerca   Lista utentiLista utenti   GruppiGruppi   RegistratiRegistrati 
 ProfiloProfilo   Messaggi privatiMessaggi privati   Log inLog in 

    Newsletter RSS Facebook Twitter Contatti Ricerca
[C] linked list problema di esecuzione
Nuovo argomento   Rispondi    Indice del forum -> Programmazione
Precedente :: Successivo  
Autore Messaggio
amok09
Comune mortale
Comune mortale


Registrato: 12/01/09 20:42
Messaggi: 2

MessaggioInviato: 12 Gen 2009 20:44    Oggetto: [C] linked list problema di esecuzione Rispondi citando

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
Profilo Invia messaggio privato
chemicalbit
Dio maturo
Dio maturo


Registrato: 01/04/05 18:59
Messaggi: 18597
Residenza: Milano

MessaggioInviato: 12 Gen 2009 20:57    Oggetto: Rispondi citando

Ti dà errore?
Quale?
Top
Profilo Invia messaggio privato
amok09
Comune mortale
Comune mortale


Registrato: 12/01/09 20:42
Messaggi: 2

MessaggioInviato: 12 Gen 2009 21:05    Oggetto: Rispondi citando

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
Profilo Invia messaggio privato
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 22 Mar 2010 11:27    Oggetto: Rispondi citando

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. Confused
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11802
Residenza: Tokelau

MessaggioInviato: 22 Mar 2010 13:44    Oggetto: Rispondi citando

sembra giusto... tipo_lista come è definito?
Top
Profilo Invia messaggio privato HomePage
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 22 Mar 2010 15:28    Oggetto: Rispondi citando

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.
Damn!
Top
Profilo Invia messaggio privato
SverX
Supervisor Macchinisti
Supervisor Macchinisti


Registrato: 25/03/02 12:16
Messaggi: 11802
Residenza: Tokelau

MessaggioInviato: 22 Mar 2010 16:17    Oggetto: Rispondi citando

boh, da quello che vedo mi sembra impossibile che dia errore nella riga con l'assegnazione del puntatore...

Confused
Top
Profilo Invia messaggio privato HomePage
saetta
Eroe in grazia degli dei
Eroe in grazia degli dei


Registrato: 25/02/08 11:52
Messaggi: 129

MessaggioInviato: 23 Mar 2010 12:03    Oggetto: Rispondi

Sistemato le funzioni hash e tutto è andato a posto.
Grazie.
Top
Profilo Invia messaggio privato
Mostra prima i messaggi di:   
Nuovo argomento   Rispondi    Indice del forum -> Programmazione Tutti i fusi orari sono GMT + 2 ore
Pagina 1 di 1

 
Vai a:  
Non puoi inserire nuovi argomenti
Non puoi rispondere a nessun argomento
Non puoi modificare i tuoi messaggi
Non puoi cancellare i tuoi messaggi
Non puoi votare nei sondaggi