|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2883
|
[C]funzione di ordinamento elementi in una lista
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.
Codice:
#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; } }
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu Ultima modifica di Guts : 29-01-2006 alle 12:40. |
![]() |
![]() |
![]() |
#2 |
Member
Iscritto dal: Apr 2004
Messaggi: 130
|
Codice:
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; } |
![]() |
![]() |
![]() |
#3 |
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2883
|
potresti dirmi cosa c'era di sbagliato nella mia per favore?
grazie
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2003
Città: Milano
Messaggi: 2883
|
ok l'ho capito adesso. grazie dell'aiuto.
ciao
__________________
P4 2.8 NorthwoodC - 2x256 vitesta ddr500 + 1GB Kingston ddr400 - P4C800-Deluxe - SAPPHIRE Radeon X1950pro 512MB AGP - Samsung 931BW Macbook Alu |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 03:34.