[C] Problema con esercizio in C

Arcana
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 :)

Risposte
vict85
Stai chiamando build_mlist usando dei valori incompatibili. Cioè dovresti mandare l'indirizzo di ptrptr1 & co. Strano il compilatore non te lo dica.

Arcana
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.

vict85
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);
}

Arcana
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:

#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;
    }
}

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.