指针到指针和链表,每个值传递参数

时间:2015-11-29 21:29:00

标签: c pointers pointer-to-pointer

背景是我正在通过实现链表来试验C中的指针指针。我的问题是关于两段代码的区别以及为什么第一段代码给出了预期的输出,而不是另一条代码。为什么第一段代码没有前进?#34; outsite"代码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

2 个答案:

答案 0 :(得分:2)

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

*head = (*head)->next;

您实际上是将链接列表的开头移动到另一个节点,这就是您遇到此类行为的原因。

答案 1 :(得分: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,不满足条件并且您逃脱。