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);
}