C++循环链表(殷人昆版)
来源:互联网 发布:微型交易源码 编辑:程序博客网 时间:2024/05/16 00:43
<span style="font-size:18px;"><strong><strong><span style="font-size:18px;">#include <iostream>#include <string.h>#include <stdlib.h>using namespace std;template<class T>struct CircListNode{T data;CircListNode<T> *next;CircListNode(CircListNode<T> *n = NULL):next(n){}CircListNode(T d, CircListNode<T> *n = NULL):data(d),next(n){}};template<class T>class CircList{public:CircList(){first = new CircListNode<T>;first->next = first;}CircList(const T& x){first = new CircListNode<T>(x);first->next = first;}CircList(CircList<T> & L){T value;CircListNode<T> *srcptr = L.getHead();CircListNode<T> *destptr = first = new CircListNode<T>;while(srcptr->next != first){value = scrptr->next->data;destptr->next = new CircListNode<T>(value);destptr = destptr->next;srcptr = srcptr->next;}destptr->next = first;}~CircList(){//makeEmpty();delete first;}void makeEmpty() //将链表置空{if(IsEmpty()){return;}CircListNode<T> *p = NULL;while(first->next != first){p = first->next;first->next = p->next;delete p;}}int Length() const//计算循环链表的长度{int count = 0;CircListNode<T> * p = first;while(p->next != first){count++;p = p->next;}return count;}bool IsEmpty()//判空{if(first->next == first){return true;}return false;}CircListNode<T> *getHead() const//返回附加头节点的地址{return first;}void setHead(CircListNode<T> *p)//设置附加头结点地址{first = p;}CircListNode<T> *Serach(T x)//搜索含数据x的元素{if(IsEmpty()){return NULL;}CircListNode<T> * p = first->next;while(p != first){if(p->data == x){return p;}p = p->next;}return p;}CircListNode<T> *Locate(int i)//搜索第i个元素的地址{if(IsEmpty()||i < 0){return NULL;}CircListNode<T> * current = first->next;int k = 0;while(current != first && k < i){current = current->next;k++;}return current;}T *getData(int i) //取出第i个元素的值{CircListNode<T> * current = Locate(i);if(current == NULL){return NULL;}return &(current->data);}void setData(int i, T& x)//用x修饰第i个元素的值{CircListNode<T> * current = Locate(i);if(current == NULL){return;}current->data = x;}bool Insert(int i, T& x)//在第i个元素后插入x{CircListNode<T> * current = Locate(i);if(current == NULL){return false;}CircListNode<T> * s = new CircListNode<T>(x);s->next = current->next;current->next = s;return true;}bool Remove(int i, T& x)//删除第i个元素,x 返回该元素的值{if(IsEmpty()){return false;}CircListNode<T> * current = Locate(i-1);if(current == NULL && current->next == first){return false;}CircListNode<T> * del = current->next;current->next = del->next;x = del->data;delete del;return true;}void PushBack(const T& x){CircListNode<T> * p = first;while(p->next!= first){p = p->next;}CircListNode<T> *s = new CircListNode<T>(x);p->next = s;s->next = first;}void input() //输入{T x;cout << "请输入表中元素:";while((cin >> x) && x){PushBack(x);}}void output() //输出{CircListNode<T> * p = first;while(p->next != first){cout << p->next->data << "-->";p = p->next;}cout << "First" << endl;}CircList<T> &operator=(CircList<T> &L)//重载函数,赋值{T value;CircListNode<T> *srcptr = L.getHead();CircListNode<T> *destptr = first = new CircListNode<T>;while(srcptr->next != first){value = scrptr->next->data;destptr->next = new CircListNode<T>(value);destptr = destptr->next;srcptr = srcptr->next;}destptr->next = first;return *this;}private:CircListNode<T>* first;};</span></strong></strong></span>
还有其约瑟夫环的实现:
<span style="font-size:18px;"><strong>template<class T>void Josephus(CircList<T> &Js, int n, int m){CircListNode<T> * p = Js.Locate(0);CircListNode<T> * pre = NULL;int i,j;for(i = 0; i < n-1; ++i){for(j = 1; j < m; ++j){pre = p;p = p->next;if(p->data == -1)//略过头结点{p = p->next;}}cout << "出列的人是:" << p->data << endl;pre->next = p->next;delete p;p = pre->next;}cout <<"剩下的人是:" << p->data << endl;}int main(){CircList<int> clist(-1);int i,n,m;cout << "输入游戏者人数和报数间隔:";cin >> n >> m;for(i = 1; i <= n; ++i){clist.PushBack(i);}Josephus(clist, n, m);return 0;}</strong></span>
0 0
- 循环链表 c
- 【数据结构】实现循环链表(c++)
- 双向循环链表list(C++)
- 约瑟夫环(C循环链表)
- list-c循环链表
- C语言循环链表
- 循环链表C程序
- C循环链表详解
- C语言循环链表求解约瑟夫环问题(循环方式)
- 循环链表——约瑟夫问题(C++)
- 双向循环链表的实现(C)
- 链表反转C实现(递归与循环)
- 队列实现 (双向循环链表 C++)
- 双向循环链表基本操作(C语言)
- Linux C 数据结构——链表(循环链表)
- 链表反转C实现(递归与循环)
- 约瑟夫问题(C语言 -循环链表)
- 数据结构与算法(C语言版)__循环链表
- 属性“$”的值为 null、未定义或不是 Function 对象
- Spring事务管理--高级应用难点剖析: 第 3 部分
- market-广告与盈利模式-admob
- (读书笔记)演说:用幻灯片说服全世界
- <LeetCode OJ> 292. Nim Game
- C++循环链表(殷人昆版)
- ListView属性Android:descendantFocusability
- winform 主页面最大化
- 第八章(1)-神奇的委托-学习笔记
- 遍历Map
- 查询流程状态不等于处理完成的人员ID
- 外国人眼中最好的五个第三方 DNS 服务器
- Spark PageRank
- 自己备份的JS脚本