Salve,
vi presento l'ennesimo problema con le liste lineari(non spaventatevi se il codice è lungo, la parte che m'interessa è solo una funzione):
Esattamente la parte:codice:/* Accetta in ingresso una sequenza di valori interi terminante con zero e la memorizzi in una lista lineare con funzione di conteggio(ex 5) degli elementi e stampa dell'n-esimo elemento della lista(ex 6). Funzione di ordinamento in ordine crescente(ex 7). */ #include <stdio.h> #include <malloc.h> #include <string.h> /* Struttura che determina gli elementi di una lista */ struct elemento { int inf; struct elemento *pun; } *crea_lista(void); typedef struct elemento ele; /* Prototipi delle funzioni */ ele *cancella(ele*, int); void *ordina_crescente(ele*); void visualizza(ele*,char*); int count(ele*); void valore(ele*,int); int main() { int n; ele *lista; fflush(stdin); lista = crea_lista(); n = count(lista); visualizza(lista,"lista"); printf("\nNumero totale elementi: %d", n); printf("\nInserisci il numero dell'elemento: "); scanf("%d",&n); valore(lista,n); printf("\nInserisci il valore dell'elemento da cancellare: "); scanf("%d",&n); lista = cancella(lista,n); visualizza(lista,"lista dopo cancellazione"); ordina_crescente(lista); visualizza(lista,"lista ordinata"); getchar(); return 0; } /* Funzione per l'accettazione dei valori immessi e la creazione della lista. Restituisce un puntatore alla testa della lista */ ele *crea_lista(void) { ele *p, *paus; char scelta; int t; /* Creazione del primo elemento */ p = (ele*)malloc(sizeof(ele)); printf("\nInserisci il primo elemento: "); scanf("%d",&p->inf); fflush(stdin); paus = p; t = 1; /* Creazione degli elementi successivi */ for(;;) { printf("\nVuoi inserire un\'altro elemento? [S/N]: "); scanf("%c",&scelta); fflush(stdin); if ((scelta=='s') || (scelta=='S') || (scelta=='n') || (scelta=='N')) { if((scelta=='s') || (scelta == 'S')) { paus->pun = (ele*)malloc(sizeof(ele)); paus = paus->pun; t++; printf("\nInserisci il valore dell\'elemento %d: ",t); scanf("%d",&paus->inf); fflush(stdin); } else { paus->pun = NULL; break; } } else printf("\nInserire un valore corretto!"); } return(p); } /* Routine per la stampa di un'elemento */ void valore(ele *p,int n) { int i = 1; ele* paus; if ((n > count(p)) || (n < 0)) printf("\nLa lista non contiene un numero sufficente di elementi"); else { paus = p; for(i = 1; paus!=NULL; i++) { if (i == n) break; else paus = paus->pun; } printf("Valore dell'elemento %d: %d",n,paus->inf); } } /* Funzione per il conteggio degli elemenenti della lista */ int count(ele *p) { int i = 0; ele *paus; paus = p; while (paus!=NULL) { i++; paus = paus->pun; } return(i); } /* Routine per la visualizzazione della lista */ void visualizza(ele *p,char *tipo) { int i = 1; printf("\n\n\t\tVisualizzazione %s\n",tipo); while(p!=NULL) { printf("\nElemento %d: %d",i,p->inf); p = p->pun; i++; } printf("\n\n\t\t--------------------\n\n"); getchar(); } /* Routine per l'eliminazione delle occorrenze di n nella lista */ ele *cancella(ele *p,int n) { ele *paus; int logica = 1; printf("\n\n\t\tEliminazione occorrenze del %d....\n",n); while(p!=NULL && logica) if(p->inf == n) if (p->pun==NULL) free(p); else p = p->pun; else logica = 0; paus = p; while(paus->pun != NULL) if(paus->pun->inf == n) paus->pun = paus->pun->pun; else paus = paus->pun; return(p); } void *ordina_crescente(ele *p) { int i, j, aus; int *paus; ele *paus2; paus = (int*)malloc(sizeof(int)*count(p)); paus2 = p; i = 0; visualizza(paus2,"paus2 prima"); while((paus2->pun!= NULL) && (i<=count(p))) { *(paus+i) = paus2->inf; paus2 = paus2->pun; i++; printf("\nVettore riempito. paus2->inf = %d\tpaus2->pun != NULL: %d\tvettore[%d] = %d\ti<=count(paus2): %d",paus2->inf,paus2->pun != NULL,i,*(paus+i),i<=count(paus2)); getchar(); } paus2 = p; visualizza(paus2,"paus2 dopo"); for(i = 0; i<=count(p); i++) printf("\n%d Elemento %d del vettore: %d",count(paus2),i,*(paus+i)); for(i = 1; i<=count(p); i++) { for(j = 1; i<=count(p); j++) { if(*(paus+j)<*(paus+i)) { aus = *(paus+j); *(paus+j) = *(paus+i); *(paus+i) = aus; } } } i = 0; paus2 = p; while((paus2->pun!= NULL) && i<=count(p)) { paus2->inf = *(paus+i); paus2 = paus2->pun; i++; } visualizza(paus2,"lista in ordine crescente"); }
L'assegnazione non avviene esattamente come prevedevo, gli ultimi valori sballano con valori altissimi, per capire compilatelo e provatelo: perchè succede questo? Dov'è il problema?codice:void *ordina_crescente(ele *p) { int i, j, aus; int *paus; ele *paus2; paus = (int*)malloc(sizeof(int)*count(p)); paus2 = p; i = 0; visualizza(paus2,"paus2 prima"); while((paus2->pun!= NULL) && (i<=count(p))) { *(paus+i) = paus2->inf; paus2 = paus2->pun; i++; printf("\nVettore riempito. paus2->inf = %d\tpaus2->pun != NULL: %d\tvettore[%d] = %d\ti<=count(paus2): %d",paus2->inf,paus2->pun != NULL,i,*(paus+i),i<=count(paus2)); getchar(); } paus2 = p; visualizza(paus2,"paus2 dopo"); for(i = 0; i<=count(p); i++) printf("\n%d Elemento %d del vettore: %d",count(paus2),i,*(paus+i));
Grazie in anticipo.
PS: non guardate il codice da quella parte in giù, ancora non l'ho ne provato ne controllato poikè sono rimasto bloccato lì.

Rispondi quotando