通过链接列表创建和迭代的问题?

时间:2011-12-20 03:43:04

标签: c

当我运行下面的程序时,它打印出“one:1”,而不是“one:1,two:2”,正如我所料。谁知道这里发生了什么?我正在尝试创建一个函数,允许我创建尽可能多的链表,而不是仅仅声明全局头。

struct Node {
  int value;
  char label[10];
  node *next;
};
typedef struct Node node;

int add(int data, char name[], node *head) {
  node *newNode = (node *)malloc(sizeof(node));
  if (newNode != NULL) {
    newNode->value = data;
    strcpy(newNode->label, name);
    newNode->next = head;
    head = newNode;
  }
}

node* createNewLinkedList(int d, char *name) {
  node *newNode = (node *)malloc(sizeof(node));
  newNode->value = d;
  strcpy(newNode->label, name);
  newNode->next = NULL;
  return newNode;
}

int main() {
  node *head1 = createNewLinkedList(1, "one");
  add(2, "two", head1);
  iterate(head1);
}

5 个答案:

答案 0 :(得分:6)

您正在传递指向该节点的指针。与C中的所有参数一样,它按值传递,因此head = newNode;对调用者没有影响。

您需要更改签名以接受node **head,并添加间接级别,以便add中的更改反映在main中。

int add(int data, char name[], node **head) {
    node *newNode = (node *)malloc(sizeof(node));
    if (newNode != NULL) {
        newNode->value = data;
        strcpy(newNode->label, name);
        newNode->next = *head;
        *head = newNode;
    }
}

当然,您需要将&head1传递给add方法:add(2, "two", &head1);

P.S。由于您要在列表的前面添加{2,“2”},因此输出将为“2:2,one:1”

答案 1 :(得分:5)

head = newNode;将无法满足您的期望。

head是按值传递的。想一想。

答案 2 :(得分:2)

add中,您没有将新节点连接到列表的末尾,而只是创建一个与实际列表完全断开的新节点。您也不会根据函数的签名从该函数返回int

我怀疑你想要用这一行将新节点设置为头部:

head = newNode;

如果是这种情况,请将head更改为键入node**并执行*head = newNode,否则您只是修改一个本地变量以指向newNode,而不是实际从head1传递main指针。然后,您会在main中将&head1传递给add


编辑:更有意义的是拥有head->next = newNode;,或者迭代到列表的末尾并设置指向{的节点的next值{1}}到NULL。即

newNode

还有node *lastNode = head; while (lastNode->next != NULL) /* get to the last node in the list */ lastNode = lastNode->next; lastNode->next = newNode; /* add newNode to the end of the list */ 而不是newNode->next = NULL。现在,如果您将newNode->next = head添加到头部,则输出将为"one : 1, two: 2",而不是"two: 2, one : 1"

答案 3 :(得分:1)

没有看到你的迭代function,问题是head1指向列表中的最后一个元素,而不是第一个元素。你可能意味着add函数的最后一行是:

return head;

和你的程序的第二行:

head1 = add(2, "two", head1);

但是这仍然可能会以错误的顺序给你输出,因为你的add函数正在将新元素添加到列表的开头,而不是结尾。

答案 4 :(得分:1)

要详细了解问题,请通过The C Programming Language - 简介(第1.7 / 1.8章)和功能与程序结构(第4章)进行Kernighan & Ritchie

提示:pass-by-value& pass-by-address

int main() {
    ...
    add(2, "two", &head1);
    ...
}

OTOH,您应该在取消引用之前验证malloc的返回地址(在createNewLinkedList中)。