Lista Utenti taggati

Risultati da 1 a 4 di 4

Discussione: [C] aggiungere elementi in una lista

  1. #1
    Utente Attivo
    Data Registrazione
    14-11-11
    Messaggi
    24
    Specifiche del sistema
    Ringraziamenti / Mi Piace
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Predefinito [C] aggiungere elementi in una lista

    Buon giorno a tutti sto scrivendo un piccolo programma che
    1) mi crea una lista di interi presi da input
    2) per ogni numero ne stampa il divisore
    3) inserisce tutti i divisori in una nuova lista.

    il punto 1 e 2 funzionano o meglio sono riuscito a mio modo a farli funzionare...mi manca il punto 3 non riesco ad inserire i divisori nella nuova lista

    Codice:
    #include<stdio.h>#include<stdlib.h>
    
    
    struct list{
           int inf;
           int div;
           struct list *next;
           };
           
           struct lista{
           int info;
           struct lista *next;
           };
           
    
    
    struct list *crealista();
    void stampa(struct list *l);
    void primo(struct list *l);
    void stampar(struct list*);
    int main(){
        struct list *el;
        int s;
        printf("--- Creazione lista ---\n");
        el=crealista();
        primo(el);
        printf("Che tipo di stampa vuoi adottare (1=ricorsiva, 0=normale). ");
        scanf("%d",&s);
        if(s==1){
                  printf("La lista inserita e': ");
                  stampar(el);
                 }
        else{
              stampa(el);
              }
        
        
        system("PAUSE");
        return 0;
    }
    
    
    struct list *crealista(){
           struct list *p,*punt;
           int n,i;
           
           printf("Quanti elementi vuoi inserire?");
           scanf("%d",&n);
           
           if(n==0){ p=NULL; }
           
           else{
                p=(struct list *)malloc(sizeof(struct list));
                printf("Inserisci numero: ");
                scanf("%d",&p->inf);
                punt=p;
                
                for(i=0;i<n-1;i++){
                                 punt->next=(struct list *)malloc(sizeof(struct list));
                                 punt=punt->next;
                                 printf("Inserisci numero: ");
                                 scanf("%d",&punt->inf);
                                 }
                                 punt->next=NULL;
                                 }
                                 return p;
                                 }
    
    
    
    
                            
                            
    void stampa(struct list *l){                             
                  printf("Stampa lista ->\n");          
                  while(l!=NULL){          
                  printf("%d\t",l->inf);
                  
                  l=l->next;
                  }
                  
                  printf("\n");
                  }
                  
                  
         
                  
    void stampar(struct list *l){
        
         if(l!=NULL){
                     printf("%d  ",l->inf);
                     stampar(l->next);
              }
         
    }
    
    
    void primo(struct list *l){
        
         struct list *ln;
         int i=0;
         int cont=0;
        
         while(l!=NULL){
                  for(i=(l->inf)-1;i>1;i--){
                  if(l->inf % i ==0){
                            printf("Il numero %d e' divisibile per %d . \n",l->inf,i);
                          /* qui penso dovrebbe andare la funzione che prenda in input la "i" e la inserisca nella seconda lista */
                            cont++;
                            
                            
                            }
                            }
                            if(cont==0){
                                 printf("Il numero %d e' primo.\n",l->inf);
                                 }
                                  l=l->next;
                                 }
                                 
    
    
           
    }

    grazie anticipatamente

  2.  
    Stanco della Pubblicità? Registrati

  3. #2
    Utente Attivo
    Data Registrazione
    08-07-11
    Messaggi
    5
    Specifiche del sistema
    Ringraziamenti / Mi Piace
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Predefinito

    Citazione Originariamente Scritto da Trigun86 Visualizza Messaggio
    3) inserisce tutti i divisori in una nuova lista.
    Per fare questo tipo di operazione, dovresti cambiare un po la struttura della lista e fare una funzione che prenda in ingresso due valori (divisore e numero) e li aggiunga alla lista adibita a contenerli.
    Dovrebbe essere una cosa del tipo
    Codice:
     
    include<malloc.h>
    
    struct elem
    {
        //e' la rappresentazione del singolo elemento della lista
    
        int div;//dato 1
        int info;//dato 2
        struct elem* next;//puntatore all'elemento successivo
    };
    
    struct list
    {
         /*e' la rappresentazione dell'oggetto lista che
            mantiene solo il puntatore al primo elemento della stessa
          */
         struct elem* primo;//puntatore al primo elemento della lista
    };
    
    /*DEVI CHIAMARE QUESTA FUNZIONE NELLA FUNZIONE DOVE VUOI USARE 
        LA LISTA DOPO AVER DICHIARATO UN ISTANZA DI list E PRIMA DI EFFETTUARE QUALSIASI OPERAZIONE SULLA LISTA 
     es:
    __tipo__ funzione(...,...,...)
    {
       struct list l;
       inizializza(&l);
       ...
       ...
      aggiungi_elem(&l,4,2);
      ...
       return __tipo__;
    }
    */
    void inizializza(struct list* l)
    {
        //inizializza la lista vuota ponendo a NULL il primo elemento della lista
         l->primo=NULL;
    }
    
    struct list* aggiungi_elem(struct list* l,int info,int div)
    {  //creo un nuovo elemento
       struct elem * nuovo =(struct elem *) malloc(sizeof(struct elem));
       nuovo->info=info;
       nuovo->div =div;
       
       /*se il puntatore al primo elemento e' null
          allora la lista e' vuota
        */
    if(l->primo==NULL)
    {
          nuovo->next=NULL;//il suo successivo e' NULL perche'  e' il primo
          l->primo=nuovo;//primo punta al nuovo elemento
    }
    else
    {
        /*se primo non e' NULL allora inserisco il nuovo elemento
           in testa alla lista
         */
          nuovo->next = l->primo;//il successivo di nuovo e' il primo della lista
          l->primo=nuovo;//il primo della lista diventa il nuovo elem
    
    }//fine if-else
    
    }//fine funzione
    
    Cosi' riuscirai sicuramente ad inserire elementi nella lista...come l'hai fatta tu va bene se vuoi creare una lista e poi lasciarla stare cosi' com'e' senza possibilita' di modifica ulteriore alla procedura di creazione....ma senza mantenere dei puntatori all'inizio della lista e senza creare un entita' elemento, e' difficile creare funzioni che inseriscano o eliminino elementi in una lista.
    Ultima modifica di foxjv; 25-01-2012 alle 19:27

  4. #3
    Utente Attivo
    Data Registrazione
    14-11-11
    Messaggi
    24
    Specifiche del sistema
    Ringraziamenti / Mi Piace
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Predefinito Re: [C] aggiungere elementi in una lista

    grazie 1000 molto esaustivo... vorrei chiederti un ultima cosa
    ho una struttura di questo tipo :
    Codice:
    typedef struct autore{       int id;
           char nome[20];
           char cognome [20];
           int brani;
           struct autore *succ;
           }autore;
    
    typedef struct autore *next;
    
    
    e un prototipo di  funzione che mi inserisce nel file n strutture di questo tipo:     void crea_lista(FILE *, autore **);
    all'interno del main richiamo la funzione cosi: crea_lista(mio_file, &head);
    
    come faccio ad inserire gli elementi nella struttura e successivamente nel file? devo attenermi a questo prototipo senza modificarlo,
    ho provato a scrivere cosi:  
                         printf("inserisci id: ");                      scanf("%d",(*s)->id);
                          printf("inserisci il nome: ");
                          scanf("%s",(*s)->nome);
                          
                          printf("inserisci il conome: ");
                          scanf("%s",(*s)->cognome);
                          printf("inserisci numero opere: ");
                          scanf("%d",&(*s)->brani);
    
    
    ma mi crasha tutto non dandomi errori di sintassi
    ;
    ho un doppio puntatore su autore ma non so come usarlo...grazie per l'aiuto

  5. #4
    Utente Attivo
    Data Registrazione
    08-07-11
    Messaggi
    5
    Specifiche del sistema
    Ringraziamenti / Mi Piace
    Mentioned
    0 Post(s)
    Tagged
    0 Thread(s)

    Predefinito Re: [C] aggiungere elementi in una lista

    Solo una cosa non capisco...perche' dopo aver dichiarato
    "typedef struct autore{...}autore;"
    riscrivi di nuovo
    "typedef struct autore *next;"
    Dovresti usare solo
    "autore* next;"

    per inserire le informazioni nella struttura puoi fare come hai fatto tu, pero' se metti l'asterisco non devi usare l'operatore freccia -> ; infatti:
    (*s).dato e' equivalente a s->dato
    e' solo una scrittura piu' compatta.
    La dicitura autore** individua l'indirizzo della variabile puntatore alla lista di "autore"...quindi siccome hai un doppio puntatore, devi dereferenziare 2 volte il puntatore per accedere al dato..se non sbaglio dovrebbe essere una cosa del tipo:

    scanf(%d,s->id);
    infatti in questo modo avrai come argomento della scanf proprio l'indirizzo del dato id nella struttura s che e' proprio quello che si aspetta..la scanf prende come argomento l'indirizzo della variabile in cui scrivere il dato se ti fosse sfuggito, quindi probabilmente il crash e' dovuto a quello...dereferenziando due volte il puntatore ottieni il dato...il che sintatticamente e' corretto ma non e' quello che si aspetta la scanf come ti ripeto. Non so se mi sono spiegato e se ti ho risposto esaustivamente..ma se hai problemi non devi far altro che chiedere...
    Hello World!!!

  6.  
    Stanco della Pubblicità? Registrati

Informazioni Discussione

Utenti che Stanno Visualizzando Questa Discussione

Ci sono attualmente 1 utenti che stanno visualizzando questa discussione. (0 utenti e 1 ospiti)

Discussioni Simili

  1. [C++] Inizializzazione ed inserimento in una lista.
    Di Erunno nel forum Programmazione
    Risposte: 1
    Ultimo Messaggio: 24-01-2012, 23:46
  2. [C] Somma elementi colonne di una matrice
    Di e_ale92 nel forum Programmazione
    Risposte: 11
    Ultimo Messaggio: 03-12-2011, 18:51
  3. aggiungere una 6970m
    Di astarsheran nel forum Portatili, tablet e PC all-in-one
    Risposte: 8
    Ultimo Messaggio: 24-07-2011, 10:19
  4. aggiungere pc ad una lan
    Di mike3000 nel forum Network
    Risposte: 2
    Ultimo Messaggio: 08-06-2009, 12:38
  5. Ho bisogno di una lista delle gpu
    Di teodargent nel forum Schede video
    Risposte: 20
    Ultimo Messaggio: 18-10-2008, 14:22

Permessi di Scrittura

  • Tu non puoi inviare nuove discussioni
  • Tu non puoi inviare risposte
  • Tu non puoi inviare allegati
  • Tu non puoi modificare i tuoi messaggi
  •  
Torna Su