Save a tutti. Spero possiate aiutarmi a risolvere il problema con questo piccolo programma.
Una prima funzione in pratica prende da file una serie di messaggi che hanno diversi campi , crea una lista vuota e inserisce in coda i messaggi che prende dal file nella lista. Fin qui tutto funziona dato che un'altra funzione che stampa una lista prendendo la testa mi stampa la lista in modo perfetto. Il problema si presenta con un altra funzione che praticamente dovrebbe scorrere sempre il file di prima, selezionare i messaggi solo con campo riservato e inserirli in una nuova lista ordinata secondo il campo id(dal più basso al più alto). Il problema è che quando vado a stampare la lista che dovrebbe contenere i file riservati ordinati per id mi da solo il primo dei riservati che non è nemmeno quello con id più basso e che quindi non dovrebbe nemmeno essere il primo. La funzione incriminata è ins_ord2 tutto il resto sembra corretto e funzionante.
Allego anche il file txt usato per prendere i messaggi.
codice:
#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
struct messaggio{
char mittente[20];
char indirizzo[40];
char oggetto[20];
char destinatario[20];
char tipologia [20];
char contenuto [1000];
int id;
};
struct nodomessaggio {
struct messaggio data;
struct nodomessaggio * next;
};
struct nodomessaggio * crealistavuotamex () {
struct nodomessaggio *head = NULL;
return head;
};
void ins_coda_mex (struct nodomessaggio **head, struct messaggio * elem) {
struct nodomessaggio * temp = *head;
struct nodomessaggio * p = (struct nodomessaggio *) malloc(sizeof(struct nodomessaggio));
strcpy (p->data.mittente, (*elem).mittente);
strcpy (p->data.indirizzo, (*elem).indirizzo);
strcpy (p->data.oggetto, (*elem).oggetto);
strcpy (p->data.destinatario, (*elem).destinatario);
strcpy (p->data.tipologia, (*elem).tipologia);
strcpy (p->data.contenuto, (*elem).contenuto);
p->data.id = (*elem).id;
if (*head == NULL) {
*head = p;
p->next = NULL;
return;
}
else
temp = *head;
while (temp->next != NULL){
temp = temp->next;}
temp->next = p;
p->next= NULL;
return;
}
struct nodomessaggio * leggi_messaggi () {
struct nodomessaggio *listmessaggio = crealistavuotamex ();
FILE* f = fopen ("messaggi.txt", "r");
struct messaggio t_mex;
while ( fscanf(f,"%[^\n] %[^\n] %[^\n] %[^\n] %[^\n] %[^\n] %d\n", t_mex.mittente, t_mex.indirizzo, t_mex.oggetto, t_mex.destinatario, t_mex.tipologia,t_mex.contenuto,&(t_mex.id)) != EOF ) {
ins_coda_mex(&listmessaggio, &t_mex);
}
fclose(f);
return listmessaggio;
}
void stampa_messaggi (struct nodomessaggio *head) {
while (head!=NULL){
printf ("\n\n mittente:%s\n\n indirizzo:%s\n\n oggetto:%s\n\n destinatario:%s\n\n tipologia:%s\n\n contenuto:%s\n\n id:%d\n\n ",head->data.mittente, head->data.indirizzo,head->data.oggetto,head->data.destinatario,head->data.tipologia,head->data.contenuto,head->data.id);
head = head->next;
}
return;
}
void ins_ord2 (struct nodomessaggio ** list_ris) {
char riservato[] = "riservato";
int iter = 1;
FILE* f = fopen ("messaggi.txt", "r");
struct nodomessaggio * p = (struct nodomessaggio *) malloc(sizeof(struct nodomessaggio));
struct nodomessaggio * temp = *list_ris;
while ( fscanf(f,"%[^\n] %[^\n] %[^\n] %[^\n] %[^\n] %[^\n] %d\n", p->data.mittente, p->data.indirizzo, p->data.oggetto, p->data.destinatario, p->data.tipologia,p->data.contenuto,&(p->data.id)) != EOF ) {
printf("inter n%d",iter);
iter=iter++;
if (strcmp(p->data.tipologia,riservato)!=0 ){
printf("flag1");
return;
}
if (strcmp(p->data.tipologia,riservato)==0 ){
printf("flag2");
if (*list_ris == NULL) {
*list_ris = p;
p->next = NULL;
printf("flag3");
return;
}
if ((*list_ris)->data.id > p->data.id) {
p->next = *list_ris;
*list_ris= p;
printf("flag4");
}
while (temp->next != NULL && temp->next->data.id < p->data.id ) {
temp = temp->next;
printf("flag5");
}
p->next = temp->next;
temp->next = p;
printf("flag6");
}
}
fclose(f);
}
int main() {
int opzione;
struct nodomessaggio *list_mex;
list_mex = leggi_messaggi ();
struct nodomessaggio *list_ris;
list_ris = NULL;
while (1)
{
system("cls");
printf("\n\n Seleziona l\'operazione:\n");
printf("\n 1 - Stampa messaggi dell'archivio\n\n");
printf("\n 2 - Usa funzione per i riservati\n\n");
printf("\n 3 - Stampa riservati ordinati\n\n");
printf("\n 9 - Esci\n\n");
fflush(stdin);
opzione = getch();
system("cls");
switch(opzione)
{
case '1': stampa_messaggi(list_mex);
system("pause");
break;
case '2': list_ris = crealistavuotamex ();
ins_ord2(&list_ris);
system("pause");
break;
case '3': stampa_messaggi(list_ris);
system("pause");
break;
case '9': exit(0);
break;
}
}
return 0;
}