从这篇博文学到的,由衷感谢panda点击打开链接
/*
名称:初始化链表(1)(直接改变主调函数中的指针head)
功能:制造一个头节点
接收:指向节点的指针地址 &head
返回:int
*/
int ref_initLink(struct node **L){
//L为指向head(指向节点的指针)的指针,用L接收head的地址
//L接收到head的地址(&head)后,用malloc分配空间
//空间大小为struct node
//类型为指向struct node的指针
//返回给*L,L内存储的是指针head的地址,那么*L就是head的内容,下面的语句直接改变了head里的内容,让head指向了分配好的空间
*L = (struct node*)malloc(sizeof(struct node));
//age置为0,把head的next置为空
(*L)->age = 0;
(*L)->next = NULL;
return 0;
}
/***********************
//为什么要用二级指针**L,而不把head直接传过来,用一级指针,例如
int mian(void){
...
struct node *head;
ref_initLink(head);
...
}
int ref_initLink(struct node *L){
...
L = (struct node*)malloc(sizeof(struct node));
...
}
//这时,貌似直接改变了head中所存储的地址,让head指向了新分配的内存,但其实不然。
//上述这种参数传递方法,其实仍然是按值传递,head是head,L是L。
//L是函数临时创建的副本,L在initLink结束后会被销毁,而head内的值(所存的地址、也就是指向)并没有改变
//真正指向分配好的空间的指针是L,但是可惜,L在函数结束时会被销毁掉
//如果不想使用二级指针,那么就要修改函数
//首先,函数不能返回int值,而要返回指向结构体的指针
//其次,函数不接收参数,所有的动作函数自己完成,更改后如下
************************/
/*
名称:初始化链表(2)(不改变主调函数中的指针head)
功能:制造一个头节点
接收:void
返回:指向结构体的指针
*/
struct node* initLink(void){
//函数自己定义一个指向结构体的指针L
struct node* L;
//给L分配空间
L = (struct node*)malloc(sizeof(struct node));
//age置为0,next置为空
L->age = 0;
L->next = NULL;
//返回L,main中会有一个同样为struct node型的指针来接收这个L
return L;
}
/***********************
//主函数可以写成如下,例如
int mian(void){
...
struct node *head;
head = initLink(void);
...
return 0;
}
head接收到函数返回的L,所以head就成了头节点
************************/