PDA

View Full Version : [C]Liste non aggiunge al primo elemento


sam333
07-02-2013, 20:21
#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?

M@Rk0
07-02-2013, 20:35
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);
}

sam333
08-02-2013, 13:34
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

M@Rk0
08-02-2013, 16:56
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:

sam333
08-02-2013, 18:32
grazie mille!ottima spiegazione:)