队列的链表实现
#include "bits/stdc++.h" using namespace std; // 队列的节点 struct Node { int data;//数据域 struct Node* next;//指针域 }; // 队首队尾指针 struct Queue { struct Node* front;//队头指针 struct Node* rear;//队尾指针 int size;//队列长度 }; void QueueInit(struct Queue* queue)//初始化队列 { queue->front = NULL; queue->rear = NULL; queue->size = 0; } int QueueEmpty(struct Queue* queue)//判断队列为空 { return (queue->size == 0);//队列长度为空 返回1 } void QueuePush(struct Queue* queue, const int data)//入队 { struct Node* node; node = (struct Node*)malloc(sizeof(struct Node));//为节点分配空间 assert(node != NULL);//断言节点不为空 可进行后续程序 node->data = data; node->next = NULL; if(QueueEmpty(queue))//如果队列为空 { queue->front = node; queue->rear = node; } else { queue->rear->next = node; queue->rear = node; } ++queue->size;//队列长度++ } int QueuePop(struct Queue* queue, int* data)//出队 { if (QueueEmpty(queue))//队列中没有数据 程序退出 { return 0; } struct Node* tmp = queue->front;//创建临时节点 *data = queue->front->data; queue->front = queue->front->next; free(tmp); --queue->size; return 1; } void QueueDestroy(struct Queue* queue)//销毁队列 { struct Node* tmp; while(queue->front) { tmp = queue->front; queue->front = queue->front->next; free(tmp); } queue->front=queue->rear=NULL; } void GetLength(struct Queue *queue)//获取队列长度 { int data= queue->size; printf("队列长度为:%d",data); printf("\n"); } void GetHead(struct Queue *queue)//获取队头元素 { int data=queue->front->data; printf("队头元素是%d:",data); cout<<endl; } void QueueTreverse(struct Queue* queue)//遍历 { int data; struct Node *tmp; printf("队列中的元素是:"); while(queue->front) { tmp=queue->front; data=tmp->data; printf("%d ",data); queue->front=queue->front->next; } printf("\n"); } void menu(struct Queue* Q) { int choice,data; cout<<"1.***入队 2.***出队"<<endl; cout<<"3.***队列长度 4.***队列遍历"<<endl; cout<<"5.***获取队列头元素 6.*****队列销毁"<<endl; cout<<"输入你的选择:";cin>>choice; switch (choice){ case 1:cout<<"输入数据:";cin>>data;QueuePush(Q,data);break; case 2:QueuePop(Q,&data);cout<<"出队的元素是:"<<data<<endl;break; case 3:GetLength(Q);break; case 4:QueueTreverse(Q);break; case 5:GetHead(Q);break; case 6:QueueDestroy(Q);break; default:cout<<"请输入1-6范围内的值";break; } } int main(void) { struct Queue queue; QueueInit(&queue);//初始化 while (1) { menu(&queue); } return 0; }
约瑟夫环的链表实现
#include "bits/stdc++.h" using namespace std; typedef struct Node{ int num; struct Node *next; }JoseNode,*pNode; void JoseInit(pNode &p)//初始化约瑟夫环 { p=new JoseNode ;//分配空间 p->next=p;//建立链表循环 } void Jose_Insert(pNode &p,int n)//约瑟夫环的插入 { pNode tmp=p;//临时节点 始终指向头节点 for(int i=1;i<=n;i++) { if(i==1) tmp->num=i;//为头节点录入第一个数据 else { //创建新节点 并用尾插法 JoseNode *newNode=new JoseNode ; newNode->num=i; tmp->next=newNode; newNode->next=p;//新节点的指针域指向头节点 建立循环 tmp=newNode;//临时节点向后移一位 } } } void Jose_Delete(pNode &p,int k,int n)//k是密码 { pNode tmp; cout<<"出环顺序为:"; while (n!=0)//当环内人数不为0时 程序执行 { for(int i=1;i<k-1;i++)//若要找到所求的位置节点 需找到其前一个位置节点 { p=p->next; } tmp=p->next;//所求位置节点 p->next=tmp->next;//让所求位置的前一个节点指针 指向所求位置的后一个节点 cout<<tmp->num<<"->"; free(tmp);//释放节点 p=tmp->next;//将新节点向后移一个位置 n--; } } int main() { pNode p; int n,k;//n是人数 k是密码 JoseInit(p);//初始化 cout<<"输入人数和密码:"; cin>>n>>k; Jose_Insert(p,n);//约瑟夫环插入 Jose_Delete(p,k,n);//约瑟夫环的输出 }
约瑟夫环的数组实现
#include "bits/stdc++.h" using namespace std; int Joseph[100]={0}; int main() { int n,m;//n是人数 m是密码 int i=0,k=0,j=0;//i是数组下标标识位置 k是标记符标记数到了几 j是出局的人数 cin>>n>>m; while(j!=n) { i++;//下标从1开始 if(i>n) i=1;//如果超出下标n 重新从下标1开始 if(Joseph[i]==0) { k++; if(k==m)//当数到m时 输出当前位置下标 { j++; cout<<i<<"->"; k=0;//重新初始化k 从0继续开始 } } } }
约瑟夫环的递归实现
#include "bits/stdc++.h" using namespace std; //ysf(n,k,i)=ysf(n-1,k,i-1) i!=1 ysf(n,k,i)=(n+k-1)%n i=1; int ysf(int n,int k,int i)//n为总人数 报数为k 第i个人出队的编号 { if(i==1) return (n+k-1)%n; else return (ysf(n-1,k,i-1)+k)%n; } int main() { int n,m; cout<<"输入人数和密码:"; cin>>n>>m; cout<<"出环顺序:"; for(int i=1;i<=n;i++) cout<<ysf(n,m,i)+1<<"->"; return 0; }
约瑟夫环递推法实现
#include "bits/stdc++.h" using namespace std; int cir(int n,int m) { int p=0; for(int i=2;i<=n;i++) { p=(p+m)%i;//每次循环向前移动m个位置 } return p+1; } int main() { int n,k; cout<<"输入人数和密码"; cin>>n>>k; cout<<"出环顺序:"; cout<<cir(n,k); return 0; }