2011-02-09 3 views
7

mio approccio:trattare con array di lista collegata

Un array di lunghezza fissa (diciamo 20) ogni elemento è puntatore al primo nodo di una lista collegata. quindi ho 20 diversi elenchi collegati.

Questa è la struttura:

struct node{ 
     char data[16]; 
     struct node *next; 
}; 

La mia dichiarazione per tale matrice

struct node *nodesArr[20]; 

ora per aggiungere un nuovo nodo ad uno della lista collegata, faccio questo:

struct node *temp; 

temp = nodesArr[i]; // i is declared and its less than 20 
addNode(temp,word); // word is declared (char *word) and has a value ("hello") 

La funzione addNode:

void addNode(struct node *q, char *d){ 
    if(q == NULL) 
     q = malloc(sizeof(struct node)); 
    else{ 
     while(q->next != NULL) 
      q = q->next; 

     q->next = malloc(sizeof(struct node)); 
     q = q->next; 
    } 

    q->data = d; // this must done using strncpy 
    q->next = NULL; 
} 

e per stampare i dati dalla matrice di lista collegata, faccio questo:

void print(){ 
    int i; 
    struct node *temp; 

    for(i=0 ; i < 20; i++){ 
     temp = nodesArr[i]; 
     while(temp != NULL){ 
      printf("%s\n",temp->data); 
      temp = temp->next; 
     } 
    } 
} 

ora compilatore dà nessun errore, l'esecuzione del programma e mi passa i dati ad esso, e quando mi chiamano di stampa è non stampa niente ??

AGGIORNAMENTO ::

dopo ho modificato il codice (thx per voi), penso che il problema nella funzione di stampa ,, qualche idea?

+1

Avete provato a passarlo attraverso un debugger o aggiungendo utili istruzioni 'printf'? –

+0

sì, ho provato, ma non ho ottenuto nulla –

+1

Non hai niente? Quindi non è possibile, ad esempio, scoprire a che punto tutti gli elementi di 'nodesArr' sono diventati' NULL'? –

risposta

5

Il problema si trova in addNode(). Quando l'elenco è vuoto si fa:

q = malloc(sizeof(struct node)); 

ma il campo di applicazione è limitato a qaddNode(). Si dovrebbe avere dichiarato addNode() come

void addNode(struct node **q, char *d) 

e regolare il codice di conseguenza:

*q = malloc(sizeof(struct node)); 

e così via ...

+0

in modo che q = q-> next, dovrebbe essere così, * q = * q-> next, o (* q) -> next ?? –

+0

Se rende tutto più semplice, una volta assegnato, è possibile assegnare l'indirizzo puntato a un singolo puntatore e mantenere il resto del codice più o meno come se fosse ora. 'struct node * sp;' e successivamente 'sp = * q' –

+0

@Rami Jarrar: Devi usare' * q = (* q) -> next'. Il guru C [dirà] (http://www.difranco.net/cop2220/op-prec.htm) che '->' ha una precedenza più alta rispetto all'operatore di dereferenziazione. Il resto di noi usa solo una coppia di parentesi e non si preoccupa più di pensarci. – thkala

3

Quando si passa struct node *q a addNode si sta assegnando un indirizzo per un elemento nell'array. Se si utilizza malloc all'interno, si sta sovrascrivendo questa variabile q, che è locale per la funzione e ora punta a qualcosa di diverso, ma non è stato modificato l'array originale. Prova a utilizzare un puntatore al puntatore al nodo (struct node **q).

2
void addNode(struct node *q, char *d){ 
    if(q == NULL) 
     q = malloc(sizeof(struct node)); 

Ecco il problema.

Il nuovo valore di q non esce mai dalla funzione, quindi la serie di elenchi collegati non viene mai aggiornata.

Normalmente la soluzione è quella di utilizzare un doppio puntatore:

void addNode(struct node **q, char *d){ 
    if(*q == NULL) 
     *q = malloc(sizeof(struct node)); 

e chiamarlo in questo modo:

addNode(&nodesArr[i],word); 

Poi, se si malloc un nuovo nodo, il valore nella matrice sarà impostato per puntare al nuovo nodo.

-2
struct node 
{ 

    int actual, estimated; 

    char c; 

    struct node *next; 

} *head[4], *var[4], *trav[4]; 


void 
insert_at_end (char c, int value, int value1) 
{ 

    struct node *temp; 

    temp = head[i]; 

    var[i] = (struct node *) malloc (sizeof (struct node)); 

    var[i]->actual = value; 

    //var1=(struct node *)malloc(sizeof(struct node)); 

    var[i]->estimated = value1; 

    var[i]->c = c; 

    //printf("%d",var->estimated); 

    if (head[i] == NULL) 

    { 

     head[i] = var[i]; 

     head[i]->next = NULL; 

    } 

    else 

    { 

     while (temp->next != NULL) 

    { 

     temp = temp->next; 

    } 

     var[i]->next = NULL; 

     temp->next = var[i]; 

    } 

}