C中的简单链接列表

时间:2017-04-05 15:40:29

标签: c linked-list

这是一个C代码,它创建一个包含三个节点的简单链接列表。之后,名为printList的函数遍历创建的列表并打印每个节点的数据。

    // A simple C program for traversal of a linked list
    #include<stdio.h>
    #include<stdlib.h>

    struct node
    {
        int data;
        struct node *next;
    };

    // This function prints contents of linked list starting from
    // the given node
    void printList(struct node *n)
    {
        while (n != NULL)
        {
            printf(" %d ", n->data);
            n = n->next;
        }
    }

int main()
{
    struct node* head = NULL;
    struct node* second = NULL;
    struct node* third = NULL;

// allocate 3 nodes in the heap
    head = (struct node*)malloc(sizeof(struct node));
    second = (struct node*)malloc(sizeof(struct node));
    third = (struct node*)malloc(sizeof(struct node));

    head->data = 1; //assign data in first node
    head->next = second; // Link first node with second

    second->data = 2; //assign data to second node
    second->next = third;

    third->data = 3; //assign data to third node
    third->next = NULL;

    printList(head);
    printList(head); //question

    return 0;
}

资源:http://quiz.geeksforgeeks.org/linked-list-set-1-introduction/

我的问题是,由于函数printList的输入参数是类型为node的指针,因此在函数调用之后,指针的值似乎会发生变化。换句话说,在调用printList(head)之后,指针head现在必须指向NULL值是合理的,因此对printList的第二次调用应打印一些无关的价值观。但是,我显然是错的,因为这个程序的输出是1 2 3 1 2 3.

你能否对此有所了解?

2 个答案:

答案 0 :(得分:2)

C按值传递参数。这意味着传递给函数的变量的值被复制到函数本地的新变量中。无论你在函数内部改变多少局部变量,它都不会改变传递给函数的变量的值。

换句话说:函数内的n head中的main相同。局部变量n刚刚初始化为与head

相同的值

答案 1 :(得分:1)

变量按值传递;对于值为指针的变量,情况也是如此:

假设类型head的变量struct node*指向一个节点,假设地址为0x12345的节点。 当您致电printList(head)时,此功能的签名为void printList(struct node *n),则head会被复制到 n;因此,变量n和变量head虽然是不同的变量,但其值为0x12345。如果printList然后更改n的值,例如通过语句n = n->next,只改变变量n的值;变量head仍将具有值0x12345

希望这会有所帮助......