PDA

Visualizza la versione completa : [C] Togliere elementi ripetuti da una lista


kitty
22-10-2006, 14:15
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);
}

}



}

alka
22-10-2006, 15:15
Ricorda il linguaggio anche nel titolo, come da Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887). :)

Ciao! :ciauz:

kitty
22-10-2006, 15:40
Originariamente inviato da alka
Ricorda il linguaggio anche nel titolo, come da Regolamento (http://forum.html.it/forum/showthread.php?s=&threadid=973887). :)

Ciao! :ciauz:

http://forum.html.it/forum/faccine/020.gif ok! ho letto il regolamento me ne ricorder per le prossime volte!
Ciao :)

kitty
22-10-2006, 17:00
:( nessuno pu darmi un aiutino?

so che non una cosa complicata ma io non ci riesco... :dh: :bh:

Loading