PDA

Visualizza la versione completa : [C] Collegare elementi di una lista


donato.sciarra
17-02-2007, 16:40
Oggi e' un giorno particolare sono quasi vicino nel capire le liste :biifu:

Vediamo se qualche anima pia dispersa in questo forum, e' cosi volenterosa da darmi una mano...

So che esistono vari tipi di strutture dinamiche (liste, code, pile, alberi) tutte un po simili tra di loro chi con un puntatore in piu chi con uno in meno... :stordita:

Per ora mi limito a studiare quelle semplici semplici,

LISTA MONODIREZIONALE:

mi baso su questa struttura dinamica


struct nodo{
char data[50];
struct nodo *next;
}
struct nodo *lista=NULL;
struct nodo el;


definisco questa funzione



struct nodo *creaelemento(void){
struct nodo *temp;
temp=(struct nodo*)malloc(sizeof(struct nodo));
if(temp!=NULL){
printf("Valore da inserire: ");
scanf("%s", temp->data);
temp->next=NULL;
return (temp);
}
else{
printf("Impossibile allocare");
return;
}
}


con questa funzione vado nel main e ci metto:



elemento=creaelemento();


assegna ad elemento una nuova area di memoria del tipo struct nodo con all'interno il valore richiesto a terminale. . . .

A questo punto ecco le mie domande:

1- come faccio a collegarlo?
2- in questo caso ho definito UN elemento, per definirne altri, e collegarli in successione? (ponendo il caso che a priori non conosca quanti nuovi elementi devo inserire)

ciao ciao

e grazie

:ciauz:

oregon
17-02-2007, 16:50
Intanto direi di modificare la funzione cosi' ...



struct nodo *creaelemento(void)
{
struct nodo *temp;
temp=(struct nodo*)malloc(sizeof(struct nodo));
if(temp)
{
printf("Valore da inserire: ");
scanf("%s", temp->data);
temp->next=NULL;
}
else
printf("Impossibile allocare");

return (temp);
}


Poi, per le domande ...



1- come faccio a collegarlo?


La tua lista inizia da qualche parte ...

Avrai definito nel main la "testa" della lista, ovvero un puntatore al primo elemento della lista, che inizialmente sara' NULL.

A questo punto, potrai inserire il nuovo elemento facendo puntare la testa della lista al nuovo elemento e mettendo il vecchio valore del puntatore alla testa nel puntatore del primo elemento.



2- in questo caso ho definito UN elemento, per definirne altri, e collegarli in successione? (ponendo il caso che a priori non conosca quanti nuovi elementi devo inserire)


Farai tante volte quanto ti serve quello ho appena descritto.

P.S. Modifica il titolo ...

donato.sciarra
17-02-2007, 17:00
Originariamente inviato da oregon
La tua lista inizia da qualche parte ...

Avrai definito nel main la "testa" della lista, ovvero un puntatore al primo elemento della lista, che inizialmente sara' NULL.

Ho inizializzato a livello globale

struct nodo *lista=NULL;

. . .nn va bene farlo cosi?



A questo punto, potrai inserire il nuovo elemento facendo puntare la testa della lista al nuovo elemento e mettendo il vecchio valore del puntatore alla testa nel puntatore del primo elemento.

Farai tante volte quanto ti serve quello ho appena descritto.


chiedo troppo se mi fai un esempio. . . .riuscirei a capire meglio !

P.S.
ma come ti chiamavano flesh gordon?? :stordita:

oregon
17-02-2007, 17:06
Originariamente inviato da donato.sciarra
Ho inizializzato a livello globale

struct nodo *lista=NULL;

. . .nn va bene farlo cosi?


Sì ... va bene ...



chiedo troppo se mi fai un esempio. . . .riuscirei a capire meglio !


Scrivendo al volo ...



struct nodo *nuovo;

nuovo = creaelemento();
if(nuovo)
{
nuovo->next = lista;
lista = nuovo;
}

donato.sciarra
17-02-2007, 17:35
:oVVoVe:

vediamo se ho capito:


struct nodo *nuovo; /*crea un nuovo puntatore alla struttura della lista*/

nuovo = creaelemento(); /*assegno a nuovo l'area di memoria allocata con il dato chiesto a terminale*/
if(nuovo){/*se non e' NULL*/
nuovo->next = lista;/*raggiungo il campo next nell'area di heap allocata e assegno a next l'indirizzo contenuto in lista(praticamente NULL)*/
lista = nuovo;/*e al puntatore lista assegno l'indirizzo contenuto in nuovo, quindi ora tramite lista posso accedere all'area creata dinamicamente (nell'heap)*/
}



ho ancora un dubbio, ma come faccio per creare nuovi elementi????????
nn riesco a capirlo :cry: :cry:
cioè io per creare un nuovo nodo della lista devo creare un nuovo puntatore a cui andrò ad assegnarci tramite la funzione creaelemento() una nuova area di memoria, ma se non conosco quanti elementi devo creare come faccio poi a crearne di nuovi? non so se riesco ad essere chiaro . . .

in questo esempio per creare il nodo e' stato creato un nuovo puntatore alla struttura

struct nodo *nuovo;

a cui poi tramite la funzione creaelemento() gli e' stata assegnata la nuova area di memoria. . .

ma se dovessi crearne un altro?
come faccio in runtime a definire un nuovo puntatore alla struttura?
Mettiamo che devo costruire un programma che chiede a terminale dei valori e gli inserisce uno per uno nella lista fin quando l'utente non digitata lo zero (banale se fosse un vettore).
Io nn conosco quanti elementi l'utente tenterà di inserire!
Come posso gestire questo caso?

Lak3d
17-02-2007, 17:50
nuovo->next=lista; così a occhio credo non serva.
Già in creaelemento() lo fai puntare a null.

volendo comunque puoi passare alla funzione l'indirizzo di memoria del puntatore (un puntatore a puntatore) e invece di far ritornare un puntatore alla funzione creaelemento, modifichi l'indirizzo a cui punta direttamente nella funzione. alla fine della fiera comunque non cambia nulla.


Originariamente inviato da donato.sciarra

Mettiamo che devo costruire un programma che chiede a terminale dei valori e gli inserisce uno per uno nella lista fin quando l'utente non digitata lo zero (banale se fosse un vettore).
Io nn conosco quanti elementi l'utente tenterà di inserire!
Come posso gestire questo caso?

usi un ciclo while...

donato.sciarra
17-02-2007, 17:54
potresti farmi un esempio???

basandoti su quanto scritto in precedenza . . . :zizi: che gia ci sto a capì poco. . .

Lak3d
17-02-2007, 18:07
printf("Valore da inserire: ");
scanf("%d", &val);
while(val){
creaelemento(val);
printf("Valore da inserire: ");
scanf("%d", &val);
}

ovviamente modificando la funzione creaelemento di conseguenza...

donato.sciarra
17-02-2007, 18:14
cioè?

in che modo.....di conseguenza?

perche come l'hai scritta e'chiaro che non funziona....cosa c'è da aggiungere nella funzione creaelemento() ?

Lak3d
17-02-2007, 18:37
direi che non c'è nulla da aggiungere, semmai devi togliere la parte che ho messo nel ciclo while, quella di richiesta del valore.


struct nodo *creaelemento(int val)
{
struct nodo *temp;
temp=(struct nodo*)malloc(sizeof(struct nodo));
if(temp)
{
temp->data=val;
temp->next=NULL;
}
else
printf("Impossibile allocare");

return (temp);
}

Il mio ciclo while era in risposta alla tua domanda "come fare per gestire un numero di inserimenti non noti a priori da concludersi alla digitazione dello zero"...

Loading