Problema lista linkata di parole ordinate alfabeticamente

di Anonimizzato10605 il
11 risposte
Ciao ragazzi!!
ho un problema con questo esercizio e sto andando veramente in tilt.
devo scrivere un programma C che ogni volta che riceve in input una parola la inserisce in una lista linkata ordinata.
sono riuscita a fare delle cose..il problema è questo:se inserisco due parole ad esempio lago e amaca,le mette in ordine:

amaca
lago

e quindi in testa la inserisce senza problemi,quando devo inserire una nuova parola in mezzo o in coda,e quinsi se ad esempio a quelle due aggiungo mare ottengo

amaca
mare

perchè??????vi prego è una settimana che sto cercando di capire cosa sbaglio

#include <stdio.h>
#include <iostream>
#include <stdlib.h>
#define MAX_DIM 20

struct Elenco;
typedef Elenco * puntElenco;
typedef struct Elenco{
        char info[MAX_DIM];
        puntElenco next;
        } Elenco;


puntElenco inserisci(puntElenco L, char*word){
           puntElenco q;
           q=(puntElenco)malloc(sizeof(Elenco));
           strcpy(q->info,word);
           q->next=L;
           return(q);
           }
           
puntElenco InserisciElementoInLista(puntElenco L,char*parola){
           puntElenco q=L, prec;
           int PosTrovata=0;
           if(q==NULL){
                       q=inserisci(L,parola);
                       return(q);
                       }
           if(strcmp(q->info,parola)==1){
                                       q=inserisci(L,parola);
                                       return q;
                                       }
           
           prec=q;
           while((q->next!=NULL) && (PosTrovata==0)){
                                 if(strcmp(q->info,parola)==-1){
                                                                prec=q;
                                                                q=q->next;
                                                                }
                                 else PosTrovata=1;
                                 }
           prec->next=inserisci(q->next,parola);
           return (L);
           }
                                               

void VisualizzaLista(puntElenco L){
     puntElenco q=L;
     printf("\nLista parole:\n\n");
     while(q!=NULL){
                    printf("%s\n",q->info);
                    q=q->next;
                    }
     printf("\n");
                    }

main (){
     puntElenco el_parole;
     el_parole = NULL;
     int scelta,a=1;
     char word[MAX_DIM]={'\0'},lunga[MAX_DIM]={'\0'};
     do{
          system("cls");
          printf("SCELTA OPERAZIONE \n");
          printf("\nPREMI 1:-----------INSERISCI PAROLA---------------------\n");
          printf("PREMI 2:-----------VISUALIZZA LISTA-----------------\n");
          printf("PREMI 3:----------------USCITA-----------------\n");
          printf("\nScelta: ");
          scanf("%d",&scelta);
         
          if(scelta==1){
                        printf("Digita la parola da inserire: ");
                        scanf("%s",word);    
                        el_parole=InserisciElementoInLista(el_parole,word);
                        }
                        
          if(scelta==2) VisualizzaLista(el_parole);
           
                     
                       
          if(scelta==3) a=0;
          
          if(scelta!= 1 && scelta!= 2 && scelta!= 3) printf("\nScelta non valida\n\n"); 
          
          system("PAUSE");                       
          } while(a!=0);
      return 0;
      }    

11 Risposte

  • Per prima cosa attenzione a strcmp
    Returns an integral value indicating the relationship between the strings:
    A zero value indicates that both strings are equal.
    A value greater than zero indicates that the first character that does not match has a greater value in str1 than in str2; And a value less than zero indicates the opposite.
    La funzione ritorna un numero maggiore di zero, zero oppure minore di zero e non -1,0 e 1. Quindi da correggere. per il resto devo vedere con calma ma visto l'ora tarda rimando a domani. Intanto notte
  • Ho fatto una modifica ad una parte del programma,ma credo di aver sbagliato,o comunque c'è un problema,perchè alcune volte il programma ordina le parole altre no..
    
    puntElenco InserisciElementoInLista(puntElenco L,char*parola){
               puntElenco q=L, prec;
               int PosTrovata=0;
               if(q==NULL){ //lista vuota
                           q=inserisci(L,parola);
                           return(q);
                           }
               if(strcmp(q->info,parola)>0){
                                           q=inserisci(L,parola);
                                           return q;
                                           }
               
               prec=q;
               while((q->next!=NULL) && (PosTrovata==0)){
                                     if(strcmp(q->next->info,parola)<0){
                                                                    prec=q;
                                                                    q=q->next;
                                                                    }
                                     else PosTrovata=1;
                                     }
               prec->next=inserisci(q->next,parola);
               return (L);
               }
    
    credo cia sia un problema nel legare il nodo da inserire in mezzo al resto della lista..ma non risolvo..
  • Ciao milu,
    penso che la correzione bisogna farla nella scorrimento della lista
    
    ...
             prec=q;
               while((q!=NULL) && (PosTrovata==0)){
                                     if(strcmp(q->next->info,parola)<0){
                                                                    prec=q;
                                                                    q=q->next;
                                                                    }
                                     else PosTrovata=1;
                                     }
               prec->next=inserisci(q,parola);
    ...
    
    e poi per le parole uguali cambierei con >= :
    
               if(strcmp(q->info,parola)>=0){ // <------------ agg uguale
                                           q=inserisci(L,parola);
                                           return q;
                                           }
    
    provalo...
    scusa skynet se ti ho rubato il post
  • Ci ho provato non è così..l'aggiunta dell'uguale però credo faccia la cosa più precisa..
    il resto no..
  • Caspita... che razza di compilatore hai usato?! a me non compila
    aspetta che gli do un'aggiustatina...
  • 
    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #define MAX_DIM 20
    
    typedef struct Elenco{
    	char info[MAX_DIM];
    	struct Elenco *next;
    	} Elenco;
    typedef Elenco * puntElenco;
    
    puntElenco inserisci(puntElenco L, char*word){
    	puntElenco q;
    	q=(puntElenco)malloc(sizeof(Elenco));
    	strcpy(q->info,word);
    	q->next=L;
    	return(q);
    }
                   
    puntElenco InserisciElementoInLista(puntElenco L,char*parola){
    	puntElenco q=L, prec;
    	int PosTrovata=0;
    	if(q==NULL){
    		q=inserisci(L,parola);
    		return(q);
    	}
    	if(strcmp(q->info,parola)>=0){
    		q=inserisci(L,parola);
    		return q;
    	}
    
    	while (q!=NULL && (PosTrovata==0))
    	{
    		if(strcmp(q->info,parola)<0)
    		{
    			prec=q;
    			q=q->next;
    		}
    		else
    			PosTrovata=1;
    	}
    	prec->next=inserisci(q,parola);
    	return (L);
    }
    
    void VisualizzaLista(puntElenco L){
    	puntElenco q=L;
    	printf("\nLista parole:\n\n");
    	while(q!=NULL){
    		printf("%s\n",q->info);
    		q=q->next;
    	}
    	printf("\n");
    }
    
    int main (){
    	puntElenco el_parole=NULL;
    	el_parole = NULL;
    	int scelta,a=1;
    	char word[MAX_DIM]={'\0'},lunga[MAX_DIM]={'\0'};
    	do{
    			printf("SCELTA OPERAZIONE \n");
    			printf("\nPREMI 1:-----------INSERISCI PAROLA---------------------\n");
    			printf("PREMI 2:-----------VISUALIZZA LISTA-----------------\n");
    			printf("PREMI 3:----------------USCITA-----------------\n");
    			printf("\nScelta: ");
    			scanf("%d",&scelta);
                 
    			if(scelta==1){
    				printf("Digita la parola da inserire: ");
    				scanf("%s",word);   
    				el_parole=InserisciElementoInLista(el_parole,word);
    			}
                               
    			if(scelta==2) VisualizzaLista(el_parole);
                   
    			if(scelta==3) a=0;
                 
    			if(scelta!= 1 && scelta!= 2 && scelta!= 3) printf("\nScelta non valida\n\n");
                 
    		} while(a!=0);
    		
    		return 0;
    	}   
    
    

    edit:
    A me sembra che funzioni... quale test hai eseguito per il bug?
    
    max@studio:~> ./a.out 
    SCELTA OPERAZIONE 
    
    PREMI 1:-----------INSERISCI PAROLA---------------------
    PREMI 2:-----------VISUALIZZA LISTA-----------------
    PREMI 3:----------------USCITA-----------------
    
    Scelta: 1
    Digita la parola da inserire: BB
    SCELTA OPERAZIONE 
    
    PREMI 1:-----------INSERISCI PAROLA---------------------
    PREMI 2:-----------VISUALIZZA LISTA-----------------
    PREMI 3:----------------USCITA-----------------
    
    Scelta: 1
    Digita la parola da inserire: DD
    SCELTA OPERAZIONE 
    
    PREMI 1:-----------INSERISCI PAROLA---------------------
    PREMI 2:-----------VISUALIZZA LISTA-----------------
    PREMI 3:----------------USCITA-----------------
    
    Scelta: 1
    Digita la parola da inserire: AA
    SCELTA OPERAZIONE 
    
    PREMI 1:-----------INSERISCI PAROLA---------------------
    PREMI 2:-----------VISUALIZZA LISTA-----------------
    PREMI 3:----------------USCITA-----------------
    
    Scelta: 1
    Digita la parola da inserire: CC
    SCELTA OPERAZIONE 
    
    PREMI 1:-----------INSERISCI PAROLA---------------------
    PREMI 2:-----------VISUALIZZA LISTA-----------------
    PREMI 3:----------------USCITA-----------------
    
    Scelta: 2
    
    Lista parole:
    
    AA
    BB
    CC
    DD
    
    SCELTA OPERAZIONE 
    
    PREMI 1:-----------INSERISCI PAROLA---------------------
    PREMI 2:-----------VISUALIZZA LISTA-----------------
    PREMI 3:----------------USCITA-----------------
    
    Scelta: 
    
    
  • È il software DevC++
  • Incomprensibile... comunque ti ho modificato il post precedente con un esempio del funzionamento... resta il fatto che mancano le free
  • Hai ragione va!!!
    grazie..veramente stavo x fondere il cervello!!:):)
  • K ciao
  • Cioè?dovrei svuotare la lista poi?
Devi accedere o registrarti per scrivere nel forum
11 risposte