Vai al contenuto

Primario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Secondario: Sky Slate Blackcurrant Watermelon Strawberry Orange Banana Apple Emerald Chocolate Marble
Sfondo: Blank Waves Squares Notes Sharp Wood Rockface Leather Honey Vertical Triangles
Corsi di Laurea










ROX @ Unisa - Forum degli studenti di Ingegneria utilizza i cookie. Se prosegui la navigazione accetti il loro uso.    Accetto l'uso dei cookie
-->
Foto

Dubbi sulle liste


  • Effettua l'accesso per rispondere
Questa discussione ha avuto 17 risposta/e

#1
Marco Bassi

Marco Bassi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 575 Messaggi:
In classe abbiamo fatto qualche funzione, ma provando a fare un programmino semplice mi nasce qualche dubbio.

#include
struct Sinfo
{
int a;
int b;
int c;
};
typedef struct Sinfo Tinfo;


struct Snode
{
Tinfo info;
struct Snode *link;
};
typedef struct Snode Tnode;
typedef Tnode *Tlist;

Tnode *node_create(Tinfo elem);
void list_create();
main()
{
Tnode *lista;
lista=list_create();


}
Tnode *node_create(Tinfo elem)
{
Tnode *newnode;
newnode=(Tnode*)malloc(sizeof(Tnode));
if(newnode==NULL)
return NULL;
newnode->info=elem;
return newnode;
}
void list_create()
{
return NULL;
}
è quello che ho scritto, adesso vorrei creare qualche nodo giusto per fare una prova, ma vedo che la funzione di creazione del nodo riceve in ingresso una struttura Tinfo che nel mio caso è formata da int a, intb, int c ... il dubbio è : come faccio a creare questa struttura nel main per poi passarla alla funzione e permettergli di riempirla?



#2
Slashino

Slashino

    Newbie

  • Utente
  • StellaStellaStella
  • 611 Messaggi:
Scusa, non devi prima dichiarare una variabile info di tipo t_info?

#3
Gauss92

Gauss92

    Newbie

  • Utente
  • StellaStellaStella
  • 319 Messaggi:
Supponiamo che il tuo TInfo costituito dai 3 campi a,b,c corrisponda al numero di animali di uno zoo (ho parecchia fantasia :asd: )
a=numero_animali;
b=bonobi;
c=criceti;

Ora vogliamo fare una lista degli animali dei vari zoo d'Italia. Nel main dichiari :

TInfo zoo_fisciano,zoo_salerno..;

zoo_fisciano->bonobi=10;
zoo_fisciano->criceti=10;
zoo_fisciano->numero_animali=zoo_fisciano->bonobi+zoo_fisciano->criceti;

// Lettura con le scanf, devo fare pratica anch'io.

nodo=node_create(Tinfo zoo_fisciano);

Fatto :rofl: sono stato più sintetico possibile :)

PS hai creato un tipo lista come puntatore a nodo ma poi hai dichiarato una lista (nel main) come *lista, potevi anche scrivere Tlist lista;.
Niente MP di aiuto. Postate sul forum, per favore.

#4
Slashino

Slashino

    Newbie

  • Utente
  • StellaStellaStella
  • 611 Messaggi:

zoo_fisciano->bonobi=10;

La freccia prende il posto di (*p).a, quindi non va bene quando non ci sono puntatori in giro....

#5
Gauss92

Gauss92

    Newbie

  • Utente
  • StellaStellaStella
  • 319 Messaggi:
Lo so volevo rendere il concetto :ahsisi: (infatti solo un rigo di quello che è scritto è di qualche utilità )
Niente MP di aiuto. Postate sul forum, per favore.

#6
Slashino

Slashino

    Newbie

  • Utente
  • StellaStellaStella
  • 611 Messaggi:
....stiamo parlando dei bonobi giusto? :)

#7
Gauss92

Gauss92

    Newbie

  • Utente
  • StellaStellaStella
  • 319 Messaggi:
Ci siamo capiti xD
Niente MP di aiuto. Postate sul forum, per favore.

#8
giod82

giod82

    Advanced Member

  • Utente
  • StellaStellaStella
  • 42 Messaggi:
@Metal_Marco

Ti consiglio di utilizzare list_insert per inserire un nuovo elemento alla lista.
Per inserire un elemento nella lista devi fare in questo modo:
crei lista con list_create
inserisci un elemento con list_insert nella quale( se vedi dal libro pag 178 ) viene chiamata la funzione node_create...
in ogni caso per accede agli elementi di una struttura basta usare la notazione puntuale cioè "nomestruttura.elementostrurrura"
main(){
Tinfo info;
info.a=1;
info.b=3;
info.c=4;

}
se invece vuoi accedere ad una struttura di cui hai il puntatore usi la freccia "->"
Per esempio vuoi accede all'elemento "a" della struttura Tinfo "info" della struttura TList l fai così:
l->info.a=12;

Spero di esserti stato di aiuto....
Spoiler

#9
Marco Bassi

Marco Bassi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 575 Messaggi:
vi ringrazio della disponibilità

quello che voglio fare è un semplice ciclo per riempire qualche nodo, nn voglio quindi riempirli dal codice

#10
giod82

giod82

    Advanced Member

  • Utente
  • StellaStellaStella
  • 42 Messaggi:
tipo questo?

for (i=0;i<10;i++)
{
printf("dammi il valore di a : ");
scanf("%d",&info.a);
printf("dammi il valore di b : ");
scanf("%d",&info.B);
printf("dammi il valore di c : ");
scanf("%d",&info.c);
l=list_insert (l,info);
}
oppure?
info.a=info.b=info.c=0;
for (i=0;i<10;i++)
{
info.a+=1;
info.b+=2;
info.a+=3;
l=list_insert (l,info);
}
Spoiler

#11
Marco Bassi

Marco Bassi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 575 Messaggi:
mi spieghi cosa fa?
ti crei ad ogni ciclo una struttura e poi la inserisci nella lista?
la list insert si preoccupa di allocare il nodo? fa tutto lei?

#12
Slashino

Slashino

    Newbie

  • Utente
  • StellaStellaStella
  • 611 Messaggi:
La lettura funziona così: ad ogni ciclo ti crei un puntatore a nodo ( non dimenticarti che è sempre un puntatore ), lo allochi dinamicamente (gli riservi uno spazio utile a contenere un elemento di tipo t_nodo) e lo riempi inserendo la parte utile e il link. Successivamente la tua funzione restituisce il puntatore al nodo che hai appena costruito e che va a finire nella lista. Se vuoi inserire ogni nuovo nodo in testa, per esempio, quando vai a creare il nodo nella parte "link" ci vai a mettere l'indirizzo della lista (visto che il tuo nodo diventerà il primo, quindi punterà al successivo nodo) e restituendo l'indirizzo del nuovo nodo farai in modo che la variabile "lista" punti a questo nodo.
Per un inserimento in testa ( ogni nodo diventa il primo ) nel main succede questo:
[codice-c:3h86oub1]for(i=0;i {
printf("Inserire il valore numero %d \n",i+1);
scanf("%d",&(temp.n)); // temp è di tipo "t_info"
lista=Aggiungi_elem(temp,lista);
}[/codice-c]
mentre la funzione che aggiunge l'elemento e crea il nodo
[codice-c:3h86oub1]t_node* Aggiungi_elem(t_info temp,t_list lista)
{
t_node* new_node;
new_node=(t_node*)malloc(sizeof(t_node));
new_node->info.n=temp.n;
new_node->link=lista;
return new_node;
}[/codice-c]

#13
giod82

giod82

    Advanced Member

  • Utente
  • StellaStellaStella
  • 42 Messaggi:

mi spieghi cosa fa?
ti crei ad ogni ciclo una struttura e poi la inserisci nella lista?
la list insert si preoccupa di allocare il nodo? fa tutto lei?


allora per essere un pò piu chiaro....
quando chiami la funzione list_create non fai altro che che creare un puntatore a lista vuota l->NULL;
quando chiami la funzione list_insert la funzione vede dove inserire il nodo poi chiama node_create per creare un nuovo nodo e posizionarlo nella posizione giusta l->[info|link]->[info|link]->NULL;
quando chiami la funzione node_create crei un oggetto che è composto da un campo info e un campo link new->[info|link];

Devi pensare alle liste come un trenino con i vagoni:
immagina che quando chiami list_create hai solo la locomotiva senza vagoni,
quando chiami node_create crei solo un vagone ma non lo agganci al treno ,
quando chiami list_insert agganci il vagone nel posto giusto e li colleghi tra di loro.

Ti allego un file di esempio in cui inserisco 3 nodi, secondo l'ordine di inserimento, in cui il campo info è costituito da a,b,c.
Se ho capito bene è quello che vorresti realizzare....
Spoiler

#14
Marco Bassi

Marco Bassi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 575 Messaggi:
newnode->info=elem;

con questo prendi tutti i campi della struttura che hai creato, qualunque essi siano, e li metti nel nodo ?

inoltre non ho capito la differenza fra freccia e punto

newnode è una struttura nodo e per accedere al campo tinfo al suo interno faccio newnode->tinfo giusto? e il punto? nel for hai messo info.a ma nn sarebbe info->a secondo quanto detto prima?

#15
Slashino

Slashino

    Newbie

  • Utente
  • StellaStellaStella
  • 611 Messaggi:

newnode->info=elem;
con questo prendi tutti i campi della struttura che hai creato, qualunque essi siano, e li metti nel nodo ?

...sì, le strutture possono essere copiate per intere.

a->b è solo un modo per non scrivere *(a).b che serve quando gestisci quello sta in un nodo (B) tramite il puntatore al nodo (che è "a" ). Se invece non gestisci "b" tramite un puntatore al nodo ma per mezzo della struttura, (semplicemente come variabile strutturata) allora usi a.b

#16
giod82

giod82

    Advanced Member

  • Utente
  • StellaStellaStella
  • 42 Messaggi:
Quoto quello scritto da slashino.....
Mettila così :
quando devi accedere agli elementi di una struttura di cui hai il puntatore usi la "->".
esempio
TNode * newnode;
newnode->link==NULL;

quando devi acedere agli elementi di una struttura di cui hai solo la variabile strutturata usi ".".
esempio
Tinfo Info;
info.a=15;
Spoiler

#17
Marco Bassi

Marco Bassi

    Advanced Member

  • Utente
  • StellaStellaStella
  • 575 Messaggi:
per quanto riguarda la greater se ho ad esempio tre interi per deecidere quale struttura è più grande devo semplicemente decidere io il metodo ?

#18
Slashino

Slashino

    Newbie

  • Utente
  • StellaStellaStella
  • 611 Messaggi:
Sì il criterio lo scegli tu, così come per esempio la strcmp confronta due stringhe secondo l'ordine lessico-grafico...




Leggono questa discussione 0 utenti

0 utenti, 0 ospiti, 0 utenti anonimi