PDA

Visualizza la versione completa : [C] Liste e nodi


slashino
25-04-2012, 10:47
Salve a tutti, vorrei porvi alcune domande riguardo la gestione delle liste. In particolare:
- una lista è un vettore di nodi
-ogni nodo è un tipo strutturato "t_node" che contiene un'informazione utile "info" di tipo" t_info" e un riferimento per spostarsi al prossimo nodo "link" di tipo "t_node*".
Supponiamo che la info di ogni nodo sia strutturata come :


struct s_nodo
{
int eta;
struct s_nodo* next;
};

.. che io voglia creare una lista di N nodi con delle "eta" lette da tastiera.
Definisco il tipo "t_nodo"


typedef struct s_nodo t_nodo;

e quindi definisico il tipo "t_lista" della lista, ricordando che una lista è identificata dal puntatore al suo primo nodo:


typedef t_nodo* t_lista;

...e la dichiaro:


t_lista lista;

A questo punto, per creare la lista VUOTA inizializzo a NULL il puntatore:


lista=NULL;

Ora come devo fare a creare gli N nodi? Il prototipo della funzione è :


t_nodo*node_create(t_info);

che restituisce un puntatore al tipo t_nodo, quindi in pratica, nel creare più nodi, non faccio altro che creare un vettore di nodi ( che è una lista :confused: ). Successivamente devo far puntare "lista" al primo elemento del vettore di nodi o al vettore di nodi intero??
Qualcuno potrebbe chiarirmi le idee? :)

oregon
25-04-2012, 11:31
1) crea il nuovo nodo con la malloc

2) scorri la lista a partire dall'inizio fino al puntatore NULL che sostituirai con il puntatore al nuovo nodo

slashino
25-04-2012, 14:09
Originariamente inviato da oregon
1) crea il nuovo nodo con la malloc

ma quindi alloco spazio ad un puntatore a t_nodo di dimensione pari al numero di nodi?

oregon
25-04-2012, 19:08
Non pari al "numero di nodi" (dato che il nodo da aggiungere è uno) ma alle dimensioni di un nodo ovvero sizeof(t_nodo)

slashino
25-04-2012, 19:14
Mettiamo caso che voglio leggere da tastiera le informazioni riguardo tre persone, dove ogni informazione è formata da nome, cognome ed età. E voglio inserire questi dati in una lista che conterrà 3 nodi...come devo fare?

oregon
25-04-2012, 19:41
Ti ho detto come fare per un solo nodo. Ripeti la procedura tre volte con un ciclo for.

slashino
25-04-2012, 20:14
Purtroppo non ci riesco :( Se la lista è un vettore di nodi, allora per spostarmi da un nodo all'altro non basta che incremento semplicemente l'indice? Non potresti farmi un esempio?

oregon
25-04-2012, 20:18
Studia un po' questo

http://lonati.dsi.unimi.it/algo/0910/lab/T08.pdf

slashino
25-04-2012, 20:56
int main()
{
struct s_node
{
int utile;
struct s_node* link;
};
typedef struct s_node t_node;
typedef t_node *t_list;
t_list lista;
lista=NULL;
t_node *new_node;
new_node=(t_node*)malloc(sizeof(t_node));
new_node->utile=10;
new_node->link=NULL;
lista=new_node;
printf("%d\n",(*lista).utile);
new_node=(t_node*)malloc(sizeof(t_node));
new_node->utile=20;
new_node->link=NULL;
(*lista).link=new_node;
printf("%d\n", *((*lista).link));
new_node=(t_node*)malloc(sizeof(t_node));
new_node->utile=30;
new_node->link=NULL;
(*((*lista).link)).link=new_node;

return EXIT_SUCCESS;
}

Ho scritto questo, e sembra andare, ma ho la sensazione che non sia normale l'aggiunta di un operatore di dereferenziamento per ogni aggiunta di nodo :(

oregon
25-04-2012, 21:02
Non ho controllato il codice ma quello che devi fare prima di tutto è scrivere una funzione generica per l'aggiunta di un nuovo nodo da chiamare quando ti serve (come negli appunti che ti ho mostrato).

Non devi ripetere lo stesso codice nel main più volte!

Per la visualizzazione dei dati, dovrai fare una funzione generica per la ricerca che "attraversi" la lista e arrivi al tuo dato (sempre negli appunti), sicuramente non tutto "staticamente" nel main!

P.S. La struct e le typedef mettile fuori dal main e queste

t_list lista;
lista=NULL;

le scrivi direttamente

t_list lista = NULL;

Loading