Funzione elimina occorrenze lista

di Piquels9000 il
11 risposte
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

  • Che fa questa linea di codice

    strcpy(p1->par,scarto);

    ?
  • 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
  • No, controlla come funziona la strcpy dalla documentazione o dal tuo libro
  • Perche è sbagliata come lo usata?
  • Qual è la stringa sorgente e quale la stringa destinazione? Hai mai letto la documentazione della funzione strcpy?
  • Vero si stava sbagliato pero alla fine comunque la funzione elimina tutto
  • Devi proporre il codice corretto per andare avanti.
  • 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
  • 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).
  • Ok provo a fare cosi solo che devo capire come
  • Ci sono riuscito grazie mille per il consiglio !!
Devi accedere o registrarti per scrivere nel forum
11 risposte