Esercizio programma C

di il
4 risposte

Esercizio programma C

Salve a tutti, è il mio primo post in quest'area e spero di trovarmi bene.

Vorrei chiedervi una mano riguardo un esercizio che devo risolvere urgentemente e su cui sto sbattendo il capo da diversi giorni. Tale esercizio è riportato in seguito:

"Scrivere la funzione C che riceve in ingresso due liste collegate con puntatori (lista1 e lista2 nel seguito) di valori interi ed opera nel modo seguente:
-scandisce entrambe le liste in parallelo confrontando gli elementi che occupano la stessa posizione;
-se i due elementi sono diversi la scansione avanza in entrambe le liste, altrimenti se il valore della lista1 è uguale a quello della lista2:
-cancella l'elemento dalla lista2; scollega l'elemento dalla lista1 e lo aggiunge in coda alla lista3 (passata tra i parametri formali della funzione;
-la funzione deve restituire il numero di elementi della lista1 collegati alla lista3.
Tutte le operazioni precedenti devono essere realizzate senza allocare/deallocare memoria (eccetto la cancellazione)."

Di seguito il mio programma completo che SEMBRA crashare al momento della chiamata alla funzione build_mlist (quella richiesta dall'esercizio):

#include <stdlib.h>
#include <stdio.h>
typedef unsigned short int boolean;
#define TRUE 1
#define FALSE 0

struct list{
    int value;
    struct list *next_ptr;
};

void init (struct list **ptrptr);
void pre_insert(struct list **ptrptr, int value);
int build_mlist(struct list **ptrptr1, struct list **ptrptr2, struct list **ptrptr3);
void add(struct list **ptrptr3, struct list **ptrptr1);
void consume(struct list **ptrptr2);


main(){
    struct list *ptrptr1, *ptrptr2, *ptrptr3;

    init(&ptrptr1);
    init(&ptrptr2);
    init(&ptrptr3);
    int n=0;
    printf("inserire valore da aggiungere alla lista 1\n");
    while(n>=0){
    	scanf("%d", &n);
    	if(n>=0)
        pre_insert(&ptrptr1, n);
    }
    n=1;
    printf("inserire valore da aggiungere alla lista 2\n");
    while(n>=0){
        scanf("%d", &n);
        if(n>=0)
        pre_insert(&ptrptr2, n);
    }
    printf("Hai inserito %d elementi nella lista 3.\n", build_mlist(ptrptr1, ptrptr2, ptrptr3));
}

void init(struct list **ptrptr){
    *ptrptr=NULL;
}

void pre_insert(struct list **ptrptr, int value){
    struct list *tmp;
    tmp=*ptrptr;
    *ptrptr=(struct list*)malloc(sizeof(struct list));
    (*ptrptr)->value=value;
    (*ptrptr)->next_ptr=tmp;
}

int build_mlist(struct list **ptrptr1, struct list **ptrptr2, struct list **ptrptr3){
    int count = 0;
    while(*ptrptr1!=NULL && *ptrptr2!=NULL){
        if((*ptrptr1)->value==(*ptrptr2)->value){
           consume(ptrptr2);
           add(ptrptr3, ptrptr1);
           count++;           
        }
        else{
            ptrptr1=&((*ptrptr1)->next_ptr);
            ptrptr2=&((*ptrptr2)->next_ptr);
        }
    }
    return count;
}

void add(struct list **ptrptr3, struct list **ptrptr1){
    struct list *tmp_ptr;
    while((*ptrptr3)!=NULL){
        ptrptr3=&((*ptrptr3)->next_ptr);
    }
    tmp_ptr=*ptrptr3;
    *ptrptr3=*ptrptr1;
    *ptrptr1=(*ptrptr1)->next_ptr;
    (*ptrptr3)->next_ptr=tmp_ptr;
}

void consume(struct list **ptrptr2){
    struct list *tmp_ptr2;
    tmp_ptr2=*ptrptr2;
    *ptrptr2=(*ptrptr2)->next_ptr;
    free(tmp_ptr2);
}

Potete aiutarmi a capire cosa c'è che non va? Grazie in anticipo

4 Risposte

  • Re: Esercizio programma C

    Come primo passo ti suggerisco di partire con la scrittura di una funzione che stampa a video il contenuto di una lista, così poi la richiami passando prima una e poi l'altra lista, prima della build_mlist(), in maniera tale da verificare che le due liste siano corrette.
  • Re: Esercizio programma C

    L'ho fatto e tutto sembra procedere bene, quindi suppongo che il problema sia nella build_mlist(). Sembra strano però, lo sganciamento di un elemento della prima lista e l'agganciamento alla terza è l'operazione che mi lascia più perplesso, ma non dovrei aver sbagliato, mentre l'eliminazione di un elemento della seconda lista è un'operazione abbastanza elementare (a meno di errori grossolani).
    Hai altri consigli al riguardo?

    Qui di seguito il codice del controllo con stampa degli elementi:
    #include <stdlib.h>
    #include <stdio.h>
    
    struct list{
        int value;
        struct list *next_ptr;
    };
    
    void init (struct list **ptrptr);
    void pre_insert (struct list **ptrptr, int value);
    void visit (struct list *ptrptr);
    
    main(){
        struct list *ptrptr1, *ptrptr2, *ptrptr3;
    
        init(&ptrptr1);
        init(&ptrptr2);
        init(&ptrptr3);
        int n=0;
        printf("inserire valore da aggiungere alla lista 1\n");
        while(n>=0){
           scanf("%d", &n);
           if(n>=0)
            pre_insert(&ptrptr1, n);
        }
        visit (ptrptr1);
        
        n=0;
        printf("inserire valore da aggiungere alla lista 2\n");
        while(n>=0){
            scanf("%d", &n);
            if(n>=0)
            pre_insert(&ptrptr2, n);
        }
        visit (ptrptr2);
    } 
    
        
    
    void init(struct list **ptrptr){
        *ptrptr=NULL;
    }
    
    void pre_insert(struct list **ptrptr, int value){
        struct list *tmp;
        tmp=*ptrptr;
        *ptrptr=(struct list*)malloc(sizeof(struct list));
        (*ptrptr)->value=value;
        (*ptrptr)->next_ptr=tmp;
    }
    
    void visit (struct list *ptrptr){
        while(ptrptr!=NULL){
            printf("%d \n", ptrptr->value);
            ptrptr=(ptrptr)->next_ptr;
        }
    }
  • Re: Esercizio programma C

    Il passo successivo potrebbe essere quello di stampare insieme le due liste, quindi fare una build_mlist() che fa solo la visita, e controllare il risultato.
  • Re: Esercizio programma C

    Non sono sicuro di aver capito la tua idea. Intendi unire le due liste e poi fare una visita unica?
Devi accedere o registrarti per scrivere nel forum
4 risposte