PDA

Visualizza la versione completa : [C] Problema creazione lista


Devour
24-04-2013, 13:03
Salve a tutti! Sto scrivendo un semplice programma c che prenda da standard input una serie di interi, li inserisca in una lista e poi stampi la lista. Ecco il codice:



#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>

struct nodo {
int val;
struct nodo *next; //puntatore al nodo successivo
};

void inserisci_valore(int num, struct nodo **pnext);
struct nodo *alloca_mem();
void stampa_lista(struct nodo *p);
void inserisci_inlista(struct nodo *nuovo, struct nodo **pnext);


int main(int argc, char *argv[])
{
int num;
struct nodo *testa_lista =NULL; //all'inizio la lista è vuota

if (argc!=1)
{ /*l'utente non dovrebbe inserire argomenti*/
fprintf(stderr, "Usage %s [<file] [>file]\n ", argv[0]);
return(EXIT_FAILURE);
}

/*lettura dallo standard input*/
while(feof(stdin)==0){
if(scanf("%d", &num)==1)
{
inserisci_valore(num,&testa_lista);
}
}

stampa_lista(testa_lista);

return EXIT_SUCCESS;

}

void inserisci_valore(int num, struct nodo **phead)
{
struct nodo *nuovo;
nuovo=alloca_mem();
nuovo->val=num;

inserisci_inlista(nuovo,phead);
}

void inserisci_inlista(struct nodo *nuovo, struct nodo **pnext){

struct nodo *p;
nuovo->next=*pnext;
*pnext= nuovo;

}


struct nodo *alloca_mem(void)
{
struct nodo *p;
p=malloc(sizeof(struct nodo));
if(p==NULL)
{
fprintf(stderr,"Errore nell'allocazione della memoria\n");
exit(EXIT_FAILURE);
}
return p;
}


void stampa_lista(struct nodo *p)
{
struct nodo *n;
if (p==NULL)
printf ("Impossibile stampare,lista vuota!\n");

for(n=p; n!=NULL; n=n->next)
{
printf( "%d \n", p->val);
}
}


Il problema è che se inserisco per esempio 3 4 5 6 mi viene stampato:
6
6
6
6

cosa sto sbagliando?? :(

deleted_129
24-04-2013, 14:14
l'ultima riga...sul printf...tu dici che l'intero è p->val deve essere n->val ...

Devour
24-04-2013, 14:31
grazie! adesso mi stampa tutti i valori inseriti..il problema è che però me li stampa al contrario:

input: 3 6 5 7 9

output:
9
7
5
6
3

:(

deleted_129
24-04-2013, 14:33
Quando metti un elemento lo metti in TESTA...è normale che li stampa in quel modo...per stamparli in "ordine" devi usare un altro metodo..per metterli in CODA...cerca su internet o studia se sei dell'università... in ogni caso ti possiamo aiutare..basta che parti da una base...

Devour
24-04-2013, 14:35
ok..continuerò da sola grazie..

deleted_129
24-04-2013, 15:00
puoi usare una cosa del genere


void aggiungicoda(int m,struct nodo *p){
if(p==NULL){
printf("\nDevi prima creare una lista.\n");
}else{
struct nodo *c;
struct nodo *f=p;
struct nodo *b=p;
c=(struct nodo*)malloc(sizeof(struct nodo));
c->x=m;
while(f->next != NULL){
f=f->next;
}
f->next=c;
c->next=NULL;
}
return;
}


studia questa se vuoi :)

Devour
24-04-2013, 15:27
ti ringrazio :)

Devour
24-04-2013, 15:56
risolto :) ecco qui il codice:



void inserisci_in_coda(struct nodo **testa, int num)
{
struct nodo *nuovo;
nuovo=alloca_mem();
nuovo->val=num;
struct nodo *n=*testa;

if(*testa==NULL)
*testa=nuovo;
else
{
while(n->next != NULL)
{
n=n->next;
}
n->next=nuovo;
nuovo->next=NULL;
}
}


grazie ancora!

deleted_129
25-04-2013, 00:40
figurati!

Loading