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