Visualizzazione dei risultati da 1 a 9 su 9
  1. #1
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80

    [C] Problema creazione lista

    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:

    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??

  2. #2
    l'ultima riga...sul printf...tu dici che l'intero è p->val deve essere n->val ...

  3. #3
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80
    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


  4. #4
    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...

  5. #5
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80
    ok..continuerò da sola grazie..

  6. #6
    puoi usare una cosa del genere
    codice:
    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

  7. #7
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80
    ti ringrazio

  8. #8
    Utente di HTML.it
    Registrato dal
    Jul 2011
    Messaggi
    80
    risolto ecco qui il codice:
    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!

  9. #9

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.