[C ] Programma con allocazione dinamica lista di liste

di il
8 risposte

[C ] Programma con allocazione dinamica lista di liste

Salve, ho recentemente scritto un programma con una lista di liste, quindi ho usato la funzione malloc();
In pratica, il programma esegue più volte una funzione al cui interno è presente un malloc() e, alla seconda ripetizione, il programma si blocca.
Ho messo un printf() prima e uno dopo malloc() per questo so che il blocco avviene nella riga dell' malloc.
Il programma è il seguente:


#include<stdio.h>
#include<string.h>
//
struct cro {
	int cod;
	char cat[16];
	char nick[16];
	char testo[256];
	int costo;
	struct cro *next;
}typedef inserzione, *inserzioni;

struct pro {
	char cat[16];
	int num;
	inserzioni ins;
	struct pro *next;
}typedef categoria, *categorie;
//
void menu(int *i);
void stampaSecond(inserzioni second);
int CaricaInserzioni(char *nomeF, inserzioni *second);
void smista(categorie *prime, inserzioni *second);
int cercaCat(categorie prime, char *categoria);
void creaCat(categorie *prime, char *categoria);
void inserisciInserzione(categorie *prime, inserzioni sup);
void stampaPrime(categorie prime);
//
int main(void) {
	int i, numIns;
	char nomeF[31];
	categorie prime;
	inserzioni second;
	prime = NULL;
	second = NULL;
	do {
		menu(&i);
		switch (i) {
		case 1:
			printf("---\n");
			//printf("Inserisci il nome del file con l'estensione\n");
			//scanf("%s", nomeF);
			strcpy(nomeF, "esempio.txt");
			numIns = CaricaInserzioni(nomeF, &second);
			printf("Ho caricato %d inserzioni\n", numIns);
			printf("---\n");
			break;
		case 4:
			printf("---\n");
			smista(&prime, &second);
			printf("Smistamento effettuato \n");
			printf("---\n");
			break;
		case 7:
			printf("---\n");
			stampaPrime(prime);
			printf("---\n");
			break;
		case 8:
			printf("---\n");
			stampaSecond(second);
			printf("---\n");
			break;
		}
	} while (i != 0);
}
//
void menu(int *i) {
	printf("Inserisci:\n1) per caricare da file le inserzioni\n4) per caricare le inserzioni nella lista delle categorie\n7) per visualizzare la lista delle categorie\n8) per visualizzare la lista delle inserzioni\n0) per uscire\n");
	scanf("%d", i);
}

int CaricaInserzioni(char *nomeF, inserzioni *second) {
	FILE *f;
	int cont = 0;
	inserzioni new;
	new = (inserzioni)malloc(sizeof(inserzione));
	new->next = NULL;
	f = fopen(nomeF, "r");
	if (f == NULL) {
		printf("Impossibile aprire il file\n");
		return 0;
	}
	else {
		while (fscanf(f, "%d %s %s %s %d", &new->cod, new->cat, new->nick, new->testo, &new->costo) != EOF) {
			if ((*second) != NULL) {
				new->next = (*second);
			}
			(*second) = new;
			new = malloc(sizeof(inserzione));
			new->next = NULL;
			cont++;
		}
		fclose(f); //
		return cont;
	}
}

void stampaSecond(inserzioni second) {
	if (second == NULL) {
		printf("Lista Second vuota\n");
		return;
	}
	else {
		printf("Ecco la lista Second:\n");
		while (second != NULL) {
			printf("-\n");
			printf("%d %s %s \n%s \n%d \n", second->cod, second->cat, second->nick, second->testo, second->costo);
			second = second->next;
		}
		printf("-\n");
	}
}

void smista(categorie *prime, inserzioni *second) {
	inserzioni sup;
	int check;
	sup = (*second);
	if ((*second) == NULL) {
		printf("Non ci sono inserzioni da smistare \n");
		return;
	}
	else {
		while (sup != NULL) {
			check = cercaCat(*prime, sup->cat);
			printf("Esito ricerca: %d \n", check); //
			if (check == 0) {
				printf("Inserisco una nuova categoria alla lista Prime \n");
				creaCat(&(*prime), sup->cat); //
				printf("Categoria %s inserita \n", sup->cat);
				stampaPrime(*prime);
			}
			printf("Inizio inserimento \n"); //
			inserisciInserzione(&(*prime), sup);
			printf("Inserzione inserita \n"); //
			sup = sup->next;
		}
	}
}

int cercaCat(categorie prime, char *categoria) {
	if (prime == NULL) {
		printf("Lista Prime trovata vuota durante la ricerca \n"); //
		return 0;
	}
	else {
		while (prime != NULL) {
			if (strcmp(prime->cat, categoria) == 0) {
				printf("Categoria trovata \n");
				return 1;
			}
			prime = prime->next;
		}
		printf("Categoria non trovata \n");
		return 0;
	}
}

void creaCat(categorie *prime, char *categoria) {
	categorie new, sup, pre;
	sup = (*prime);
	pre = NULL;
	new = (categorie)malloc(sizeof(categoria));
	strcpy(new->cat, categoria);
	new->num = 0;
	new->ins = NULL;
	new->next = NULL;
	if ((*prime) == NULL) {
		(*prime) = new;
	}
	else {
		while (sup != NULL && strcmp(sup->cat, categoria) > 0) {
			sup = sup->next;
		}
		if (pre == NULL) {
			new->next = (*prime);
			(*prime) = new;
		}
		else {
			if (sup == NULL) {
				pre->next = new;
			}
			else {
				new->next = sup;
				pre->next = new;
			}
		}
	}
}

void inserisciInserzione(categorie *prime, inserzioni sup) {
	categorie check;
	inserzioni new;
	printf("Inizio malloc \n");
	new = (inserzioni)malloc(sizeof(inserzione));  //   SI BLOCCA QUA AL SECONDO GIRO
	printf("Fine malloc \n");                      //   QUESTO PRINTF NON COMPARE
	new->cod = sup->cod;
	strcpy(new->cat, sup->cat);
	strcpy(new->nick, sup->nick);
	strcpy(new->testo, sup->testo);
	new->costo = sup->costo;
	new->next = NULL;
	check = (*prime);

	while (check != NULL && strcmp(check->cat, sup->cat) != 0) {
		check = check->next;
	}
	if (check->ins != NULL) {
		new->next = check->ins;
	}
	check->ins = new;

	check->num = check->num + 1;
}

void stampaPrime(categorie prime) {
	if (prime == NULL) {
		printf("Lista Prime vuota\n");
		return;
	}
	else {
		printf("Ecco la lista Prime:\n");
		while (prime != NULL) {
			printf("-\n");
			printf("%s \n%d \n", prime->cat, prime->num);
			stampaSecond(prime->ins);
			prime = prime->next;
		}
		printf("-\n");
	}
}

Il programma si blocca quando si esegue per la seconda volta la funzione: inserisciInserzione()
Con il debug, l'errore che mi dice è: HereWeGo.exe has triggered a breakpoint.
(HereWeGo sarebbe il nome del progetto in visual studio)
Sapete spiegarmi come risolvere?

8 Risposte

Devi accedere o registrarti per scrivere nel forum
8 risposte