Non ho guardato con attenzione lo script e non ricordo benissimo il C, ma credo che potresti innestare il tutto in un ciclo iterativo su p(n-i), con i variabile tra 0 e n-1 (la lunghezza della tua lista), invece di usare i termini assoluti p1, p2... dovrebbe essere uno script simile a quello che si scrive per fare l'ordinamento di una lista di numeri, con confronti successivi tra i rimanenti non ordinati, in effetti ciò che cambia sono le variabili e l'operazione da eseguire, ma a te serve in effetti l'algoritmo per i confronti ripetuti. Ora non ricordo con precisione, ma mi sembra che si usasse un'iterazione del tipo da me citato. L'algoritmo per l'ordinamento è un classico, dovresti trovarlo facilmente e estrapolare la parte di codice che ti serve.
Ok credo di aver capito, adesso vado a cercare l'algoritmo per l'ordinamento e quindi provo a cambiare totalmente il ragionamento... in effetti ancora non sono riuscita a farlo funzionare in quel modo come l'ho pensato io.
Ho dato un'occhiata al listato completo.
La funzione io l'avrei scritta così:
void eliminaRipetizioni(struct elemento *p)
{
struct elemento *p1, *p2, *INDICE, *aux; \*aux puoi anche ometterlo in quanto ci pensa il compilatore a rilasciare la memoria occupata da una variabile inutilizzata *\
INDICE, p1=p;
while(INDICE != NULL) {
p2 = p1->pun;
while(p2 != NULL) {
if ((strcmp (INDICE->nome, p2->nome)) == 0) { \*l'intero x puoi anche ometterlo perchè restituisce un valore che viene subito confrontato - variabili inutili occupano memoria e risorse*\
printf("......UGUALI......");
p1->pun = p2->pun;
aux = p2;
p2 = p1->pun;
free(aux); \*istruzione facoltativa*\
printf(".....");
printf("......");
else {
printf(".......DIVERSI........");
p1 = p2; <--------------
p2 = p2->pun;
printf(".......");
}
}
printf("Fine contronto del primo elemento con gli altri\n");
Ciao skyll... ho provato la tua funzione e a me non funziona bene... dipende dalla senquenza dei nomi nella lista a volte produce una lista senza ripetuti a volte invece no...
io intanto ho provato a fare un'altra funzione che come ragionamento
Va meglio la tua perchè ci sono due istruzioni in meno. Io ho utilizzato un puntatore in più.
Io l'ho provata su carta (proprio con il disegnino di un caso d'uso), e mi pare che funzioni egregiamente.
Non l'ho compilata e quindi nemmeno eseguita.
Appena ho un pò di tempo, ci voglio provare. Se intento hai risolto.....diccelo!
Ciao
Comment