Funzione elimina occorrenze lista

di il
11 risposte

Funzione elimina occorrenze lista

Salve a tutti!! Volevo implementare una funzione che elimina tutte le occorrenze quindi le ripetizioni da una lista. In questo caso la lista è formata da parole quindi da stringhe solo che la mia funzione cancella tutta la lista.
es.
lista: la casa casa è bella
risultato che vorrei ottenere eliminando le occorrenze: la casa è bella
cosa ottengo:niente cancella tutto

la funzione in questione è void eliminaOccorrenze()

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

/*------------------------------------------------NODO----------*/
typedef struct Snodo{
    char par[25];
    struct Snodo* next;
}Tnodo;

/*------------------------------------------------PUNTATORE AL NODO----------*/

typedef Tnodo* Pnodo;


/*------------------------------------------------LISTA----------*/

typedef struct Slista{
    Pnodo testa;
    int N;
}Tlista;

/*------------------------------------------------PROTOTIPI FUNZIONI----------*/
Tlista crealista();
Tlista aggiungiInTesta(Tlista l,char* T);
void stampalista(Pnodo p);
void eliminaOcoorrenze(Tlista l);
void stampalista2(Pnodo p);
/*------------------------------------------------MAIN----------*/

int main()
{
    Tlista l;
    char testo[2000];
    char* token;

    printf("inserire un testo libero massimo 2000 caratteri:\n");
    gets(testo);

    l=crealista();

    token=strtok(testo," ");
    while(token!=NULL){
        l=aggiungiInTesta(l,token);
        token=strtok(NULL," ");
    }
    /*stampa di prova*/
    printf("\nstampa di prova:\n");
    stampalista(l.testa);

    eliminaOcoorrenze(l);
    printf("\n\nstampa senza occorrenze:\n");
    stampalista2(l.testa);
    printf("\n\n");
    return 0;
}
/*------------------------------------------------IMPLEMENTO FUNZIONI----------*/
Tlista crealista(){
    Tlista ris;
    ris.testa=NULL;
    ris.N=0;
    return ris;
}
Tlista aggiungiInTesta(Tlista l,char* T){
    Pnodo nuovonodo;
    /*allocazione nuovo nodo*/
    nuovonodo=malloc(sizeof(Tnodo));
    /*inserimento valore nodo*/
    strcpy(nuovonodo->par, T);
    /*aggiornamento puntatori*/
    nuovonodo->next=l.testa;
    l.testa=nuovonodo;
    l.N++;
    return l;
}

void stampalista(Pnodo p) {
    if(p == NULL)
        return;
    stampalista(p->next);
    printf("%s ", p->par);
}

void eliminaOcoorrenze(Tlista l){
    Pnodo p1,p2;
    p1=l.testa;
    p2=l.testa;
    char scarto[25];
    while(p1!=NULL){
        strcpy(p1->par,scarto);
        while(p2!=NULL){
            if(strcmp(scarto,p2->par)==0){
                free(p2->par);
            }
            p2=p2->next;
        }
        p1=p1->next;
    }

}
void stampalista2(Pnodo p) {
    if(p == NULL)
        return;
    stampalista(p->next);
    printf("%s ", p->par);
}

11 Risposte

  • Re: Funzione elimina occorrenze lista

    Che fa questa linea di codice

    strcpy(p1->par,scarto);

    ?
  • Re: Funzione elimina occorrenze lista

    Strcpy(p1->par,scarto);
    copia la stringa contenuta nodo in char scarto per poi essere comparata con il resto della lista.
    la mia idea era quella di scorrere la lista doppiamente con due puntatori. cioe il primo puntatore p1 punta al primo elemento della lista lo copio nella char scarto e scorro con p2 di nuovo la lista da capo e comparo scarto con p2->par quindi con i vari nodi e cosi facendo verifico le occorenze. poi p1 punta al secondo nodo e si ripete tutto.
    spero di essere stato chiaro
  • Re: Funzione elimina occorrenze lista

    No, controlla come funziona la strcpy dalla documentazione o dal tuo libro
  • Re: Funzione elimina occorrenze lista

    Perche è sbagliata come lo usata?
  • Re: Funzione elimina occorrenze lista

    Qual è la stringa sorgente e quale la stringa destinazione? Hai mai letto la documentazione della funzione strcpy?
  • Re: Funzione elimina occorrenze lista

    Vero si stava sbagliato pero alla fine comunque la funzione elimina tutto
  • Re: Funzione elimina occorrenze lista

    Devi proporre il codice corretto per andare avanti.
  • Re: Funzione elimina occorrenze lista

    Vabbe cioe è quello il codice devi cambiare la strcpy invertendo i parametri solo che adesso sto provando altre cose ma non riesco a ottenere il risultato che voglio
  • Re: Funzione elimina occorrenze lista

    Nel ciclo che hai utilizzato tu confronti la stringa attuale con sè stessa. Ovviamente la elimina e questo vale per tutte.

    Dovresti confrontare la stringa attuale con le successive (quindi esclusa l'attuale).
  • Re: Funzione elimina occorrenze lista

    Ok provo a fare cosi solo che devo capire come
  • Re: Funzione elimina occorrenze lista

    Ci sono riuscito grazie mille per il consiglio !!
Devi accedere o registrarti per scrivere nel forum
11 risposte