|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
[C]Liste non aggiunge al primo elemento
Codice:
#include <stdio.h> #include <stdlib.h> struct nodi{ int info; struct nodi *suc; }; typedef struct nodi nodo; nodo *crea_lista(){ nodo *lista; system("cls"); lista=NULL; lista=(nodo*)malloc(sizeof(nodo)); printf("1 Numero:--> "); scanf("%d",&lista->info); return lista; } nodo *crea_no(nodo* lista,int n){ int i; for(i=2; i<=n; i++){ lista->suc=(nodo*)malloc(sizeof(nodo)); lista=lista->suc; printf("%d Numero:--> ",i); scanf("%d",&lista->info); } lista->suc=NULL; return lista; } void stampa(nodo*lista){ while(lista!=NULL){ printf("%d ",lista->info); lista=lista->suc; } system("Pause"); } void cerca_nodo(nodo *lista,int ele){ printf("\n\nElemento da trovare:--> "); scanf("%d",&ele); while(lista!=NULL && ele!=lista->info ){ lista=lista->suc; } if(lista!=NULL){ printf("\n\nElemento trovato!"); } else printf("\n\nNessun elemento trovato.."); } nodo *distruggi(nodo *lista){ nodo *tmp; while(lista!=NULL){ tmp=lista->suc; free(lista); lista=tmp; } } void *ordina(nodo*lista){ nodo *tmp,*lista2; int num; lista2=lista; while(lista2->suc!=NULL){ tmp=lista; while(tmp->suc!=NULL){ if(tmp->info > tmp->suc->info){ num=tmp->info; tmp->info=tmp->suc->info; tmp->suc->info=num; } tmp=tmp->suc; } lista2=lista2->suc; } } void *aggiungi(nodo *lista){ nodo *corent,*newnodo=NULL,*prec; int elemento; prec=NULL; corent=lista; fflush(stdin); printf("Elemento da aggiungere:--> "); scanf("%d",&elemento); while(corent!=NULL && elemento > corent->info){ prec=corent; corent=corent->suc; } if(prec==NULL){ newnodo=(nodo*)malloc(sizeof(nodo)); newnodo->info=corent; newnodo->suc=lista; corent=newnodo; return lista; } else{ newnodo=(nodo*)malloc(sizeof(nodo)); newnodo->info=elemento; prec->suc=newnodo; newnodo->suc=corent; } } int main(){ int n,ele; nodo*lista,*lista2; printf("Quanti elementi vuoi inserire?--> "); scanf("%d",&n); lista=crea_lista(); lista2=lista; lista2=crea_no(lista,n); stampa(lista); cerca_nodo(lista,ele); distruggi(lista); ordina(lista); printf("\n\n"); aggiungi(lista); stampa(lista); } ciao a tutti ![]() ![]() io inserisco :10-4-3-6 mi riordina :3-4-6-10 poi se inserisco 1 o due non me lo inserisce se invece è un numero che si va a collocare in mezzo o a fine lista allora va tutto bene cosa sbaglio? |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: May 2008
Città: Torino - Valenza (AL)
Messaggi: 1215
|
ho bovinamente copiato e incollato il codice e l'ho compilato e dice che c'è un errore di assegnazione nella aggiungi, dove fai newnodo->info=corent; quindi a colpo d'occhio ti sei semplicemente confuso ad assegnare a info il puntatore al nodo seguente anzichè un intero, che suppongo debba essere elemento.
ora provo a correggerlo edit: inoltre mi risultava che per usare system("cls") e altri system(arg) in windows servisse includere windows.h (suppongo che tu stia usando windows perchè "cls" non è un comando bash di unix), ma non posso controllare perchè non uso windows per programmare ![]() edit2: ho messo elemento in quella linea e ora compila, ma facendolo andare, dopo che mi chiede che numero aggiungere entra in un loop edit3: (edito mano a mano che trovo cose questionabili) nella aggiungi fai un return ma aggiungi è di tipo void quindi non dovresti ritornare niente. più specificatamente la tua aggiungi è di tipo puntatore a void, quindi si può anche togliere il * da aggiungi. tant'è che ritorni lista ma non fai alcun assegnamento del return della funzione aggiungi edit4: ok te l'ho aggiustato. hai fatto un po' di confusione, confronta cosa ho cambiato rispetto al tuo (a parte le chiamate system commentate perchè non uso windows), se non capisci cosa hai sbagliato e perchè, chiedi ![]() Codice:
#include <stdio.h> #include <stdlib.h> typedef struct nodi { int info; struct nodi *suc; } nodo; nodo *crea_lista() { nodo *lista; //system("cls"); lista=NULL; lista=(nodo*)malloc(sizeof(nodo)); printf("1 Numero:--> "); scanf("%d",&lista->info); return lista; } nodo *crea_no(nodo* lista,int n) { int i; nodo *newnodo, *testa=lista; for(i=2; i<=n; i++) { newnodo=(nodo*)malloc(sizeof(nodo)); lista->suc=newnodo; lista=lista->suc; printf("%d Numero:--> ",i); scanf("%d",&lista->info); } lista->suc=NULL; return testa; } void stampa(nodo*lista) { while(lista!=NULL) { printf("%d ",lista->info); lista=lista->suc; } //system("Pause"); } void cerca_nodo(nodo *lista,int ele) { printf("\n\nElemento da trovare:--> "); scanf("%d",&ele); while(lista!=NULL && ele!=lista->info ) { lista=lista->suc; } if(lista!=NULL) { printf("\n\nElemento trovato!"); } else printf("\n\nNessun elemento trovato.."); } nodo *distruggi(nodo *lista) { nodo *tmp; while(lista!=NULL) { tmp=lista->suc; free(lista); lista=tmp; } } void ordina(nodo*lista) { nodo *tmp,*lista2; int num; lista2=lista; while(lista2->suc!=NULL) { tmp=lista; while(tmp->suc!=NULL) { if(tmp->info > tmp->suc->info) { num=tmp->info; tmp->info=tmp->suc->info; tmp->suc->info=num; } tmp=tmp->suc; } lista2=lista2->suc; } } nodo *aggiungi(nodo *lista) { nodo *corent,*newnodo=NULL,*prec; int elemento; prec=NULL; corent=lista; fflush(stdin); printf("Elemento da aggiungere:--> "); scanf("%d",&elemento); while(corent!=NULL && elemento > corent->info) { prec=corent; corent=corent->suc; } if(prec==NULL) { newnodo=(nodo*)malloc(sizeof(nodo)); newnodo->info=elemento; newnodo->suc=lista; lista=newnodo; } else { newnodo=(nodo*)malloc(sizeof(nodo)); newnodo->info=elemento; prec->suc=newnodo; newnodo->suc=corent; } return (lista); } int main() { int n,ele; nodo*lista,*lista2; printf("Quanti elementi vuoi inserire?--> "); scanf("%d",&n); lista=crea_lista(); //lista2=lista; lista=crea_no(lista,n); stampa(lista); cerca_nodo(lista,ele); //distruggi(lista); ordina(lista); printf("\n\n"); lista=aggiungi(lista); stampa(lista); }
__________________
Win 10 x64 - NZXT H440 - Antec TP-750C - AsRock Z77 Extreme4 - Intel Core i5-3570k - 16GB DDR3 Corsair XMS3 1333Mhz CL9 - MSI GTX970 Gaming 4G - Samsung 850 Evo 256GB - WD 4TB Green SATA3 - Maxtor 500GB SATA2 - Seagate 500GB SATA2 - WD 500GB SATA2 - Seagate 160GB IDE - ASUS VW224T @ 1680x1050 @ 60Hz - Creative Inspire T6100 Ultima modifica di M@Rk0 : 07-02-2013 alle 21:17. |
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
Quote:
Codice:
#include <stdio.h> #include <stdlib.h> struct nodi{ int info; struct nodi *suc; }; typedef struct nodi nodo; ///CREO LA LISTA nodo *crea_lista(){ nodo *lista; lista==NULL; lista=(nodo*)malloc(sizeof(nodo)); printf("1 Numero:--> "); scanf("%d",&lista->info); return lista; } ///CREO I NODI SUCCESSIVI nodo *crea_nod(nodo *lista,int n){ nodo *iniz=lista; nodo *newnodo; int i; iniz=lista; for(i=2; i<=n; i++){ newnodo=(nodo*)malloc(sizeof(nodo)); lista->suc=newnodo; lista=lista->suc; printf("%d Numero:--> ",i); scanf("%d",&lista->info); } return iniz; } ///STAMPO LA LISTA INTERA void stampa(nodo *lista){ while(lista!=NULL){ printf("%d ",lista->info); lista=lista->suc; } } ///ORDINO LA LISTA void ordina(nodo *lista){ nodo *lista2,*tmp; int num; lista2=lista; while(lista2->suc!=NULL){ tmp=lista; while(tmp->suc!=NULL){ if(tmp->info > tmp->suc->info){ num=tmp->info; tmp->info=tmp->suc->info; tmp->suc->info=num; } tmp=tmp->suc; } lista2=lista2->suc; } } void cerca(nodo *lista){ int ele; printf("Quale elemento vuoi cercare?-->"); scanf("%d",&ele); while(lista!=NULL && ele!=lista->info){ lista=lista->suc; } if(lista==NULL){ printf("\n\nElemento non trovato..."); } else printf("\n\nTrovato!"); } ///AGGIUNGO ELEMENTO nodo *agg(nodo*lista){ nodo *corent=lista; nodo *prec=NULL,*newnod=NULL; int ele; printf("\n\nInserire elemento da aggiungere:--> "); scanf("%d",&ele); while(corent!=NULL && ele > corent->info ){ prec=corent; corent=corent->suc; } if(prec==NULL){ newnod=(nodo*)malloc(sizeof(nodo)); newnod->info=ele; newnod->suc=lista; lista=newnod; } else{ newnod=(nodo*)malloc(sizeof(nodo)); newnod->info=ele; prec->suc=newnod; newnod->suc=corent; } return lista; } ///CANCELLO ELEMENTO nodo *canc(nodo *lista){ int ele; nodo *corent=lista,*prec=NULL; printf("Quale elemento vuoi eliminare?"); stampa(lista); printf("\n\nScelta:--> "); scanf("%d",&ele); while(corent!=NULL && ele!=corent->info){ prec=corent; corent=corent->suc; } if(ele==corent->info){ if(prec==NULL){ lista=corent->suc; } else { prec->suc=corent->suc; } free(corent); } return lista; } ///DISTRUGGO LISTA nodo *distruggi(nodo *lista) { nodo *tmp; while(lista!=NULL) { tmp=lista->suc; free(lista); lista=tmp; } } int main() { int num; nodo *lista; printf("\t\t\t***LISTA***\n\n\n\n\nQuanti elementi vuoi inserire?--> "); scanf("%d",&num); lista=crea_lista(); lista=crea_nod(lista,num); stampa(lista); system("pause"); ordina(lista); stampa(lista); system("pause"); cerca(lista); lista=agg(lista); stampa(lista); system("pause"); lista=canc(lista); stampa(lista); system("pause"); lista=distruggi(lista); return 0; } ho riscritto il codice seguendo i tuoi consigli ![]() ma di preciso il loop cosa sarebbe?come lo evito?grazie ancora per l'aiuto ![]() |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: May 2008
Città: Torino - Valenza (AL)
Messaggi: 1215
|
si ora funziona, metti solo un po' a posto le stampe perchè di primo impatto sembrava che la lista fosse sbagliata, invece la stampava due volte di fila (ad esempio prima dell'ordinamento e dopo, io pensavo già a dei puntatori andati a caso
![]() un loop è quando il programma si mette a fare qualcosa e non ne esce più se non lo interrompe un agente esterno (es: tu). in questo caso c'era qualcosa di sbagliato con i puntatori nella aggiungi e nel main, perchè cercavi di dare a lista2 la lista con un elemento aggiunto a lista, poi le successive funzioni le facevi comunque fare su lista, e lista2 non la usavi mai. non riesco a ricostruire il comportamento che fa diventare la lista un cerchio (l'ultimo nodo punta al primo) ma come output a schermo avevo (se aggiungevo "1"): 1 890852 1 890852 1 890852 1 890852 1 890852 1 890852... (890852 l'ho inventato sul momento, è l'indirizzo di corent (che tu assegnavi a newnodo->info al posto di elemento)). insomma un casino ![]()
__________________
Win 10 x64 - NZXT H440 - Antec TP-750C - AsRock Z77 Extreme4 - Intel Core i5-3570k - 16GB DDR3 Corsair XMS3 1333Mhz CL9 - MSI GTX970 Gaming 4G - Samsung 850 Evo 256GB - WD 4TB Green SATA3 - Maxtor 500GB SATA2 - Seagate 500GB SATA2 - WD 500GB SATA2 - Seagate 160GB IDE - ASUS VW224T @ 1680x1050 @ 60Hz - Creative Inspire T6100 |
![]() |
![]() |
![]() |
#5 |
Member
Iscritto dal: Jan 2013
Messaggi: 205
|
grazie mille!ottima spiegazione
![]() |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 13:45.