Salve gente,
Stò studiando il linguaggio C per l'esame di Fondamenti di Informatica e non riesco a trovare una soluzione per togliere da una lista gli elementi ripetuti.
Ho fatto le funzioni per creare e visualizzare la lista e adesso devo completare quella che controlla gli elementi della lista ed elimini i doppioni. Io per risolvere il problema ho cercato di fare una funzione che per ogni elemento della lista verifica se c'è un elemento uguale nelle posizioni successive e se è cosi lo elimino.
Il problema è che riesco a fare solo il confronto del primo elemento con i successivi ma non so come fare per far ripartire da capo il controllo partendo stavolta dal secondo e cosi via!
Spero di trovare qualcuno che possa spiegarmi se il mio ragionamento è corretto e in ogni caso come fare a risolvere questo esercizio con le liste, è da giorni che faccio numerose prove e non ci stò capendo più nulla.
Questo è il listato che ho fatto:
#include <stdio.h>
#include <malloc.h>
#include <string.h>
struct elemento {
char nome[20];
int eta;
struct elemento *pun;
};
struct elemento *crealista();
void eliminarip(struct elemento *);
void visualizza (struct elemento *);
/*................................................*/
main()
{
struct elemento *puntlista;
puntlista=crealista();
visualizza(puntlista);
eliminarip(puntlista);
visualizza(puntlista);
system("pause");
}
/*..............................................*/
struct elemento *crealista()
{
struct elemento *p, *paus;
int i,n;
printf("\nQuanti nomi vuoi inserire nella lista?\t");
scanf("%d",&n);
p= (struct elemento*)malloc(sizeof(struct elemento));
printf("\n\n\t\t\tINSERIMENTO INFORMAZIONI NELLA LISTA\n");
printf("\nInserisci il primo nome della lista: ");
scanf("%s",p->nome);
printf("\nInserisci l'eta' di %s: ",p->nome);
scanf("%d", &p->eta);
paus=p;
for(i=2;i<=n;i++){
paus->pun=(struct elemento *)malloc(sizeof(struct elemento));
paus=paus->pun;
printf("\n\nInserisci il %d nome della lista: ",i);
scanf("%s",&paus->nome);
printf("\nInserisci l'eta' di %s: ",paus->nome);
scanf("%d", &paus->eta);
}
paus->pun=NULL;
return (p);
}
/*................................................. ...*/
void visualizza(struct elemento *p)
{
printf("\n\n ELEMENTI DELLA LISTA\n\n");
while(p!=NULL){
printf("\n %s %d \n\n", p->nome, p->eta);
p=p->pun;
}
}
/*................................................*/
void eliminarip(struct elemento *p)
{
int i,x;
struct elemento *p1,*p2,*aux;
p1=p;
p2=p1->pun;
printf("\n eliminazione elementi ripetuti in corso.....\n\n");
system("pause");
while(p2->pun!=NULL)
{
if ((x=(strcmp(p1->nome,p2->nome)))==0)
{
printf("\n\n Si stanno confrontando: %s e %s \t sono UGUALI\n", p1->nome,p2->nome);
p1->pun=p2->pun;
aux=p2;
p2=p1->pun;
free(aux);
printf("\n \nelemento doppio eliminato...\n\n");
printf("\n p2 ora e': %s\n\n\n", p2->nome);
}
else
{
printf("\n si stanno confrontando: %s e %s \t sono DIVERSI\n\n", p1->nome,p2->nome);
p2=p2->pun;
printf("\n p2 ora e': %s\n",p2->nome);
}
if((p2->pun)==NULL)
{
printf("\n\n confronto elemento successio con i prossimi");
p1=p->pun;
p2=p1->pun;
printf("\n p1 adesso e uguale a : %s \ne p2 e' uguale a : %s ", p1->nome, p2->nome);
}
}
}