[C] aggiungere elementi in una lista

Pubblicità

Trigun86

Utente Attivo
Messaggi
24
Reazioni
0
Punteggio
25
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);
                      [COLOR=#ff0000]/* qui penso dovrebbe andare la funzione che prenda in input la "i" e la inserisca nella seconda lista */[/COLOR]
                        cont++;
                        
                        
                        }
                        }
                        if(cont==0){
                             printf("Il numero %d e' primo.\n",l->inf);
                             }
                              l=l->next;
                             }
                             


       
}

grazie anticipatamente
 
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
{
   [COLOR="#0000FF"] //e' la rappresentazione del singolo elemento della lista[/COLOR]

    int div;[COLOR="#0000FF"]//dato 1[/COLOR]
    int info;[COLOR="#0000FF"]//dato 2[/COLOR]
    struct elem* next;[COLOR="#0000FF"]//puntatore all'elemento successivo[/COLOR]
};

struct list
{
[COLOR="#0000FF"]     /*e' la rappresentazione dell'oggetto lista che
        mantiene solo il puntatore al primo elemento della stessa
      */[/COLOR]
     struct elem* primo;//puntatore al primo elemento della lista
};

[COLOR="#0000FF"]/*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__;
}
*/[/COLOR]
void inizializza(struct list* l)
{
    [COLOR="#0000FF"]//inizializza la lista vuota ponendo a NULL il primo elemento della lista[/COLOR]
     l->primo=NULL;
}

struct list* aggiungi_elem(struct list* l,int info,int div)
{ [COLOR="#0000FF"] //creo un nuovo elemento[/COLOR]
   struct elem * nuovo =(struct elem *) malloc(sizeof(struct elem));
   nuovo->info=info;
   nuovo->div =div;
   
[COLOR="#0000FF"]   /*se il puntatore al primo elemento e' null
      allora la lista e' vuota
    */[/COLOR]
if(l->primo==NULL)
{
      nuovo->next=NULL;[COLOR="#0000FF"]//il suo successivo e' NULL perche'  e' il primo[/COLOR]
      l->primo=nuovo;[COLOR="#0000FF"]//primo punta al nuovo elemento[/COLOR]
}
else
{
[COLOR="#0000FF"]    /*se primo non e' NULL allora inserisco il nuovo elemento
       in testa alla lista
     */[/COLOR]
      nuovo->next = l->primo;[COLOR="#0000FF"]//il successivo di nuovo e' il primo della lista[/COLOR]
      l->primo=nuovo;[COLOR="#0000FF"]//il primo della lista diventa il nuovo elem[/COLOR]

}[COLOR="#0000FF"]//fine if-else[/COLOR]

}[COLOR="#0000FF"]//fine funzione
[/COLOR]

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:
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
 
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...;)
 
Pubblicità
Pubblicità
Indietro
Top