目录
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编译器中运行的结果如下图所示