设头指针的循环单向队列及其约瑟夫环应用
来源:互联网 发布:网络保险平台排名 编辑:程序博客网 时间:2024/06/05 16:48
typedef struct QNode {int data;QNode *next;}QNode;typedef struct CLQueue {QNode *head;}CLQueue;void initCLQueue(CLQueue &Q) {//区别于只有一个结点的自闭环,空队列head->next设为NULLQ.head = new QNode;Q.head->data = NULL;Q.head->next = NULL;}bool isEmptyCLQueue(CLQueue Q) {//不采用Q.head->next==Q.head,因为那表示有且仅有一个结点if (Q.head->next==NULL)return true;elsereturn false;}int getCLQueueSize(CLQueue Q) {//获取队列长度if (isEmptyCLQueue(Q)) {return NULL;}if (Q.head->next == Q.head) {//只有一个结点时return 1;}int len = 1;QNode *tailNode = Q.head->next;while (tailNode != Q.head) {tailNode = tailNode->next;len++;}return len;}QNode* getCLQueueTail(CLQueue Q) {//获取队尾指针int len = getCLQueueSize(Q);if (len == 0) {return NULL;}if (len == 1) {return Q.head;}QNode* tailNode = Q.head;for (len; len > 1; len--) {tailNode = tailNode->next;}return tailNode;}void showCLQueue(CLQueue Q) {//遍历输出各结点值一遍int len = getCLQueueSize(Q);if (len == NULL) {cout << "Empty!" << endl;return;}QNode* showNode = Q.head;for (len; len > 0; len--) {cout << showNode->data<<" ";showNode = showNode->next;}cout << endl;return;}void enCLQueue(CLQueue &Q,int e) {//队尾入队QNode *tailNode = getCLQueueTail(Q);if (!tailNode) {//空插,head已经分配空间,无需再分配Q.head->data = e;Q.head->next = Q.head;return;}QNode *newNode = new QNode;newNode->data = e;if (tailNode == Q.head) {//只有一个结点Q.head->next = newNode;newNode->next = Q.head;return;}//多个结点tailNode->next = newNode;newNode->next = Q.head;return;}int deCLQueue(CLQueue &Q) {//队头出队QNode *tailNode = getCLQueueTail(Q);if (!tailNode) {//空删非法cout << "Error: empty delete!" << endl;return NULL;}int e;if (tailNode == Q.head) {//一个结点删除时,无需删除队列本身,只还原成空队列(断开头结点自闭环)e = Q.head->data;Q.head->data = NULL;Q.head->next = NULL;return e;}//多个结点,保存原队头,将队头后移,连接队尾与新队头,删除原队头QNode *delNode = Q.head;Q.head = Q.head->next;tailNode->next = Q.head;e=delNode->data;delete delNode;return e;}void rotateCLQueue(CLQueue &Q,int i) {//转动闭环,使得头指针指向第i个位置,队列元素保持不变int len = getCLQueueSize(Q);if (!len) {cout << "Error: empty rotate!" << endl;return;}if (len == 1) {return;}QNode *curNode = Q.head;for (i; i > 1; i--) {curNode = curNode->next;}Q.head = curNode;return;}
int joseph(int num,int first) {//约瑟夫环//num: 总人数,first:第一个报数位置CLQueue J; int last;initCLQueue(J);for (int i = 1; i <= num; i++) {enCLQueue(J, i);}showCLQueue(J);do {rotateCLQueue(J, first);last = deCLQueue(J);cout <<last<<" ";} while (!isEmptyCLQueue(J));cout << endl;return last;}
阅读全文
0 0
- 设头指针的循环单向队列及其约瑟夫环应用
- 设某循环队列的容量为50,如果头指针front=45(指向队头元素的前一位置),尾指针rear=10(指向队尾元素),则该循环队列中共有元素个数为?
- 循环队列的主要特点及其应用
- 链表的应用:利用无头结点循环链表解决约瑟夫环问题
- 基于java的数据结构学习手记8--循环单链表及其应用约瑟夫环
- 单向循环链表--约瑟夫环
- 约瑟夫环---单向循环链表
- 单向循环链表求解约瑟夫环
- 设数组data[m]作为循环队列的存储空间。front为队头指针,rear为队尾指针,则执行出队操作后其头指针front值为()
- poj3750约瑟夫环,循环队列
- 如果用一个循环数组q[0..m-1]表示队列时,该队列只有一个队列头指针front,不设队列尾指针rear,求这个队列中从队列投到队列尾的元素个数(包含队列头、队列尾)。
- 约瑟夫问题(单向循环链表应用实例)
- JavaScript数据结构之单向循环链表应用-约瑟夫问题
- 单向循环链表的实现以及约瑟夫环的实现
- 约瑟夫问题的单向循环链表的解法
- 约瑟夫问题的单向循环链表的代码实现
- C_栈和队列(ADT)-队列的非循环(无头指针)顺序表示和实现
- 单向循环队列
- 数据挖掘中的数据清洗方法大全
- centos6.5 上网
- IntelliJ Idea 常用快捷键列表(Window版)
- Google自动编程框架AutoML入门指南
- 利用 Javascript 实现上传图片并向服务器获取图片路径后显示的 demo
- 设头指针的循环单向队列及其约瑟夫环应用
- 六级_第十天
- ffmpeg源码分析2
- 重启大法好
- Contest4:Problem B: Mirror Expression
- 实现strcpy得分点
- 删除文件中特定字符串
- [leetcode]解决Symmetric Tree的一点小心得
- Apache的配置详解,最好的Apache配置文档