对于循环双链表的简单练习
/************************************
* 对于带头节点的循环双链表的练习
* Description:对于考验中的循环链表的简单性的练习
* 因为在我们的408的考研中对于这个知识点并不是也别的重视
* 因此我们在这里只是做一些简单的增删改查
* Author:qichaoqun
* Date:2019/07/20
*************************************/
#include "stdio.h"
#include "stdlib.h"
/**
* 定义循环链表中的结点
*/
typedef struct LNode{
//数据域
int data;
//前驱指针
LNode* prior;
//后继指针
LNode* next;
}*CircleLink;
/*创建循环双链表*/
bool createCircleLink(CircleLink &circleLink);
void showMenu();
/*查看所有的结点的内容*/
void showNode(CircleLink &circleLink);
/*删除一个结点的内容*/
bool deleteNodeByValue(CircleLink &circleLink, int value);
/*修改一个元素的值*/
bool updateNodeByValue(CircleLink &circleLink,int value, int content);
int main(){
bool isExit = false;
//定义循环双链表的头节点,并且对其进行初始化
CircleLink circleLink = (CircleLink)malloc(sizeof(LNode));
circleLink->data = 0;
circleLink->prior = circleLink;
circleLink->next = circleLink;
while (!isExit){
showMenu();
int option;
scanf("%d",&option);
switch (option){
case 1:
//创建循环双链表
if(createCircleLink(circleLink)){
printf("创建成功\n");
}else{
printf("创建失败\n");
}
break;
case 2:
//删除一个结点
printf("请输入你要删除的结点内容 ");
int value;
scanf("%d",&value);
if(deleteNodeByValue(circleLink,value)){
printf("删除成功\n");
}else{
printf("删除失败\n");
}
break;
case 3:
//根据值修改一个结点
printf("请输入你要修改的元素和元素的值 ");
int valueTo;
int content;
scanf("%d",&valueTo);
scanf("%d",&content);
if(updateNodeByValue(circleLink,valueTo,content)){
printf("修改成功\n");
}else{
printf("修改失败\n");
}
break;
case 4:
//显示所有内容
showNode(circleLink);
break;
case 5:
//退出
isExit = true;
break;
}
}
return 0;
}
/*修改一个元素的值*/
bool updateNodeByValue(CircleLink &circleLink,int value, int content){
//定义辅助指针
CircleLink cLink = circleLink->next;
while (cLink != circleLink){
if(value == cLink->data){
//找到了要修改的元素
cLink->data = content;
return true;
}
//更新辅助指针
cLink = cLink->next;
}
return false;
}
/*删除一个结点的内容*/
bool deleteNodeByValue(CircleLink &circleLink, int value){
//定义辅助指针
CircleLink cLinkLast = circleLink->next;
CircleLink cLinkPro = cLinkLast;
CircleLink flagLink = nullptr;
//从前往后开始遍历循环链表
while(cLinkLast != circleLink){
if(cLinkLast->data == value){
//找到了要删除的元素
flagLink = cLinkLast;
cLinkLast = cLinkLast->next;
free(flagLink);
cLinkPro->next = cLinkLast;
cLinkLast->prior = cLinkPro;
//链表中的数量减少一个
circleLink->data--;
return true;
}
//更新辅助指针
cLinkPro = cLinkLast;
cLinkLast = cLinkLast->next;
}
return false;
}
/*输出循环链表
* 为了验证我们创建的循环双链表是正确
* 我们可以采用从头节点的后面和前面来进行遍历
* 可以从最后一个结点往前开始遍历
* 如果所有的结果都一样则说明我们创建的循环链表是没有问题的
* */
void showNode(CircleLink &circleLink){
//定义辅助指针
CircleLink cLink = circleLink->next;
//从头结点的尾部开始遍历
printf("从头结点的尾部开始遍历 ");
while (cLink != circleLink){
printf("%d ",cLink->data);
cLink = cLink->next;
}
printf("\n");
printf("从头结点的头部开始遍历 ");
cLink = cLink->prior;
while (cLink != circleLink){
printf("%d ",cLink->data);
cLink = cLink->prior;
}
printf("\n");
}
/*创建循环双链表*/
bool createCircleLink(CircleLink &circleLink){
//定义辅助指针
CircleLink cLink = circleLink;
printf("请输入数值 并且以-1结束输入\n");
int value;
while (scanf("%d",&value),value != -1){
//创建结点
LNode* lNode = (LNode*)malloc(sizeof(LNode));
lNode->data = value;
cLink->next = lNode;
lNode->prior = cLink;
lNode->next = nullptr;
//更新辅助指针
cLink = lNode;
//更新头节点中的数值域
circleLink->data++;
}
//添加完毕将最后一个节点的为指针指向头节点
// 将头节点的前驱指针指向最后一个结点
cLink->next = circleLink;
circleLink->prior = cLink;
//完成创建
return true;
}
void showMenu(){
printf("对于循环双链表的练习\n");
printf("1 创建双循环链表\n");
printf("2 删除一个结点\n");
printf("3 根据值修改一个结点中的内容\n");
printf("4 显示当前所有结点元素\n");
printf("5 退出\n");
printf("请输入你的选择\n");
}