Ricerca duplicati parole

di il
3 risposte

Ricerca duplicati parole

Ciao a tutti, avrei un problema con la ricerca di parole duplicate. So gìà che è un esercizio banale ma mi sto perdendo in un bicchier d'acqua.
In pratica l'esercizio consiste nell'inserire delle parole e cercarne le duplicate. Ora il mio problema è proprio sulla ricerca delle parole duplicate, infatti alla pressione della terza opzione del menu dovrei avere la stampa delle parole duplicate con i loro indici.
Ad esempio con l'immissione delle seguenti parole:

gatto
casa
luce
gatto
gatto
luce
penna
Il risultato dovrebbe essere:
gatto 0 3 4
luce 2 6
Ma quello che riesco a produrre io è:
gatto 0
luce 2
gatto 3
gatto 4
luce 6

3 Risposte

  • Re: Ricerca duplicati parole

    filipp01 ha scritto:



    Ma quello che riesco a produrre io è:
    gatto 0
    luce 2
    gatto 3
    gatto 4
    luce 6
    Questo il codice:
    
    
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    struct parole {
    	char descrizione[20];
    	struct parole *next;
    };
    
    int gestioneMenu() {
    	int selezione;
    	printf("\n 1. Immetti parola\n 2. Stampa parole con posizione\n 3. Stampa parole duplicate e gli indici\n 4. EXIT\n");
    	printf("Immetti una scelta: ");
    	scanf("%d", &selezione);
    	printf("\n");
    
    	return selezione;
    }
    
    // Aggiunge un elemento alla lista
    void aggiungiElemento(struct parole **head, struct parole *elem){
    
        //nodo usato per attraversare la lista
        struct parole *prec = NULL;
        elem->next = NULL;
    
        //se lista vuota
        if(*head == NULL){
            *head = elem;
        }
        //aggiungo in coda
        else{
    		prec = *head;
            while(prec->next) 
                prec = prec->next;
                prec->next = elem;
        }
    }
    
    //Crea una nuova voce della lista
    struct parole *creaNuovo() {
    	char descr[20];
    	struct parole *elem = NULL;
    	printf("Inserire una parola\n");
    	scanf("%s", descr);
    	elem = malloc(sizeof(struct parole)); //Alloco memoria dinamica per la struct
    	if (elem == NULL) {
    		printf("ERRORE! Creazione nuovo elemento non riuscita\n");
    		exit(EXIT_FAILURE);
    	}
    	strncpy(elem->descrizione, descr, 20);
    	return elem;
    }
    
    //Gestisce l'opzione di aggiunta: crea la nuova voce e la inserisce nella lista
    void gestisciAggiunta(struct parole **head) {
    	struct parole *nuovo = creaNuovo();
    	aggiungiElemento(head, nuovo);
    }
    
    // Stampa elementi lista
    int stampaLista(struct parole *head){
        int i = 0;
        printf("ID ITEM\n");
        while(head != NULL){
            printf("%d. %s\n", i, head->descrizione);
            head = head->next;
            i++;
        }
        return i;
    }
    
    void duplicati(struct parole *head) {	
    	int i = 0;
        int trovato = 0;
    
        struct parole *temp;
        struct parole *temp1;
        temp = head;
    
        while(temp != NULL)
        {
            temp1 = head;
            trovato = 0;
    
            while(temp1 != NULL)
            {
                if(strcmp(temp->descrizione, temp1->descrizione)==0)
                {
                    trovato++;
                }
                temp1 = temp1->next;
            }
            if(trovato>1)
            {
                printf(" %s %d\n", temp->descrizione, i);
            }
            temp = temp->next;
    		i++;
        }
    }
    
    int main() {
    	struct parole *head = NULL;
    
    	while(1) {
    		int num = gestioneMenu();
    		switch(num) {
    			case 1:
    				gestisciAggiunta(&head);
    				break;
    			case 2:
    				stampaLista(head);
    				break;
    			case 3:
    				printf("\n Stringhe uguali\n");
    				duplicati(head);
    				break;
    			case 4:
    				exit(EXIT_SUCCESS);
    			default:
    				printf("ERRORE! Comando non valido\n");
    		}
    	}
    }
    
  • Re: Ricerca duplicati parole

    Visto la tipologia di esercizio e visto che parli di "indici", non sarebbe più logico utilizzare un array (e non una lista) di parole?!

    In ogni caso per ottenere l'output che ti sei prefissato, la prima cosa che mi viene in mente è la seguente:
    - se la parola corrente non è preceduta da duplicati, allora passi alla ricerca di eventuali duplicati successivi, altrimenti passi alla parola successiva;
    - nel momento in cui trovi un duplicato che segue la parola corrente, vai a stampare la parola corrente e il suo indice se trovato è uguale a 1, altrimenti stampi solo l'indice del duplicato.
  • Re: Ricerca duplicati parole

    PRIMA di scrivere il codice, BISOGNA avere le idee chiare su come procedere!

    1) poiche' devi cercare le parole duplicate e la posizione di ogni parola, ti serve una struttura dati adatta allo scopo. Qualcosa che per ogni parola mantenga una lista di posizioni.
    Ci sono diverse possibilita':

    a) la lista di posizioni puo' essere implementata con una lista concatenata o con un vettore 'dinamico', cioe' un vettore di cui conosci il numero di elementi contenuti
    b) anche la COPPIA <parola,lista_di_posizioni> la puoi implementare in n-mila modi diversi: DUE array (uno per le parole, uno per le liste di posizioni), UN ARRAY di strutture dati (la struttura contiene la parola e la lista di posizioni), DUE liste, UNA Lista di strutture dati, UN DIZIONARIO. E questo giusto per fare un elenco

    2) ora, l'operazione da fare e' scandire la lista di parole (E RELATIVA posizione) ed aggiornare le sudette strutture dati:
    2.1) se la parola non c'e', la aggiungi ed aggiundi la lista VUOTA di posizioni
    2.2) selezioni la lista di posizioni relativa alla parola (che a questo punto SAI PER CERTO che c'e') e aggiungi la posizione

    NOTA la sequenza di punti 2.1, 2.2: quest e' un trick per evitare di duplicare il codice

    3) alla fine di questi passaggi avrai una lista di parole e per ogni parola la lista di posizioni


    Questa e' UNA DELLE INFINITE possibili implementazioni, NON L'unica implementazione possibile
Devi accedere o registrarti per scrivere nel forum
3 risposte