链表常用接口函数

注意!函数内部传参二级指针易错点,不能一级指针*pphead

个人理解:pphead存放该二级指针的地址,*pphead一层解引用可改变它的指向,**pphead二层解引用获取一级指针指向的具体内容。

void LinkListPrint(Link* phead) {//打印链表
	Link* cur = phead;
	while (cur != NULL) {
		printf("%d->", cur->data);
		cur = cur->next;
	}
	printf("NULL\n");
}
Link* BuyNewNode(LinkDataType x) {//创建新节点
	Link* newnode = (Link*)malloc(sizeof(Link));
	if (newnode == NULL) {
		perror("申请内存失败!\n");
		exit(-1);
	}
	newnode->data = x;
	newnode->next = NULL;
	return newnode;
}
void LinkListPushBack(Link** pphead, LinkDataType x) {//尾插
	Link* newnode = BuyNewNode(x);
	if (*pphead == NULL) {
		*pphead = newnode;
	}
	else {
		Link* tail = *pphead;
		while (tail->next != NULL) {
			tail = tail->next;
		}
		tail->next = newnode;
	}
}
void LinkListPushFront(Link** pphead, LinkDataType x) {//头插
	Link* newnode = BuyNewNode(x);
	newnode->next = *pphead;
	*pphead = newnode;
}
void LinkListPopBack(Link** pphead) {//尾删
	assert(*pphead);
	if ((*pphead)->next == NULL) {
		free(*pphead);
		*pphead = NULL;
	}
	else {
		Link* Prev = *pphead;
		while (Prev->next->next != NULL) {
			Prev = Prev->next;
		}
		free(Prev->next);
		Prev->next = NULL;
	}
	
}
void LinkListPopFront(Link** pphead) {//头删
	assert(*pphead);
	Link* del = *pphead;
	*pphead = del->next;
	free(del);
	del = NULL;
}
Link* LinkListFind(Link* phead, LinkDataType x) {查找指定节点并返回节点地址
	Link* cur = phead;
	while (cur != NULL) {
		if (cur->data == x)
			return cur;
		cur = cur->next;
	}
	return NULL;
}
void LinkListInsert_Before(Link** pphead, Link* pos, LinkDataType x) {//任意指定节点前插入
	assert(pos);
	Link* newnode = BuyNewNode(x);
	if (*pphead == pos) {
		newnode->next = *pphead;
		*pphead = newnode;
	}
	else {
		Link* Prev = *pphead;
		while (Prev->next != pos) {
			Prev = Prev->next;
		}
		Prev->next = newnode;
		newnode->next = pos;
	}
}
void LinkListErase_Before(Link** pphead, Link* pos) {//任意指定节点前删除
	assert(pos && *pphead);
	if (*pphead == pos) {
		LinkListPopFront(pphead);
		//函数内部传参二级指针易错点,这里不能传*pphead
		//理解:pphead存放该二级指针的地址,*pphead一层解引用可改变它的指向,**pphead二层解引用获取一级指针指向的具体内容
	}
	else{
		Link* Prev = *pphead;
		while (Prev->next != pos) {
			Prev = Prev->next;
		}
		Prev->next = pos->next;
		free(pos);
		pos = NULL;
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。 该资源内项目源码是个人的课程设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值