Funzione sulle liste

di il
4 risposte

Funzione sulle liste

Buon pomeriggio.
Sto cercando di scrivere una funzione che data una lista singola disordinata restituisca la lista ottenuta portando l'elemento più grande all'ultimo posto della lista stessa. Sia il prototipo TList list_max_at_end(TList l).
TList list_max_at_end(TList l){
    TList temp=l;
    int max=temp->info;
    TNode *prec=NULL, *max_node;
    
    while(temp->link != NULL){
        if(temp->link->info > max){
            max=temp->info;
            prec=temp;
            max_node=temp->link;
        }
        temp=temp->link;
    }
    
    if(prec==NULL){
        //TNode *new_max=node_create(max_node->info, NULL);
        temp->link=max_node;
        max_node->link=NULL;
        l=l->link;
    }else{
        prec->link=max_node->link;
        //TNode *new_max=node_create(max_node->info, NULL);
        temp->link=max_node;
        max_node->link=NULL;
        //node_destroy(max_node);
    }
    return l;
}
Quelle tre istruzioni sono commentate perché avevo provato anche a creare un nuovo nodo e a distruggere il vecchio, ma non cambia niente. Il problema è che mi crasha con un carinissimo segmentation fault.
Ringrazio in anticipo chi mi aiuterà.

4 Risposte

  • Re: Funzione sulle liste

    Tlist è una classe creata da te? In quel caso servirebbe sapere com'è strutturata per poterti aiutare
    (In caso contrario un link alla descrizione della classe, non riesco a trovarla )
  • Re: Funzione sulle liste

    Scusami avevo dimenticato di scriverlo! Ecco la definizione:
    typedef int TInfo;
    
    struct SNode{
        TInfo info;
        struct SNode *link;
    };
    
    typedef struct SNode TNode;
    typedef TNode* TList;
  • Re: Funzione sulle liste

    Così dovrebbe funzionare.
    Ci sono solo due errori nel codice, almeno così mi è parso:
    
    TList list_max_at_end(TList l)
    {
    	TList temp = l;
    	int max = temp->info;
    	TNode *prec = NULL, *max_node = l;
    	//Il primo è il non dichiarare *max_node = l; 
    
    	while (temp->link != NULL)
    	{
    		if (temp->link->info > max)
    		{
    			max = temp->info;
    			prec = temp;
    			max_node = temp->link;
    		}
    		temp = temp->link;
    	}
    
    	if (prec == NULL)
    	{
    		l = l->link;  //Questo è da spostare quassù
    		temp->link = max_node;
    		max_node->link = NULL; //Se non dichiari max_node = l, qui non avrà nessun valore, sarà un puntatore vuoto; se non sposti l = l->link in cima a questo blocco, poiché l = max_node, il secondo elemento della lista darà dichiarato nullo
    		//l = l->link;
    	}
    	else
    	{
    		prec->link = max_node->link;
    		temp->link = max_node;
    		max_node->link = NULL;
    	}
    	return l;
    } 
  • Re: Funzione sulle liste

    Sono appena riuscita a capire cos'era che non andava!! Ho risolto
    Erano proprio quelli gli errori, grazie mille!
Devi accedere o registrarti per scrivere nel forum
4 risposte