2011-02-09 18 views
7

Mi enfoque:tratar con gran variedad de lista enlazada

Una matriz de longitud fija (digamos que 20), cada elemento es puntero al primer nodo de una lista enlazada. entonces tengo 20 listas enlazadas diferentes.

Esta es la estructura:

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

Mi declaración de dicho array

struct node *nodesArr[20]; 

ahora para añadir un nuevo nodo a uno de la lista enlazada, hago esto:

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 función 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 imprimir los datos de la matriz de la lista enlazada, hago esto:

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; 
     } 
    } 
} 

ahora compilador da ningún error, la ejecución del programa y que pase los datos a ella, y cuando llamo de impresión se no imprime nada?

ACTUALIZACIÓN ::

después edité el código (THX para usted), creo que el problema en la función de impresión ,, alguna idea?

+1

¿Ha intentado pasarlo a través de un depurador, o agregar declaraciones 'printf' útiles? –

+0

Sí, lo intenté, pero no tengo nada –

+1

¿No tienes nada? Entonces, no podría, por ejemplo, descubrir en qué punto todos los elementos de 'nodesArr' se convirtieron en' NULL' –

Respuesta

5

El problema está en addNode(). Cuando la lista está vacía haces:

q = malloc(sizeof(struct node)); 

pero el alcance de q se limita a addNode(). Usted debería haber declarado como addNode()

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

y ajustar su código en consecuencia:

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

y así sucesivamente ...

+0

para que q = q-> siguiente, debería ser así, * q = * q-> siguiente, o (* q) -> siguiente ?? –

+0

Si lo hace más fácil, una vez que haya asignado, puede asignar la dirección apuntada a un único puntero y mantener el resto del código más o menos como lo tiene ahora. 'struct node * sp;' y luego 'sp = * q' –

+0

@Rami Jarrar: Tienes que usar' * q = (* q) -> next'. Los gurús C [le dirán] (http://www.difranco.net/cop2220/op-prec.htm) que '->' tiene una precedencia mayor que el operador de desreferencia. El resto de nosotros solo usamos un par de paréntesis y no nos molestamos en pensar más. – thkala

3

Al pasar struct node *q a addNode, le está dando una dirección para un elemento en su matriz. Si usa malloc dentro, está sobrescribiendo esta variable q, que es local para la función y ahora apunta a algo diferente, pero no ha cambiado su matriz original. Intente usar un puntero al puntero al nodo (struct node **q).

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

aquí está el problema.

El nuevo valor de q no sale nunca de la función, por lo que su conjunto de listas enlazadas nunca se actualiza.

Normalmente, la solución a este problema es utilizar un doble puntero:

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

y lo llaman así:

addNode(&nodesArr[i],word); 

Entonces, si malloc un nuevo nodo, el valor de la matriz se configurará para apuntar al nuevo 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]; 

    } 

} 
Cuestiones relacionadas