Visualizzazione dei risultati da 1 a 2 su 2
  1. #1

    [C] Funzione operante su una lista

    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;
        }    
    
    
    
    
    File allegati File allegati

  2. #2
    Utente di HTML.it L'avatar di torn24
    Registrato dal
    Aug 2008
    Messaggi
    550

    Ciao

    Ciao! Faccio fatica a capire la logica della funzione che ti da problemi!
    Mi è rimasta impressa questa istruzione iter=iter++; che forse non fa quello che credi, visto che incrementa dopo l'assegnazione.

    Secondo me dovresti leggere da file e crearti una lista degli elementi "riservati", solo dopo aver creato la lista procedi ad ordinarla, in modo non diverso da come ordineresti un array. Trovo difficile pensare di ordinarla senza avere tutti gli elementi disponibili.
    Tecnologia

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2019 vBulletin Solutions, Inc. All rights reserved.