Problema funzione CancellaMax

di il
4 risposte

Problema funzione CancellaMax

Salve a tutti, qualcuno riesce a capire l'errore di segmentation fault di questo codice della funzione CancellaMax? per alcune liste il risultato mi da, ma per esempio per la lista (2 6 3 3 6 9 5 1 5 9 13 11 15 12 16 20 17 5) con maxdis=4 no.
Grazie
CancellaMax: dato il valore della distanza massima di una lista, CancellaMax
deve cancellare il primo elemento di tutte le coppie della lista di
partenza che sono a distanza massima. Per esempio, se la lista `e
(5, 8, 15, 10, 12), dato che in questo caso CancellaMax verr`a chiamata
con maxdis=7, la lista risultante dovr`a essere (5, 15, 10, 12).
ElementoLista *CancellaMax(ElementoLista **list, int maxdis){
    ElementoLista *corr=*list;
    ElementoLista *succ=corr->next;
    ElementoLista *prec=NULL;

    while(succ!=NULL){
        int diff=abs((corr->info)-(succ->info));
        if(diff<maxdis){
            prec=corr;
            corr=succ;
            succ=succ->next;
            int diff=abs((corr->info)-(succ->info));
            if(diff<maxdis){
                prec=corr;
                corr=succ;
                succ=succ->next;

            }
            else{
                if(diff>=maxdis){

                    ElementoLista *del=corr;
                    corr=succ;
                    succ=succ->next;
                    free(del);
                    prec->next=corr;
                }

            }

        }
        else{
            if(diff>=maxdis)
            {
                ElementoLista *del=corr;
                corr=succ;
                succ=succ->next;
                free(del);
                prec->next=corr;
            }
        }

    }

    return 0;
    }

4 Risposte

  • Re: Problema funzione CancellaMax

    Fornisci un main compilabile con un esempio di lista per provare senza perdere troppo tempo ...
  • Re: Problema funzione CancellaMax

    #include <stdio.h>
    #include <stdlib.h>
    
    struct El{
    
        int info;
        struct El *next;
    
    };
    
    typedef struct El ElementoLista;
    
    //funzioni da implementare
    
    ElementoLista* testa(ElementoLista **lista, int el){   //creo la testa della lista
    
        ElementoLista *nuovo=malloc(sizeof(ElementoLista));
        nuovo->info=el;
        nuovo->next=*lista;
        *lista=nuovo;
    return *lista;
    }
    
    ElementoLista* Coda(ElementoLista *lista,int el){ //creo la coda della lista
    
    if(el>0){
        ElementoLista *ultimo=lista;
        ElementoLista *nuovo=malloc(sizeof(ElementoLista));
        nuovo->info=el;
        nuovo->next=NULL;
        if(lista==NULL)
            return nuovo;
        while(ultimo->next!=NULL)
            ultimo=ultimo->next;
        ultimo->next=nuovo;
    }
    return lista;
    }
    
    ElementoLista *readList(ElementoLista **lista,int dist){ // leggo la lista da tastiera con primo elemento corrispondente al limite_distanza, ultimo elemento non lo inserisco
    
        //printf("dammi il primo elemento:\n");
        int el,el_succ,diff;
        scanf("%d",&el);
        testa(&(*lista),el);
        int trovato=0;
        //printf("dammi i successivi elementi:\n");
        while(!trovato){
            scanf("%d",&el_succ);
            diff=abs(el-el_succ);
            //diff=-diff;
            //printf("la diff è %d\n",diff);
            if(diff>dist) trovato=1;
            else{
                Coda(&(**lista),el_succ);
                el=el_succ;
    
            }
    
    
    
        }
    
    return 0;
    }
    
    int maxDistance(ElementoLista **lista){ //calcolo il massimo della distanza tra le coppie
        //printf("il primo elemento rimane: %d\n",(*lista)->info);
        int massimo;
        int max_succ=0;
        ElementoLista *succ=*lista;
        ElementoLista *corr=*lista;
        succ=succ->next;
        massimo=abs((corr->info)-(succ->info));
        //printf("il primo elemento max è:%d\n ", massimo);
        while(succ!=NULL){
            massimo=abs((corr->info)-(succ->info));
            if(massimo>max_succ) max_succ=massimo;
            else massimo;
            corr=succ;
            succ=succ->next;
        }
    
    return massimo;
    }
    
    ElementoLista *CancellaMax(ElementoLista **list, int maxdis){
        ElementoLista *corr=*list;
        ElementoLista *succ=corr->next;
        ElementoLista *prec=NULL;
    
        while((*list)->next!=NULL){
            int diff=abs((corr->info)-(succ->info));
            if(diff<maxdis){
                prec=corr;
                corr=succ;
                succ=succ->next;
                int diff=abs((corr->info)-(succ->info));
                if(diff<maxdis){
                    prec=corr;
                    corr=succ;
                    succ=succ->next;
                //*list=corr->next;
                }
                else{
                    if(diff>=maxdis){
    
                        ElementoLista *del=corr;
                        corr=succ;
                        succ=succ->next;
                        free(del);
                        prec->next=corr;
                    }
                    //*list=corr->next;
                }
    
            }
            else{
                if(diff>=maxdis)
                {
                    ElementoLista *del=corr;
                    corr=succ;
                    succ=succ->next;
                    free(del);
                    prec->next=corr;
                }
            }
            *list=corr->next;
    
        }
    
        return 0;
        }
    
    
    
    
    
    
    
    
    void printList(ElementoLista *list){
    
        printf("(");
        while(list!=NULL){
    
            printf("%d ",list->info);
            list=list->next;
    
        }
        printf(")\n");
    }
    
    int main()
    {
    
        ElementoLista *list=NULL,*list_aux=NULL;
    
        int boundis, maxdis;
        //leggi la bounded distance
        scanf("%d", &boundis);
        //leggi e stampa la lista
        list_aux=readList(&list, boundis);
        printf("La lista bounded-%d e':\n", boundis);
        if(list_aux!=NULL)
        {
            list=list_aux;
            list_aux=NULL;
    
        }
        printList(list);
    
        //Compute and print
        maxdis=maxDistance(&list);
        printf("La distanza massima e' :\n%d\n", maxdis);
    
        //remove maxdist
    
        list_aux=CancellaMax(&list, maxdis);
        printf("La lista modificata è :\n");
        if(list_aux!=NULL) list=list_aux;
        printList(list);
    
        return 0;
    }
    
  • Re: Problema funzione CancellaMax

    Ciao, innanzitutto, al fine di rendere il codice più chiaro e leggibile, ti consiglio di rispettare l'indentazione e la spaziatura, e di racchiudere il corpo delle istruzioni di controllo all'interno di parentesi graffe anche se costituite da una singola riga di codice.

    Partiamo da quelle che ritengo essere le basi per un esercizio sulle liste, ossia due funzioni come si deve che aggiungono elementi in testa e in coda alla lista.
    Dalla tua versione delle suddette funzioni e dal modo in cui le richiami mi viene da pensare che tu abbia le idee un po' confuse al riguardo. Per esempio la funzione testa() perché accetta come argomento un puntatore doppio e allo stesso tempo ritorna un puntatore?
    Detto questo io farei semplicemente qualcosa del genere:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef struct nodo_
    {
    	int data;
    	struct nodo_ *next;
    }   nodo;
    
    void aggiungi_in_testa(nodo **p, int info)
    {
        nodo *nuovo = (nodo*)malloc(sizeof(nodo));
        nuovo->data = info;
        nuovo->next = *p;
        *p = nuovo;
    }
    
    void aggiungi_in_coda(nodo **p, int info)
    {
        while(*p)
        {
            p = &(*p)->next;
        }
        aggiungi_in_testa(p, info);
    }
    
    void stampa_lista(nodo *p)
    {
        while(p)
        {
            printf("%d ", p->data);
            p = p->next;
        }
    }
    
    int main()
    {
        nodo* l = NULL;
        aggiungi_in_coda(&l, 3);
        aggiungi_in_testa(&l, 2);
        aggiungi_in_coda(&l, 4);
        aggiungi_in_testa(&l, 1);
        aggiungi_in_coda(&l, 5);
        stampa_lista(l);
    }
    Per quanto riguarda il resto dell'esercizio sinceramente non ho ancora capito cosa stai cercando di fare. Potresti essere più chiaro e magari fare un esempio concreto?
  • Re: Problema funzione CancellaMax

    Se lo scopo è
    (2 1 4 7 4 1 3 )
    La distanza massima e':
    3
    La lista modificata e':
    (2 1 3 )
    puoi fare qualcosa del genere:
    #include <stdio.h>
    #include <stdlib.h>
    
    typedef int T;
    
    typedef struct nodo_
    {
        T data;
        struct nodo_ *next;
    }   nodo;
    
    void aggiungi_in_testa(nodo **p, T info)
    {
        nodo *nuovo = (nodo*)malloc(sizeof(nodo));
        nuovo->data = info;
        nuovo->next = *p;
        *p = nuovo;
    }
    
    void aggiungi_in_coda(nodo **p, T info)
    {
        while(*p)
        {
            p = &(*p)->next;
        }
        aggiungi_in_testa(p, info);
    }
    
    void elimina(nodo **p)
    {
        if(*p)
        {
            nodo *temp = *p;
            *p = (*p)->next;
            free(temp);
        }
    }
    
    void stampa_lista(nodo *p)
    {
        while(p)
        {
            printf("%d ", p->data);
            p = p->next;
        }
    }
    
    void cancella_max(nodo **p, int d_max)
    {
        if(*p)
        {
            while((*p)->next)
            {
                int d = (*p)->data - (*p)->next->data;
                if(d * (1 - 2 * (d < 0)) >= d_max)
                {
                    elimina(p);
                }
                else
                {
                    p = &(*p)->next;
                }
            }
        }
    }
    
    int main()
    {
        nodo *l = NULL;
        aggiungi_in_coda(&l, 2);
        aggiungi_in_coda(&l, 1);
        aggiungi_in_coda(&l, 4);
        aggiungi_in_coda(&l, 7);
        aggiungi_in_coda(&l, 4);
        aggiungi_in_coda(&l, 1);
        aggiungi_in_coda(&l, 3);
        stampa_lista(l);
        cancella_max(&l, 3);
        printf("\n");
        stampa_lista(l);
    }
    Se qualcosa non ti è chiaro chiedi pure.
Devi accedere o registrarti per scrivere nel forum
4 risposte