栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++实现的双循环链表的各种操作

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++实现的双循环链表的各种操作

目录

1.定义双链表节点结构体

2.初始化双链表节点

3.打印双链表

4.求双循环链的长度

5.尾插法创建双循环链

6.使用头插法创建双循环链 

7.按值查找双循环链表

8.按位查找双循环链表

9. 插入节点

10.按值删除节点

11.按位删除节点

12.按位修改双循环链表的节点

13.按值修改双循环链表的节点

完整代码

运行结果截图

1.定义双链表节点结构体
typedef struct DNode {//定义双链表节点结构体
	DNode* pre;//前驱指针
	Elemtype data;//数据域
	DNode* next;//后继指针
}DNode, * LinkList;//定义双链表节点和双链表

2.初始化双链表节点
bool InitList(LinkList& L){
	L = new DNode;//C语言中使用:L = (DNode *)malloc(sizeof(DNode));与前者作用等价都为申请新节点
	if (!L) {
		cout << "申请节点失败!" << endl;
		return false;
	}
	L->next = NULL;//初始化后继指针
	L->pre = NULL;//初始化前驱指针
	//cout << "申请节点成功!" << endl;
	return true;
}

3.打印双链表
bool PrintList(LinkList& L) {
	DNode* p = L->next;
	DNode* r = L;
	cout << "该双循环链表的值为:";
	if (Length(L) == 1) {
		cout << p->data << endl;
	}
	while (p->next != r->next) {
		cout << p->data << " ";//输出该节点的数据
		p = p->next;//未到链尾,移动指针向后移动到下一个节点
	}
	cout << endl;
	return true;
}

4.求双循环链的长度
int Length(LinkList& L) {
	DNode* p = L->next;
	DNode* q = L;
	int i = 0;
	while (p) {
		i++;
		p = p->next;
		if (p->next == q->next) {
			//cout << "该双循环链表的长度为:" << i << endl;//输出长度
			return i;//返回长度
		}
	}
}

5.尾插法创建双循环链
bool TailCirculateList(LinkList& L) {
	DNode* p = L;
	DNode* q = L;
	DNode* r = new DNode;
	int x;
	cout << "使用尾插法实现的双循环链表,请输入要创建的个数:";
	cin >> x;
	if (x < 1) {
		cout << "您输入的个数无效!" << endl;
		return false;
	}
	else if (x == 1) {
		DNode* r = new DNode;
		cout << "请输入要输入的值:";
		cin >> r->data;
		p->next = r;
		r->pre = r;
		L->next = r;
		PrintList(L);//打印双循环循环链
		return true;
	}
	cout << "请输入要输入的值:";
	while (x)
	{
		DNode* h = new DNode;
		cin >> h->data;;
		p->next = h;
		h->pre = p;
		h->next = q;
		p = h;
		x--;
	}
	PrintList(L);//打印双循环链表
	return true;
}

6.使用头插法创建双循环链 
bool HeadCirculateList(LinkList& L) {
	DNode* p = L;
	DNode* q = L;
	int x;
	cout << "使用头插法实现的双循环链表,请输入要创建的个数:";
	cin >> x;
	if (x < 1 || x>Length(L)) {
		cout << "您输入的个数无效!" << endl;
		return false;
	}
	else if (x == 1) {
		DNode* r = new DNode;
		cout << "请输入要输入的值:";
		cin >> r->data;
		r->pre = r;
		r->next = r;
		L->next = r;
		PrintList(L);//打印双循环链表
	}
	else {
		cout << "请输入要输入的值:";
		while (x)
		{
			DNode* t = new DNode;
			cin >> t->data;
			p->next = t;
			t->pre = p;
			t->next = q;
			q = p->next;
			x--;
		}
		PrintList(L);//打双循环链表
		return true;
	}
}

7.按值查找双循环链表
bool GetValueElem(LinkList& L) {
	DNode* p = L->next;
	DNode* t = L;
	int x, i = 0;
	cout << "请输入您要查找的值:";
	cin >> x;
	while (p)
	{
		i++;
		if (p->data == x) {
			cout << "恭喜您要查找的值"<next;
			if (p->next == t->next) {
				cout << "抱歉您要查找的值不在该循环双链表中!" << endl;
				return false;
			}
		}

	}
}

8.按位查找双循环链表
bool GetBitElem(LinkList& L) {
	DNode* p = L;
	int x;
	cout << "请输入您要查找的位:";
	cin >> x;
	int k = x;
	if (x<1 || x>Length(L)) {
		cout << "您输入的位数无意义或不存在!" << endl;
		return false;
	}
	while (x)
	{
		p = p->next;
		x--;
	}
	cout << "您要查找的第" << k << "位的数据为:" << p->data << endl;
	return true;
}

9. 插入节点
bool Insert(LinkList& L) {
	DNode* p = L;
	DNode* r = L;
	cout << "请输入你要插入的位数:";
	int x;
	cin >> x;
	if (x <= 0 || x > Length(L)) {
		cout << "您插入的位数无意义或不存在!" << endl;
		return false;
	}
	cout << "请输入你要插入的值:";
	if (x < Length(L)) {
		DNode* q = new DNode;
		cin >> q->data;
		if (x == 1) {
			q->next = p->next;
			q->pre = p;
			p->next = q;
			q = p;
			PrintList(L);//打印双循环链
			return true;
		}
		while (x)
		{
			p = p->next;
			x--;
		}
		q->next = p->next;
		q->pre = p;
		p->next = q;
		PrintList(L);//打印双循环链
		return true;
	}
	else if (x == Length(L)) {//在链尾插入
		DNode* q = new DNode;
		cin >> q->data;
		while (x)
		{
			p = p->next;
			x--;
		}
		p->next = q;
		q->pre = p;
		q->next = r;
		PrintList(L);//打印双循环链
		return true;
	}
}

10.按值删除节点
bool DeleteValue(LinkList& L) {
	DNode* p = L;
	DNode* r;
	InitList(r);
	int v, x = Length(L);
	cout << "请输入你要删除的值;";
	cin >> v;
	while (x) {
		if (p->next->data == v) {
			r->data = p->next->data;
			r->next = p->next->next;
			r->pre = p->next->pre;
			p->next = r->next;
			free(r);
			cout << "要删除值为" << v << "的节点删除成功!";
			PrintList(L);//打印循环双链表
			return true;
		}
		p = p->next;
		x--;
	}
	cout << "要删除值为" << v << "的节点在双循环链表中不存在!";
	return false;
}

11.按位删除节点
bool DeleteBit(LinkList& L) {
	int n;
	DNode* p = L;
	DNode* r;
	InitList(r);
	cout << "请输入你要删除的节点的位数;";
	cin >> n;
	int k = n;
	if (n <1 || n> Length(L)) {
		cout << "您想删除的节点不存在" << endl;
		return false;
	}
	else if (n == Length(L)) {//删除尾节点
		while (n)
		{
			p = p->next;
			n--;
		}
		r->next = p->next;
		r->pre = p->next->pre;
		r->data = p->next->data;
		p->next = r->next->next;
		L->next->pre = p;
		cout << "要删除第" << k << "位的值" << p->data << "删除成功!";
		free(r);
		PrintList(L);//打印双循环链表
		return true;
	}
	while (n) {
		if (n == 1) {
			r->next = p->next;
			r->pre = p->next->pre;
			r->data = p->next->data;
			p->next = r->next->next;
			L->next->pre = p;
			cout << "要删除第" << k << "位的值" << r->data << "删除成功!";
			free(r);
			PrintList(L);//打印双链表
			return true;
		}
		n--;
		p = p->next;//节点向后移动
	}
}

12.按位修改双循环链表的节点
bool ReviseBit(LinkList& L) {
	int n, v;
	DNode* p = L;
	cout << "请输入你要修改的节点的位数;";
	cin >> n;
	if (n<1 || n>Length(L)) {
		cout << "你要修改的节点的位数不存在或无意义!" << endl;
		return false;
	}
	cout << "请输入你要修改的节点的值;";
	cin >> v;
	while (n)
	{
		p = p->next;
		n--;
	}
	p->data = v;
	PrintList(L);//打印双循环链表
	return true;
}

13.按值修改双循环链表的节点
bool ReviseValue(LinkList& L) {
	int n = Length(L), q, h;
	DNode* p = L;
	cout << "请输入你要修改的前的值和修改后的值;";
	cin >> q;
	cin >> h;
	while (n)
	{
		if (p->next->data == q) {
			p->next->data = h;
			PrintList(L);//打印双循环链表
			return true;
		}
		p = p->next;
		n--;
	}
	cout << "该循环双链表中不存在值为" << q << "的节点!" << endl;
	return false;
}

完整代码
#include
using namespace std;

typedef int Elemtype;//可以很方便的修改数据类型

typedef struct DNode {//定义双链表节点结构体
	DNode* pre;//前驱指针
	Elemtype data;//数据域
	DNode* next;//后继指针
}DNode, * LinkList;//定义双链表节点和双链表

int Length(LinkList& L);
//1. 初始化
bool InitList(LinkList& L){
	L = new DNode;//C语言中使用:L = (DNode *)malloc(sizeof(DNode));与前者作用等价都为申请新节点
	if (!L) {
		cout << "申请节点失败!" << endl;
		return false;
	}
	L->next = NULL;//初始化后继指针
	L->pre = NULL;//初始化前驱指针
	//cout << "申请节点成功!" << endl;
	return true;
}
//2.打印双链表
bool PrintList(LinkList& L) {
	DNode* p = L->next;
	DNode* r = L;
	cout << "该双循环链表的值为:";
	if (Length(L) == 1) {
		cout << p->data << endl;
	}
	while (p->next != r->next) {
		cout << p->data << " ";//输出该节点的数据
		p = p->next;//未到链尾,移动指针向后移动到下一个节点
	}
	cout << endl;
	return true;
}
//3. 求双循环链的长度
int Length(LinkList& L) {
	DNode* p = L->next;
	DNode* q = L;
	int i = 0;
	while (p) {
		i++;
		p = p->next;
		if (p->next == q->next) {
			//cout << "该双循环链表的长度为:" << i << endl;//输出长度
			return i;//返回长度
		}
	}
}
//4. 尾插法创建双循环链
bool TailCirculateList(LinkList& L) {
	DNode* p = L;
	DNode* q = L;
	DNode* r = new DNode;
	int x;
	cout << "使用尾插法实现的双循环链表,请输入要创建的个数:";
	cin >> x;
	if (x < 1) {
		cout << "您输入的个数无效!" << endl;
		return false;
	}
	else if (x == 1) {
		DNode* r = new DNode;
		cout << "请输入要输入的值:";
		cin >> r->data;
		p->next = r;
		r->pre = r;
		L->next = r;
		PrintList(L);//打印双循环循环链
		return true;
	}
	cout << "请输入要输入的值:";
	while (x)
	{
		DNode* h = new DNode;
		cin >> h->data;;
		p->next = h;
		h->pre = p;
		h->next = q;
		p = h;
		x--;
	}
	PrintList(L);//打印双循环链表
	return true;
}

//5. 使用头插法创建双循环链   
bool HeadCirculateList(LinkList& L) {
	DNode* p = L;
	DNode* q = L;
	int x;
	cout << "使用头插法实现的双循环链表,请输入要创建的个数:";
	cin >> x;
	if (x < 1 || x>Length(L)) {
		cout << "您输入的个数无效!" << endl;
		return false;
	}
	else if (x == 1) {
		DNode* r = new DNode;
		cout << "请输入要输入的值:";
		cin >> r->data;
		r->pre = r;
		r->next = r;
		L->next = r;
		PrintList(L);//打印双循环链表
	}
	else {
		cout << "请输入要输入的值:";
		while (x)
		{
			DNode* t = new DNode;
			cin >> t->data;
			p->next = t;
			t->pre = p;
			t->next = q;
			q = p->next;
			x--;
		}
		PrintList(L);//打双循环链表
		return true;
	}
}

//6.按值查找双循环链表
bool GetValueElem(LinkList& L) {
	DNode* p = L->next;
	DNode* t = L;
	int x, i = 0;
	cout << "请输入您要查找的值:";
	cin >> x;
	while (p)
	{
		i++;
		if (p->data == x) {
			cout << "恭喜您要查找的值"<next;
			if (p->next == t->next) {
				cout << "抱歉您要查找的值不在该循环双链表中!" << endl;
				return false;
			}
		}

	}
}

//7.按位查找双循环链表
bool GetBitElem(LinkList& L) {
	DNode* p = L;
	int x;
	cout << "请输入您要查找的位:";
	cin >> x;
	int k = x;
	if (x<1 || x>Length(L)) {
		cout << "您输入的位数无意义或不存在!" << endl;
		return false;
	}
	while (x)
	{
		p = p->next;
		x--;
	}
	cout << "您要查找的第" << k << "位的数据为:" << p->data << endl;
	return true;
}

//8.插入节点

bool Insert(LinkList& L) {
	DNode* p = L;
	DNode* r = L;
	cout << "请输入你要插入的位数:";
	int x;
	cin >> x;
	if (x <= 0 || x > Length(L)) {
		cout << "您插入的位数无意义或不存在!" << endl;
		return false;
	}
	cout << "请输入你要插入的值:";
	if (x < Length(L)) {
		DNode* q = new DNode;
		cin >> q->data;
		if (x == 1) {
			q->next = p->next;
			q->pre = p;
			p->next = q;
			q = p;
			PrintList(L);//打印双循环链
			return true;
		}
		while (x)
		{
			p = p->next;
			x--;
		}
		q->next = p->next;
		q->pre = p;
		p->next = q;
		PrintList(L);//打印双循环链
		return true;
	}
	else if (x == Length(L)) {//在链尾插入
		DNode* q = new DNode;
		cin >> q->data;
		while (x)
		{
			p = p->next;
			x--;
		}
		p->next = q;
		q->pre = p;
		q->next = r;
		PrintList(L);//打印双循环链
		return true;
	}
}
//9.按值删除节点
bool DeleteValue(LinkList& L) {
	DNode* p = L;
	DNode* r;
	InitList(r);
	int v, x = Length(L);
	cout << "请输入你要删除的值;";
	cin >> v;
	while (x) {
		if (p->next->data == v) {
			r->data = p->next->data;
			r->next = p->next->next;
			r->pre = p->next->pre;
			p->next = r->next;
			free(r);
			cout << "要删除值为" << v << "的节点删除成功!";
			PrintList(L);//打印循环双链表
			return true;
		}
		p = p->next;
		x--;
	}
	cout << "要删除值为" << v << "的节点在双循环链表中不存在!";
	return false;
}

//10.按位删除节点
bool DeleteBit(LinkList& L) {
	int n;
	DNode* p = L;
	DNode* r;
	InitList(r);
	cout << "请输入你要删除的节点的位数;";
	cin >> n;
	int k = n;
	if (n <1 || n> Length(L)) {
		cout << "您想删除的节点不存在" << endl;
		return false;
	}
	else if (n == Length(L)) {//删除尾节点
		while (n)
		{
			p = p->next;
			n--;
		}
		r->next = p->next;
		r->pre = p->next->pre;
		r->data = p->next->data;
		p->next = r->next->next;
		L->next->pre = p;
		cout << "要删除第" << k << "位的值" << p->data << "删除成功!";
		free(r);
		PrintList(L);//打印双循环链表
		return true;
	}
	while (n) {
		if (n == 1) {
			r->next = p->next;
			r->pre = p->next->pre;
			r->data = p->next->data;
			p->next = r->next->next;
			L->next->pre = p;
			cout << "要删除第" << k << "位的值" << r->data << "删除成功!";
			free(r);
			PrintList(L);//打印双链表
			return true;
		}
		n--;
		p = p->next;//节点向后移动
	}
}


//11.按位修改双循环链表的节点
bool ReviseBit(LinkList& L) {
	int n, v;
	DNode* p = L;
	cout << "请输入你要修改的节点的位数;";
	cin >> n;
	if (n<1 || n>Length(L)) {
		cout << "你要修改的节点的位数不存在或无意义!" << endl;
		return false;
	}
	cout << "请输入你要修改的节点的值;";
	cin >> v;
	while (n)
	{
		p = p->next;
		n--;
	}
	p->data = v;
	PrintList(L);//打印双循环链表
	return true;
}
//12.按值修改双循环链表的节点
bool ReviseValue(LinkList& L) {
	int n = Length(L), q, h;
	DNode* p = L;
	cout << "请输入你要修改的前的值和修改后的值;";
	cin >> q;
	cin >> h;
	while (n)
	{
		if (p->next->data == q) {
			p->next->data = h;
			PrintList(L);//打印双循环链表
			return true;
		}
		p = p->next;
		n--;
	}
	cout << "该循环双链表中不存在值为" << q << "的节点!" << endl;
	return false;
}

int main() {
	
	LinkList(L);
	InitList(L);//初始化
	HeadCirculateList(L);//使用头插法
	TailCirculateList(L);//使用尾插法
	GetValueElem(L);//按值查找
	GetBitElem(L);//按位查找
	Insert(L);//插入节点
	DeleteBit(L);//按位删除节点
	DeleteValue(L);//按值删除节点
	ReviseBit(L);//按位修改值
	ReviseValue(L);//按值修改

}

运行结果截图

在windows11操作系统的Visual Studio 2019编译器中运行的结果如下图所示

 

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1004631.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号