日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)

發(fā)布時間:2025/4/16 c/c++ 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【c++版数据结构】之循环单链表的实现(带头结点以及尾节点) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

所實現(xiàn)的循環(huán)單鏈表的結(jié)構(gòu)例如以下圖所看到的:


循環(huán)單鏈表的實現(xiàn),和上一篇文章單鏈表的實現(xiàn)大致同樣點擊打開鏈接略有差別:

1:循環(huán)推斷的條件不再是s == NULL或者s->next == NULL,而是他們是否等于頭指針。2:?斷開鏈表時的處理,尾節(jié)點的next不是NULL,而是指向頭結(jié)點

詳細細節(jié)參考上一篇文章

頭文件:SCList.h

#ifndef SCLIST_H #define SCLIST_H#include<iostream> #include<cassert> using namespace std;typedef enum{ FALSE, TRUE }Status;template<class Type> class List;template<class Type> class ListNode {friend class List<Type>; private:Type data;ListNode *next; public:ListNode() :data(Type()), next(NULL){}ListNode(Type d, ListNode<Type> *n = NULL) :data(d), next(n){}void SetData(Type d){ data = d; }Type GetData()const{ return data; }~ListNode(){} };template<class Type> class List { private:ListNode<Type> *first;ListNode<Type> *last;size_t size; public:List(){ListNode<Type> *s = new ListNode<Type>;assert(s != NULL);first = last = s;last->next = first;}~List(){destory();}Status push_back(const Type &x){ListNode<Type> *s = new ListNode<Type>(x);if (s == NULL)return FALSE;last->next = s;last = s;last->next = first;size++;return TRUE;}void show_list(){ListNode<Type> *s = first->next;while (s != first){cout << s->data << "->";s = s->next;}cout << "Nul." << endl;}Status push_front(const Type &x){ListNode<Type> *s = new ListNode<Type>(x);if (s == NULL)return FALSE;s->next = first->next;first->next = s;if (size == 0){last = s;last->next = first;//---------------->能夠省略,think}size++;return TRUE;}Status pop_back(){if (size == 0)//{cout << "循環(huán)單鏈表已空,無法尾刪" << endl;return FALSE;}ListNode<Type> *s = first;while (s->next != last)s = s->next;delete last;last = s;last->next = first;size--;return TRUE;}Status pop_front(){if (size == 0)//{cout << "循環(huán)單鏈表已空。無法頭刪" << endl;return FALSE;}ListNode<Type> *s = first->next;first->next = s->next;delete s;if (size == 1){last = first;last->next = first;//能夠省略-------------->}size--;return TRUE;}Status insert_val(const Type &x){ListNode<Type> *s = first;while (s->next != first && s->next->data < x)s = s->next;if (s->next == first)push_back(x);else{ListNode<Type> *p = new ListNode<Type>(x);assert(p != NULL);p->next = s->next;s->next = p;size++;}return TRUE;}ListNode<Type>* find(const Type &x){if (size == 0)return NULL;ListNode<Type> *s = first->next;while (s != first){if (s->data == x)return s;s = s->next;}return NULL;}Status delete_val(const Type &x){ListNode<Type> *s = find(x);if (s == NULL){cout << "該元素不存在,無法刪除" << endl;return FALSE;}if (s == last){pop_back();}else{ListNode<Type> *p = s->next;s->data = p->data;s->next = p->next;if (p == last)//------------------->>注意{last = s;}delete p;size--;}return TRUE;}//從第一個節(jié)點處斷開,一分為二,頭結(jié)點和第一個節(jié)點成為一個單獨的循環(huán)單鏈表//將剩余的節(jié)點依次按值插入該鏈表void sort(){if (size == 0 || size == 1)return;ListNode<Type> *s = first->next;ListNode<Type> *p = s->next;last = s; last->next = first;while (p != first){s = p;p = p->next;//insert_val(s->data);//delete s;ListNode<Type> *q = first;while (q->next != NULL && q->next->data < s->data){q = q->next;}if (q->next == NULL){last->next = s;last = s;last->next = first;}else{s->next = q->next;q->next = s;}}}//從第一個節(jié)點處斷開,一分為二,頭結(jié)點和第一個節(jié)點成為一個單獨的循環(huán)單鏈表//將剩余的節(jié)點依次進行頭插void reserve(){if (size == 0 || size == 1)return;ListNode<Type> *s = first->next;ListNode<Type> *p = s->next;last = s;last->next = first;while (p != first){s = p;p = p->next;s->next = first->next;first->next = s;}}size_t lenth(){return size;}void clear(){if (size == 0)return;ListNode<Type> *s = first->next;while (s != first){if (size == 1){last = first;last->next = first;}else{first->next = s->next;}delete s;size--;s = first->next;}}ListNode<Type>* next(ListNode<Type> *s){if (s == last)//最后一個節(jié)點沒有后繼return NULL;elsereturn s->next;}ListNode<Type>* prio(ListNode<Type> *s){if (s == first->next)//第一個節(jié)點沒有前驅(qū)return NULL;ListNode<Type> *p = first;while (p->next != s){p = p->next;}return p;}void destory(){clear();delete first;first = last = NULL;} }; #endif測試文件:main.cpp

#include"SCList.h"int main() {List<int> mylist;int item;int n;int select = 1;//ListNode<int> *p;while (select){cout << "*************************************** *" << endl;cout << "*[1] push_back [2] push_front *" << endl;cout << "*[3] show_list [4] pop_back *" << endl;cout << "*[5] pop_front [6] insert_val *" << endl;cout << "*[7] lenth [8] find *" << endl;cout << "*[9] merge [10] delete_val*" << endl;cout << "*[11] sort [12] reserve *" << endl;cout << "*[13] next [14] clear *" << endl;cout << "*[15] prio [0] quit_system*" << endl;cout << "請選擇:>";cin >> select;switch (select){case 1:cout << "請輸入要插入的元素(-1結(jié)束):>";while (cin >> item, item != -1){mylist.push_back(item);}break;case 2:cout << "請輸入要插入的元素(-1結(jié)束):>";while (cin >> item, item != -1){mylist.push_front(item);}break;case 3:mylist.show_list();break;case 4:mylist.pop_back();break;case 5:mylist.pop_front();break;case 6:cout << "請輸入要插入的元素:";cin >> item;mylist.insert_val(item);break;case 7:cout << "長度為:" << mylist.lenth() << endl;break;case 8:cout << "請輸入要查找的元素:";cin >> item;if (mylist.find(item))cout << "it's found" << endl;elsecout << "it's not exist" << endl;break;case 9:cout << "請輸入要刪除的位置:";cin >> n;//mylist.delete_pos(n,item);break;case 10:cout << "請輸入要刪除的元素:";cin >> item;mylist.delete_val(item);break;case 11:mylist.sort();break;case 12:mylist.reserve();break;case 13:cout << "請輸入要查找后繼的元素:";cin >> item;//p = mylist.next(item);//if (p != NULL)// cout << p->GetData() << endl;break;case 14:mylist.clear();break;default:break;}}system("pause");return 0; }


轉(zhuǎn)載于:https://www.cnblogs.com/lytwajue/p/7098665.html

總結(jié)

以上是生活随笔為你收集整理的【c++版数据结构】之循环单链表的实现(带头结点以及尾节点)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。