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

文章目录

  • 目录

    文章目录

    1.什么是单链

    2.循环单链表节点结构体

    3.对循环单链表的操作

    3.1打印循环单链表

    3.2 求出循环单链表的长度

    3.3 使用尾插法创建单循环链表

    3.4 使用头插法创建单循环链表

    3.5 按值查找循环单链表

    3.6 按位查找循环单链表   

    3.7 在循环单链表中按位插入节点

    3.8 在单循环链表中按位删除节点

    3.8 在单循环链表中按值删除节点

    3.8 在单循环链表中按位修改节点的值

    3.8 在单循环链表中按值修改节点的值

    4.完整代码

    5. 运行结果及截图


1.什么是单链

        如果把单链表的最后一个节点的指针指向链表头部,而不是指向NULL,那么就构成了一个单向循环链表,通俗讲就是把尾节点的下一跳指向头结点。

                        

2.循环单链表节点结构体

         循环单链表的节点与普通单链表的节点相同并无本质的区别!

struct LNode {int data;    // 数据域LNode* next; // 指针域
};typedef LNode LNode;     // LNode表示单链表的一个结点
typedef LNode* LinkList; // LinkList表示一个单链表

        对循环单链表节点进行初始化:主要还是为了避免异常!

bool InitList(LinkList& L) {L = new LNode;//C/语言中使用:L = (LNode *)malloc(sizeof(LNode));与前者作用等价申请新节点if (!L) {cout << "申请节点失败!" << endl;return false;}L->next = NULL;//初始化节点的后继指针为空,避免引起错误!return true;
}

3.对循环单链表的操作

 3.1打印循环单链表

bool PrintList(const LinkList& L) {LNode* p = L->next;//p是第一个节点LNode* r = L;//r是头节点cout << "该循环单链表的值为:";while (p->next != r->next) {//如果头节点的后继指针与首节点的指针指向同一个节点,证明已经到了链尾cout << p->data<<" ";//输出该节点的数据p = p->next;//未到链尾,移动指针向后移动到下一个节点}	cout << endl;return true;
}

3.2 求出循环单链表的长度

int Length(const LinkList& L) {LNode* p = L->next;//p是第一个节点LNode* r = L;//r是头节点int i=0;//记录长度while (p)//能进入此循环证明p存在{i++;//p存在,让长度加一p = p->next;//p向后移动if (p->next == r->next) {//如果头节点的后继指针与首节点的指针指向同一个节点,证明已经到了链尾//cout << "该循环单链表的长度为:"<

3.3 使用尾插法创建单循环链表

bool TailCirculateList(LinkList& L) {LNode* p = L;//p是头节点LNode* t = L;//t是头节点int x;cout << "使用尾插法实现的单链表,请输入要创建的个数:" ;cin >> x;if (x < 1) {cout << "您输入的个数无效!" << endl; return false; }else if (x == 1) {//只输入一个节点时是特殊情况,进行特殊处理LNode* r = new LNode;cout << "请输入要输入的值:";cin >> r->data;p->next = r;r->next = t->next;return true;}cout << "请输入要输入的值:";while (x) {//x>1的情况LNode* r = new LNode;//申请新节点rcin >> r->data;//为新节点r填充数据p->next = r;//让头节点指向新的节点p = r;//p移动到新节点,尾插法在链尾插入新节点,所以头节点(其实只是个工作指针)也要移动到链尾,便于第下次添加x--;}p->next = t;//此时p是链尾节点,为了构造成循环链,让尾节点指向头节点PrintList(L);//打印单循环链return true;
}

3.4 使用头插法创建单循环链表

bool HeadCirculateList(LinkList& L){LNode* t = L;//t是头节点LNode* h = L;//h是头节点LNode* p = new LNode;//申请一个新节点pint x;cout << "使用头插法实现的单链表,请输入要创建的个数:";cin >> x;if (x < 1) {cout << "您输入的个数无效!" << endl;return false;}else if (x == 1) {//只输入一个数据时,特殊情况,进行处理LNode* p = new LNode;cout << "请输入要输入的值:";cin >> p->data;t->next = p;p->next = t->next;return true;}cout << "请输入要输入的值:";while (x) {LNode* r = new LNode;//申请一个新节点rcin >> r->data;//为新节点填充数据t->next = r;//头节点指向新节点r->next = h;//让新节点指向头节点h = t->next;//让工作指针回到头节点x--;}PrintList(L);//打印单循环链return true;
}

3.5 按值查找循环单链表

bool GetValueElem(LinkList& L) {LNode* p = L->next;LNode* 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;}}}
}

3.6 按位查找循环单链表   

bool GetBitElem(LinkList& L) {LNode* 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;
}

3.7 在循环单链表中按位插入节点

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

3.8 在单循环链表中按位删除节点

bool DeleteBit(LinkList& L) {int n;LNode* p = L;LNode* 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->data = p->next->data;p->next = r->next->next;cout << "要删除第" << k << "位的值" << p->data << "删除成功!";free(r);PrintList(L);//打印单链表return true;}while (n) {if (n == 1) {r->next = p->next;r->data = p->next->data;p->next = r->next->next;	cout << "要删除第"<data << "删除成功!" ;free(r);PrintList(L);//打印单链表return true;}n--;p = p->next;//节点向后移动}
}

3.8 在单循环链表中按值删除节点

bool DeleteValue(LinkList& L) {LNode* p = L;LNode* 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;p->next = r->next;free(r);cout << "要删除值为" << v << "的节点删除成功!";PrintList(L);//打印单链表return true;}p = p->next;x--;}cout << "要删除值为" << v << "的节点在单链表中不存在!";return false;
}

3.8 在单循环链表中按位修改节点的值

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

3.8 在单循环链表中按值修改节点的值

bool ReviseValue(LinkList& L) {int n=Length(L),q,h;LNode* 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 << "该单链表中不存在值为"<

4.完整代码


#includeusing namespace std;struct LNode {int data;    // 数据域LNode* next; // 指针域
};typedef LNode LNode;     // LNode表示单链表的一个结点
typedef LNode* LinkList; // LinkList表示一个单链表//函数申明
int Length(const LinkList& L);
bool InitList(LinkList& L);
bool PrintList(const LinkList& L);//1.初始化
bool InitList(LinkList& L) {L = new LNode;//C/语言中使用:L = (LNode *)malloc(sizeof(LNode));与前者作用等价申请新节点if (!L) {cout << "申请节点失败!" << endl;return false;}L->next = NULL;//初始化节点的后继指针为空,避免引起错误!return true;
}
//2.打印单链表
bool PrintList(const LinkList& L) {LNode* p = L->next;//p是第一个节点LNode* r = L;//r是头节点cout << "该循环单链表的值为:";while (p->next != r->next) {//如果头节点的后继指针与首节点的指针指向同一个节点,证明已经到了链尾cout << p->data<<" ";//输出该节点的数据p = p->next;//未到链尾,移动指针向后移动到下一个节点}	cout << endl;return true;
}
//3.求单链表的长度
int Length(const LinkList& L) {LNode* p = L->next;//p是第一个节点LNode* r = L;//r是头节点int i=0;//记录长度while (p)//能进入此循环证明p存在{i++;//p存在,让长度加一p = p->next;//p向后移动if (p->next == r->next) {//如果头节点的后继指针与首节点的指针指向同一个节点,证明已经到了链尾//cout << "该循环单链表的长度为:"<> x;if (x < 1) {cout << "您输入的个数无效!" << endl; return false; }else if (x == 1) {//只输入一个节点时是特殊情况,进行特殊处理LNode* r = new LNode;cout << "请输入要输入的值:";cin >> r->data;p->next = r;r->next = t->next;return true;}cout << "请输入要输入的值:";while (x) {//x>1的情况LNode* r = new LNode;//申请新节点rcin >> r->data;//为新节点r填充数据p->next = r;//让头节点指向新的节点p = r;//p移动到新节点,尾插法在链尾插入新节点,所以头节点(其实只是个工作指针)也要移动到链尾,便于第下次添加x--;}p->next = t;//此时p是链尾节点,为了构造成循环链,让尾节点指向头节点PrintList(L);//打印单循环链return true;
}
//5.使用头插法创建单循环链
bool HeadCirculateList(LinkList& L){LNode* t = L;//t是头节点LNode* h = L;//h是头节点LNode* p = new LNode;//申请一个新节点pint x;cout << "使用头插法实现的单链表,请输入要创建的个数:";cin >> x;if (x < 1) {cout << "您输入的个数无效!" << endl;return false;}else if (x == 1) {//只输入一个数据时,特殊情况,进行处理LNode* p = new LNode;cout << "请输入要输入的值:";cin >> p->data;t->next = p;p->next = t->next;return true;}cout << "请输入要输入的值:";while (x) {LNode* r = new LNode;//申请一个新节点rcin >> r->data;//为新节点填充数据t->next = r;//头节点指向新节点r->next = h;//让新节点指向头节点h = t->next;//让工作指针回到头节点x--;}PrintList(L);//打印单循环链return true;
}
//6.按值查找单链表
bool GetValueElem(LinkList& L) {LNode* p = L->next;LNode* 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) {LNode* 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) {LNode* p = L;LNode* r = L;cout << "请输入你要插入的位数:";int x;cin >> x;if (x<=0 || x>Length(L)) {cout << "您插入的位数无意义或不存在!" << endl;return false;}cout << "请输入你要插入的值:";if (x < Length(L)) {LNode *q = new LNode;cin >> q->data;if (x == 1) {q->next = p->next;p->next=q;q = p;PrintList(L);//打印单循环链return true;}while (x){p = p->next;x--;}q->next=p->next;p->next = q;PrintList(L);//打印单循环链return true;}else if (x == Length(L)) {//在链尾插入LNode* q = new LNode;cin >> q->data;while (x){p = p->next;x--;}p->next = q;q->next = r;PrintList(L);//打印单循环链return true;}
}
//9.按位删除节点
bool DeleteBit(LinkList& L) {int n;LNode* p = L;LNode* 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->data = p->next->data;p->next = r->next->next;cout << "要删除第" << k << "位的值" << p->data << "删除成功!";free(r);PrintList(L);//打印单链表return true;}while (n) {if (n == 1) {r->next = p->next;r->data = p->next->data;p->next = r->next->next;	cout << "要删除第"<data << "删除成功!" ;free(r);PrintList(L);//打印单链表return true;}n--;p = p->next;//节点向后移动}
}
//10. 按值删除节点
bool DeleteValue(LinkList& L) {LNode* p = L;LNode* 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;p->next = r->next;free(r);cout << "要删除值为" << v << "的节点删除成功!";PrintList(L);//打印单链表return true;}p = p->next;x--;}cout << "要删除值为" << v << "的节点在单链表中不存在!";return false;
}
//11.按位修改循环单链表的节点
bool ReviseBit(LinkList& L) {int n,v;LNode* p = L;cout << "请输入你要修改的节点的位数;";cin >> n;if (n<1 || n>Length(L)) {cout << "你要修改的节点的位数不存在或无意义!"<> 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;LNode* 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 << "该单链表中不存在值为"<

5. 运行结果及截图

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


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章