PDA

View Full Version : [C]funzione di ordinamento elementi in una lista


Guts
29-01-2006, 12:36
ho fatto un programma che gestisce una lista di interi, con le varie funzioni di inserimento, cancellazione, salvataggio in .txt e caricamento da .txt. ho fatto anche la funzione che dovrebbe ordinare gli elementi della lista in ordine crescente solo che nn funziona e nn riesco a capire il perchè, a logica mi sembra giusta. mi date una mano pls.


#include <stdio.h>
#include <stdlib.h>
#include <conio.h>

//definizione della lista
struct tipolista{int elem;
struct tipolista *prox;};
typedef struct tipolista lista;

//prototipi delle funzioni
lista* inizializza(lista *pointer);
lista* inseriscitesta(lista *pointer,int elemento);
lista* inseriscicoda(lista *pointer,int elemento);
lista* cancella(lista *pointer,int elemento);
lista* salva(lista *pointer);
lista* carica(lista *pointer);
lista* ordina(lista *pointer);
void stampa(lista *pointer);

//funzione main()
int main()
{
int i,num,el,a;
lista *lista1;
lista1=inizializza(lista1);

while (a!=0)
{system("CLS");
printf("PROGRAMMA DI GESTIONE DI UNA LISTA\n\n");
printf("elementi nella lista: ");
stampa(lista1);
puts("\n");

printf("1)Inserisci in testa\n2)Inserisci in coda\n3)Cancella un elemento\n4)Salva su file (D:/listatxt.txt)\n5)Carica da file\n6)Ordina gli elementi\n0)Esci\n\nScelta: ");
scanf("%d",&a);
switch (a)
{case 0: return 0;
case 1: printf("Che elemento vuoi inserire in testa? "); scanf("%d",&el);
lista1=inseriscitesta(lista1,el);
break;
case 2: printf("Che elemento vuoi inserire in coda? "); scanf("%d",&el);
lista1=inseriscicoda(lista1,el);
break;
case 3: printf("Che elemento vuoi eliminare? "); scanf("%d",&el);
lista1=cancella(lista1,el);
break;
case 4: lista1=salva(lista1);
break;
case 5: lista1=carica(lista1);
break;
case 6: lista1=ordina(lista1);
break;
}
getchar();
}


return 0;

}

//inizializzazione
lista* inizializza(lista *pointer)
{pointer=NULL;
return pointer;}

//inserimento in testa
lista* inseriscitesta(lista *pointer,int elemento)
{lista *punt,*testa;
punt=(lista*)malloc(sizeof(lista));
punt->elem=elemento;
punt->prox=pointer;
pointer=punt;
return pointer;}

//visualizzazione di tutti gli elementi
void stampa(lista *pointer)
{lista *punt;
punt=pointer;
while(punt!=NULL)
{printf("%d ",punt->elem);
punt=punt->prox;}}

//inserimento in coda
lista* inseriscicoda(lista *pointer,int elemento)
{lista *punt,*cursore,*cursore1;
cursore=pointer;

punt=(lista*)malloc(sizeof(lista)); //dato da inserire
punt->elem=elemento;
punt->prox=NULL;

if (pointer==NULL) {pointer=punt;} //se la lista è vuota lo metto in testa
else{

while(cursore!=NULL) //scansione fino alla fine
{cursore1=cursore; //cursore1 serve per avere l'ultima posizione di cursore
cursore=cursore->prox;}
cursore1->prox=punt;}
return pointer;}

//cancellazione di un elemento a scelta dalla lista
lista* cancella(lista *pointer,int elemento)
{
lista *punt,*punt1;
punt=pointer; punt1=punt;
if (pointer==NULL) {printf("Lista vuota, non ci sono elementi da cancellare\n\n"); system("PAUSE");goto esci;}
if ((pointer->elem)==elemento) {pointer=pointer->prox; goto esci;}
while ((punt->elem)!=elemento)
{

punt1=punt;
punt=punt->prox;
if (punt==NULL) {printf("l'elemento non fa parte della lista\n\n"); system("PAUSE"); goto esci;}
}

punt1->prox=punt->prox;
esci:
return pointer;
}

//salvataggio della lista nel file di testo listatxt1.txt
lista* salva(lista *pointer)
{
lista *punt;
FILE *fp;
punt=pointer;
fp=fopen("D:/listatxt1.txt","w");
//rewind(fp);
while(punt!=NULL)
{
fprintf(fp,"%d ",punt->elem);
punt=punt->prox;
}
if (fp!=NULL) {printf("Salvataggio riuscito\n\n"); system("PAUSE");}
fclose(fp);
return pointer;
}

//caricamento degli elementi della lista da listatxt1.txt
lista* carica(lista *pointer)
{
int a,b;
FILE *fp;
if((fp=fopen("D:/listatxt1.txt","r"))==NULL) return pointer;
pointer=NULL;
while (b=(fscanf(fp,"%d",&a))!=EOF)
{
pointer=inseriscicoda(pointer,a);
}
fclose(fp);
return pointer;
}

//ordinamento in ordine crescente degli elementi
//punt1 punta a un elemento e punt a quello dopo. store mi serve per fare lo //scambio
lista* ordina(lista *pointer)
{
int k;
lista *punt=pointer,*punt1=pointer,*store;

if ((pointer==NULL)||(pointer->prox==NULL)){return pointer; }
else{
do
{
k=0;
while(punt!=NULL)
{

punt1=punt;
punt=punt->prox;
if ((punt1->elem)>=(punt->elem))
{
store=punt1;
punt1=punt;
punt=store;
k=1;
}
}
}while (k!=0);
return pointer; }
}

Qu@ker
29-01-2006, 13:12
lista *ordina(lista *pointer)
{
if (pointer && pointer->prox) {
int k;

do {
lista *punt = pointer;

k = 0;
while (punt->prox) {
lista *punt1 = punt;

punt = punt->prox;
if ((punt1->elem) > (punt->elem)) {
int tmp = punt1->elem;

punt1->elem = punt->elem;
punt->elem = tmp;
k = 1;
}
}
} while (k != 0);
}

return pointer;
}

Guts
29-01-2006, 13:45
potresti dirmi cosa c'era di sbagliato nella mia per favore?
grazie

Guts
29-01-2006, 14:10
ok l'ho capito adesso. grazie dell'aiuto.
ciao