View Full Version : [C]Liste non aggiunge al primo elemento
#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:D come potete vedere sto cercando di gestire le liste:) ma non capisco come mai non mi aggiunge il primo elemento...mi spiego....
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?
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 :asd:
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 :D
#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);
}
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 :asd:
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 :D
#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);
}
#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:) ...ora va bene così?
ma di preciso il loop cosa sarebbe?come lo evito?grazie ancora per l'aiuto:D
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 :asd:).
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 :asd:
grazie mille!ottima spiegazione:)
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.