目录
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);//按值修改
}
运行结果截图
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);//按值修改
}
运行结果截图
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);//按值修改
}
运行结果截图
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);//按值修改
}
运行结果截图
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);//按值修改
}
运行结果截图
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);//按值修改
}
运行结果截图
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);//按值修改
}
运行结果截图
#includeusing 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编译器中运行的结果如下图所示



