在学习严蔚敏的《数据结构》线性表章节时,发现其中的函数参数有时是LinkList L,有时是LinkList &L,让人十分疑惑。在此记下原因。
typedef struct LNode{
int data;
struct LNode *next;
}LNode,*LinkList;
void InitList(LinkList &L){
L = (LinkList)malloc(sizeof(LNode)); //创建头结点
if (!L) exit(-1);
L->next = NULL;
}
void CreateList_L(LinkList L,int n){ //头插法
for (int i=n;i>0;i--)
{
LinkList p = (LinkList)malloc(sizeof(LNode)); //生成新结点
scanf("%d",&p->data); //输入元素值
p->next = L->next;
L->next = p; //插到表头
}
}
为什么InitList(LinkList &L)但CreateList_L(LinkList L,int n)?有什么区别?
1、InitList(LinkList &L)
一般情况,向函数传递指针类型的参数,可以让函数改变指针指向的内容,并将改变的效果返回;这里要改变指针变量L本身的值,使它指向新开辟的内存空间L = (LinkList)malloc(sizeof(LNode)),而不是要改变L所指向的内容(即链表)的值,即用&L。
2、CreateList_L(LinkList L,int n)
如上所说,这里只需改变L所指向的内容(即链表)的值,不需改变指针变量L本身的值,即用L。
总结
(1)当只需改变指针所指向的内容,不需改变指针的值时,用LinkList L。
(2)当需要改变指针的值时,用LinkList &L。此时,既可改变指针本身的值,又可改变指针所指向的内容。
追加:这里的指针变量本身的值是指针的地址!
深度理解
栗子:
将一个头结点为A的单链表分解为A(含原链表data域为奇数的结点),B(含原链表data域为偶数数的结点)两个链表。
这题的函数:Divide(LinkList A,LinkList &B);
因为数据为奇数的节点,可以继续跟随地址为A的头结点,而偶数的节点,要单拎出来,跟在B后面的。