为什么链接列表的打印功能有效?

时间:2015-12-12 10:56:02

标签: c linked-list

我有一个结构定义为:

typedef struct node Node;
struct node {
  char val;
  Node* tail;
};

我发起如下链接列表:

Node* header;
Node node_one;
node_one.val = 'a';
node_one.tail = 0;
header = &node_one;

然后我继续向此列表添加节点。现在,当我对此链表使用以下打印功能时,它的工作方式与预期的方式相同:

void printlist(Node* header) {
    do{
        printf("%c ", header->val);
        header = header->tail; // aren't we modifying the header itself here?
    } while(header->tail!=0);

    printf("%c --> NULL", header->val);
}

main()拨打printlist(header);

到目前为止一切顺利。我没有得到的是,在不对列表进行任何更改的情况下,当我在第二次,第三次,第四次调用此打印功能时,它始终有效。它打印列表的元素。但我所期待的是这个函数只能工作一次,因为我正在修改标题指针本身,所以不应该在运行这个打印函数一次后丢失内存中的列表?它怎么会不止一次起作用?

2 个答案:

答案 0 :(得分:1)

下面函数中的标题可能是一个局部变量(函数printlist的本地变量)。所以你的原始标题(主标题)根本没有变化。因此,无论何时调用此函数,它仍然会打印列表。

void printlist(Node* header){
    do{
        printf("%c ", header->val);
        header = header->tail; // aren't we modifying the header itself here?
    }while(header->tail!=0);
    printf("%c --> NULL", header->val);
 }

答案 1 :(得分:1)

这是因为您在header正文中使用的printlist()与您在header中引用的main()不同header。这些是恰好具有相同名称的不同变量。

您可以通过在printlist()中查找mylist的名称来试验这一原则:例如将其称为mysql2,整个程序仍然有用。