PDA

Visualizza la versione completa : [C] Problemi con liste e funzioni


Alcott
06-10-2005, 14:49
Ciao a tutti.
Sono ormai da ore che provo a cercare l'errore in questo codice ma non riesco a venirne a capo. Spero qualcuno riesca a farmi luce. In pratica non mi modifica firstVertex facendolo rimanere sempre NULL. Come mai? Ve lo posto:


typedef struct node *edgeInfo; //Informazione su un arco della rete

typedef struct node {
int secondVertex;
int edgeCost;
edgeInfo nextAdj;
} edge;

.....

firstVertex = NULL;

srand((unsigned) time(&t)); //genera un seme casuale basato sul tempo per rand() a riga 71
for(i=0; i<numNodi; i++)
{
power = rand() % 12; // genera un valore casuale da 0 a 11
if (power == 0) i--; // elimino le istanze pari a 0
else
{
if (power == 11) power = 50; // massima distanza
printf("%d: %d \n", i, power);
pnt1 = creaStruct(i, power);
aux = scorriLista(firstVertex, i);
assegnaAux(aux, pnt1)
}
}

......

edgeInfo creaStruct(int sV, int eC)
{
edgeInfo pnt;

pnt = (edgeInfo) malloc (sizeof(edge));
pnt->secondVertex = sV;
pnt->edgeCost = eC;
pnt->nextAdj = NULL;
return pnt;
}

edgeInfo scorriLista(edgeInfo pnt, int i)
{
edgeInfo aux;

aux = pnt;
if (aux == NULL)
return aux;
while(aux->nextAdj != NULL)
aux = aux->nextAdj;
return aux;
}


void assegnaAux(edgeInfo aux, edgeInfo pnt)
{
if (aux==NULL)
aux = pnt;
else
aux->nextAdj = pnt;
}
Grazie :ciauz:

byaur
06-10-2005, 19:35
innanzi tutto come dichiari firstVertex??
secondo io


typedef struct node *edgeInfo; //Informazione su un arco della rete

typedef struct node {
int secondVertex;
int edgeCost;
edgeInfo nextAdj;
} edge;

l'avrei scritto, anche per maggior comprensione,


typedef struct node {
int secondVertex;
int edgeCost;
struct node *nextAdj;
} edge;
typedef edge *edgeInfo; //Informazione su un arco della rete(più che
//informazione è un puntatore..stai attento che non è il contenitore vero e
//proprio ma il puntatore)


:ciauz:

Alcott
06-10-2005, 20:20
Hai ragione. Piccola dimenticanza...
firstVertex è di tipo edgeInfo.
:ciauz:

byaur
06-10-2005, 21:06
riguardando bene la tua funzione, l'unica che "potrebbe" modificare il puntatore cioè scorriLista(), non modificherà mai il valore di firstVertex, perchè:
- è passata per valore(infatti il C non ha il passaggio di parametri per riferimento)
- poi proprio nella funzione stessa assegni al puntatore temporaneo il valore del parametro e poi esegui tutto con il puntatore temporaneo ritornandolo...
insomma vuoi che si giochi a pallone ma poi giochi a basket!!! :zizi: :zizi:

inoltre che dovrebbe fare a parole la funzione?? scorrere solo la lista?
che ti aspetti di trovare alla fine dell'esecuzione in firstVertex??
:ciauz:

Loading