处理链表数组

时间:2011-02-09 00:11:00

标签: c arrays linked-list

我的方法:

每个元素的固定长度(假设为20)数组是指向链表的第一个节点的指针。 所以我有20个不同的链表。

这是结构:

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

我对该数组的声明

struct node *nodesArr[20];

现在要将新节点添加到其中一个链接列表中,我这样做:

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

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

并打印链表数组中的数据,我这样做:

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

现在编译器没有出错,程序运行并且我将数据传递给它,当我调用print时它不​​会打印任何东西,??

UPDATE ::

在我编辑代码(thx为你)后,我认为打印功能中的问题,任何想法?

4 个答案:

答案 0 :(得分:5)

问题在于addNode()。当列表为空时,您可以:

q = malloc(sizeof(struct node));

q的范围仅限于addNode()。您应该已将addNode()声明为

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

并相应调整您的代码:

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

依旧......

答案 1 :(得分:3)

当您将struct node *q传递给addNode时,您将为其提供阵列中元素的地址。如果您在里面使用malloc,那么您将覆盖此变量q,该变量是函数的本地变量,现在指向不同的变量,但您没有更改原始数组。尝试使用指向节点(struct node **q)的指针。

答案 2 :(得分:2)

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

这是问题所在。

q的新值永远不会离开函数,因此您的链接列表数组永远不会更新。

通常这里的解决方案是使用双指针:

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

并称之为:

addNode(&nodesArr[i],word);

然后,如果您malloc新节点,则数组中的值将设置为指向新节点。

答案 3 :(得分:-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];

    }

}