黑马程序员链表讲解笔记

1.头文件

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>

#pragma once

#ifdef __cplusplus
extern "C" {
#endif

	//定义节点数据类型
	struct LinkNode
	{
		int data;
		struct LinkNode* next;
	};

	//初始化链表
	struct LinkNode* Init_LinkList();
	//在值为oldval的位置插入新的数据newval
	void InsertByValue_LinkList(struct LinkNode* header, int oldval, int newval);
	//删除值为val的节点
	void RemoveByValue_LinkList(struct LinkNode* header, int delValue);
	//遍历
	void Foreach_LinkList(struct LinkNode*header);
	//销毁
	void Destroy_LinkList(struct LinkNode* header);
	//清空
	void Clear_LinkList(struct LinkNode* header);

#ifdef __cplusplus
}
#endif

2.链表内容及函数定义

/*内容:定义节点数据类型
* 初始化链表
* 在节点oldvalue后面插入newvalue
* 删除值为val的节点
* 遍历
* 销毁
* 清空
*/
#define _CRT_SECURE_NO_WARNINGS
#include"LinkList.h"
#include<iostream>
#include<string.h>
#include<stdlib.h>
#include<stdbool.h>
using namespace std;
//初始化链表
struct LinkNode* Init_LinkList()
{
	//创建头结点
	struct LinkNode* header = (struct LinkNode*)malloc(sizeof(struct LinkNode));
	header->data = -1;
	header->next = NULL;
	//尾部指针
	struct LinkNode* pRear = header;

	int val = -1;
	while (true)
	{
		cout << "输入插入的数据:" << endl;
		cin >> val;
		if (val == -1)
			break;
		//创建新节点
		struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
		newnode->data = val;
		newnode->next = NULL;

		//新节点插入到链表中
		pRear->next = newnode;
		//更新尾部指针指向
		pRear = newnode;
	}

	return header;
}

//遍历
void Foreach_LinkList(struct LinkNode *header)
{
	if (NULL == header)
	{
		return;
	}
	//辅助指针变量
	struct LinkNode* pCurrent = header->next;
	while (pCurrent != NULL)
	{
		cout << pCurrent->data<<endl;
		pCurrent = pCurrent->next;
	}

}

//在值为oldval的位置插入新的数据newval
void InsertByValue_LinkList(struct LinkNode* header, int oldval, int newval)
{

	if (NULL == header)
	{
		return;
	}
	//两个辅助指针变量
	struct LinkNode* pPrev = header;
	struct LinkNode* pCurrent = pPrev->next;

	while (pCurrent != NULL)
	{
		if (pCurrent->data == oldval)
		{
			break;
		}
		pPrev = pCurrent;
		pCurrent = pCurrent->next;
	}
#if 0
	//如果pCurrent为NULL,说明链表中不存在值为oldval的节点
	if (pCurrent == NULL)
	{
		return;
	}//用了if和endif之后:若链表中未找到oldval节点,则默认插入到链表末尾
#endif
	//否则找到了oldval,先创建新节点
	struct LinkNode* newnode = (struct LinkNode*)malloc(sizeof(struct LinkNode));
	newnode->data = newval;
	newnode->next = NULL;

	//新节点插入到链表中
	newnode->next = pCurrent;
	pPrev->next = newnode;
}

//清空
void Clear_LinkList(struct LinkNode* header)
{
	if (NULL == header)
	{
		return;
	}

	//辅助指针变量
	struct LinkNode* pCurrent = header->next;
	while (pCurrent != NULL)
	{
		//先保存当前节点的下一节点的地址
		struct LinkNode* pNext = pCurrent->next;

		//释放当前节点的内存
		free(pCurrent);

		//pCurrent指向下一个节点
		pCurrent = pNext;
	}

	header->next = NULL;//这句话是和销毁不一样的地方
}

//删除值为val的节点
void RemoveByValue_LinkList(struct LinkNode* header, int delValue)
{
	if (NULL == header)
	{
		return;
	}

	//两个辅助指针变量
	struct LinkNode* pPrev = header;
	struct LinkNode* pCurrent = pPrev->next;

	while (pCurrent != NULL)
	{
		if (pCurrent->data == delValue)
		{
			break;
		}
		//移动两个辅助指针
		pPrev = pCurrent;
		pCurrent = pCurrent->next;

	}

	if (NULL == pCurrent)
	{
		return;
	}

	//重新建立待删除节点的前驱和后续节点的联系
	pPrev->next = pCurrent->next;
	//释放删除节点内存
	free(pCurrent);
	pCurrent = NULL;
}

//销毁
void Destroy_LinkList(struct LinkNode* header)
{
	if (NULL == header)
	{
		return;
	}

	//辅助指针变量
	struct LinkNode* pCurrent = header->next;

	while (pCurrent != NULL)
	{
		//先保存当前节点的下一节点的地址
		struct LinkNode* pNext = pCurrent->next;

		//释放当前节点的内存
		free(pCurrent);

		//pCurrent指向下一个节点
		pCurrent = pNext;
	}
	
}

3.测试

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<stdbool.h>
#include"LinkList.h"

void test()
{
	//初始化链表  输入:100 200 666 300 400 500 600(在300的节点插入666数据)
	struct LinkNode* header = Init_LinkList();

	//打印链表(遍历)
	Foreach_LinkList(header);

	//插入数据
	InsertByValue_LinkList(header, 300, 666);

	//打印链表(遍历)
	cout << "------------------------"<<endl;
	Foreach_LinkList(header);

	//清空链表
	Clear_LinkList(header);

	//打印链表(遍历)
	cout << "------------------------" << endl;
	Foreach_LinkList(header);
}




int main()
{
	test();
	system("pause");
	return EXIT_SUCCESS;
}

  • 10
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值