Problema lista linkata di parole ordinate alfabeticamente

di il
11 risposte

Problema lista linkata di parole ordinate alfabeticamente

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

  • Re: Problema lista linkata di parole ordinate alfabeticamente

    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
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    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..
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    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
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    Ci ho provato non è così..l'aggiunta dell'uguale però credo faccia la cosa più precisa..
    il resto no..
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    Caspita... che razza di compilatore hai usato?! a me non compila
    aspetta che gli do un'aggiustatina...
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    
    #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: 
    
    
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    È il software DevC++
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    Incomprensibile... comunque ti ho modificato il post precedente con un esempio del funzionamento... resta il fatto che mancano le free
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    Hai ragione va!!!
    grazie..veramente stavo x fondere il cervello!!:):)
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    K ciao
  • Re: Problema lista linkata di parole ordinate alfabeticamente

    Cioè?dovrei svuotare la lista poi?
Devi accedere o registrarti per scrivere nel forum
11 risposte