开发者

dealing with array of linked list

My approach:

An array of fixed-length (lets say 20) each element is pointer to the first node of a linked list. so i have 20 different linked list.

This is the structure:

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

My declaration for that array

struct node *nodesArr[20];

now to add a new node to one of the linked list, i do this:

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")

The addNode function:

void addNode(struct node *q, char *d){
    if(q == NULL)
        q = m开发者_运维问答alloc(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; 
}

and to print data from the array of linked list, i do this:

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

now compiler gives no error, the program run and i pass the data to it, and when i call print it doesn't print any thing,,??

UPDATE::

after I edited the code (thx for you), i think the problem in the print function,, any idea ?


The problem lies in addNode(). When the list is empty you do:

q = malloc(sizeof(struct node));

but the scope of q is limited to addNode(). You should have declared addNode() as

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

and adjust your code accordingly:

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

and so on...


When you pass struct node *q to addNode you are giving it an address for an element in your array. If you use malloc inside, then you are overwriting this variable q, which is local to the function and now points to something different, but you haven't changed your original array. Try using a pointer to pointer to node (struct node **q).


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

Here's the problem.

The new value of q doesn't ever get out of the function, so your array of linked lists never gets updated.

Normally the solution here is to use a double-pointer:

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

And call it like so:

addNode(&nodesArr[i],word);

Then, if you malloc a new node, the value in the array will be set to point to the new node.


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

    }

}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜