C++语言程序设计

BuildOneTwoThree()仅仅是创建一个仅有三个结点的链表实例，不是创建链表的一般方法。最好的方法是有一个函数，能够向链表中增加新的结点。假定该函数为Push()，则其代码如下：
void Push(node** headRef, int data)
{
node* newNode = new node;
newNode->data = data;
newNode->next = *headRef; // *headRef是实际表头
*headRef = newNode;
}
下面是调用该函数建立链表的一个例子:
void main()
{
node* head = NULL; //空表
Push(&head, 3); // 注意&运算符
Push(&head, 2);
Push(&head, 1);
Push(&head, 13);
// 表head为 {13, 1, 2, 3}
}
需要注意的是：如果Push()函数写成下面的形式是错误的：
void Push(node* head, int data)
{
node* newNode = new node;
newNode->data = data;
newNode->next = head;
head = newNode;
}
这是因为newNode是建在栈中的局部指针变量，函数Push()返回后，该指针变量被释放，不能通过head参数带回到调用函数，要把head带回到调用函数，要把它定义为指向指针的指针。其实，为了带回head参数，我们也可以把head参数定义为对指针的引用：
void Push(node*& head, int data)
{
node* newNode = new node;
newNode->data = data;
newNode->next = head; // 在head前不需要额外的*
head = newNode;
}
调用Push()函数建立链表的函数则为：
void main()
{
node* head = NULL;
Push(head, 3); //在head前不需要额外的&
Push(head, 2);
Push(head, 1);
Push(head, 13);
// 链表head为 {13, 1, 2, 3}
}
调用Push()函数时应该注意：在调用函数中，如果传递的链表是一个空链表（链表创建之前），应将其头指针设置为空（NULL）。
上面我们已经看到，当我们传入1、2、3、4、5个结点时，链表中结点的次序是5、4、3、2、1，即新增加的结点放在原链表的头上。那么，我们能不能建立一个链表，使新增加的结点放在原链表的末尾？其实，只要我们把调用函数修改为下面的形式，就可以达到目的：

| 例8-11

void main()
{
node* head = NULL;
node* tail;
int i;

Push(&head, 1);
tail = head;

for (i=2; i<6; i++) {
Push(&(tail->next), i); // 在tail->next增加结点
tail = tail->next; // advance tail to point to last node
}
// 链表head为{1, 2, 3, 4, 5}
}

该函数调用了形参为指向指针的指针的Push()函数。