0

背景是我正在通过实现链表来试验 C 中的指针到指针。我的问题是关于两段代码的区别,以及为什么第一段给出了预期的输出,而另一段则没有。为什么第一段代码没有提前“外部”代码2似乎执行的功能?

void add_node(int x, Node **head){
if(*head == NULL){
    Node *new_node = (Node*) malloc(sizeof(new_node));
    new_node->x = x;
    *head = new_node;
} else {
    Node *n = *head;

    while(n->next != NULL){
        n = n->next;
    }

    Node *new_node = (Node*) malloc(sizeof(new_node));
    new_node->x = x;
    n->next = new_node;
}
}

如果我添加 4 个元素并在每次添加后打印列表,则输出符合预期:1 | 12 | 123 | 1234

void add_node(int x, Node **head){
if(*head == NULL){
    Node *new_node = (Node*) malloc(sizeof(new_node));
    new_node->x = x;
    *head = new_node;
} else {
    while((*head)->next != NULL){
        *head = (*head)->next;
    }

    Node *new_node = (Node*) malloc(sizeof(new_node));
    new_node->x = x;
    (*head)->next = new_node;
}
}

输出如下: 1 | 12 | 23 | 34

4

2 回答 2

2

在第一个示例中,您使用指针 n 来遍历链表,您将其分配给 n->next,这正是您想要执行的遍历链表的操作。在第二个示例中,您正在更改头指针指向的内容:

*head = (*head)->next;

您实际上是将链表的开头移动到另一个节点,这就是您有这种行为的原因。

于 2015-11-29T21:39:36.657 回答
0

评估输入 1、2、3 并关注头部。

while((*head)->next != NULL){
    *head = (*head)->next;
}
Node *new_node = (Node*) malloc(sizeof(new_node));
        new_node->x = x;
        (*head)->next = new_node;

让头部指向某个地方,您的输出正在描绘它;)

对于输入 1 和 1,2,不满足条件并且您转义。

于 2015-11-29T21:36:17.400 回答