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