链表学习笔记(一)

从这篇博文学到的,由衷感谢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就成了头节点
************************/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值