[C] Problema con esercizio in 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):
Potete aiutarmi a capire cosa c'è che non va? Grazie in anticipo
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

Risposte
Stai chiamando build_mlist usando dei valori incompatibili. Cioè dovresti mandare l'indirizzo di ptrptr1 & co. Strano il compilatore non te lo dica.
Sono abbastanza sicuro di aver provato a passare gli indirizzi in precedenza, ma i problemi erano insorti comunque. Più tardi riproverò in ogni caso e ti farò sapere.
Penso che l'errore sia da qualche parte nell'inserimento dei dati perché questo codice non crasha
#include <stdlib.h> #include <stdio.h> #include <time.h> struct list{ int value; struct list *next_ptr; }; 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); int main() { struct list *ptrptr1 = NULL, *ptrptr2 = NULL, *ptrptr3 = NULL; srand((unsigned)time(NULL)); int const stop1 = 255 + rand() % 10; int const stop2 = 255 + rand() % 10; int in_value = 0; for (int i = 0; i != stop1; ++i) { in_value = rand() % 3; pre_insert(&ptrptr1, in_value); } for (int i = 0; i != stop2; ++i) { in_value = rand() % 3; pre_insert(&ptrptr2, in_value); } int const cont = build_mlist(&ptrptr1, &ptrptr2, &ptrptr3); printf("Hai inserito %d elementi nella lista 3.\n", cont); return 0; } 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); }
Rispondo ad entrambi:
1) Ho riprovato passando gli indirizzi e il codice (come ben ricordavo) crasha in ogni caso, purtroppo;
2) L'ho pensato anch'io, per questo motivo ho appena provato una funzione di visita e stampa degli elementi di una lista sulle prime due liste. L'ho chiamata dopo aver finito di inserire gli elementi e pare essere tutto in regola. Qui il codice, se può aiutare:
1) Ho riprovato passando gli indirizzi e il codice (come ben ricordavo) crasha in ogni caso, purtroppo;
2) L'ho pensato anch'io, per questo motivo ho appena provato una funzione di visita e stampa degli elementi di una lista sulle prime due liste. L'ho chiamata dopo aver finito di inserire gli elementi e pare essere tutto in regola. Qui il codice, se può aiutare:
#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; } }