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 << "恭喜您要查找的值"<<x<<"在该循环双链表中且在该链表的第" << i << "位!" << endl;
			return true;
		}
		else
		{
			p = p->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<iostream>
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 << "恭喜您要查找的值"<<x<<"在该循环双链表中且在该链表的第" << i << "位!" << endl;
			return true;
		}
		else
		{
			p = p->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编译器中运行的结果如下图所示

 

  • 2
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值