<关于我在逛街(gai)时发现委托这件事>(省略...)
"那么这就是我在外面记录下来的委托,至于思路嘛,已经有了一些.
主要还是采用单向循环链表术式,对于结构构思,如下: | id | password | next |
首先是对其的定义
#include<iostream>
#include<cstdlib>
#include<windows.h>
#define MAX 10
using namespace std;
//struct
typedef struct NodeType{
int id,password;
struct NodeType *next;
}NodeType;
大致的流程是
1.建立n个(无头结点)结点的单项循环链表
2.从第一个结点开始循环计数找到第m个结点
3.输出该结点的id的数值,将该结点的password作为新的m的值,并删除该结点
4.重复2,3的操作,直到链表为空结束
下来是一些术式的声明:
void CreateList(NodeType* *,int);//创建
NodeType *GetNode(int,int);//取结点
void PrintList(NodeType *);//输出循环链表
int IsEmptyList(NodeType *);//判空
void JosephusOperate(NodeType * *,int);//约瑟夫环
那么首先是创建:
//创建具有N个结点的循环链表ppHead
void CreateList(NodeType * *ppHead,int n){
int i,iPassWord;
NodeType *pNew=NULL,*pCur=NULL;
for(i=1;i<=n;i++){
cout<<endl<<"请输入第"<<i<<"个人的密码:";
cin>>iPassWord;
pNew=GetNode(i,iPassWord);
if(*ppHead==NULL){
*ppHead=pCur=pNew;
pCur->next=*ppHead;
}
else{
pNew->next=pCur->next;
pCur->next=pNew;
pCur=pNew;
}
}
cout<<"创建完成"<<endl;
}
此术式同时依赖于:
NodeType *GetNode(int iId,int iPassWord){
NodeType *pNew=NULL;
pNew=(NodeType *)malloc(sizeof(NodeType));
if(!pNew){
cout<<"error at NodeType *GetNode";
exit(-1);
}
pNew->id=iId;
pNew->password=iPassWord;
pNew->next=NULL;//pNew的后继指向空,放置在表尾
return pNew;
}
下来是列出,此术式可以完成原始数据的展示:
void PrintList(NodeType *ppHead){
NodeType *pCur=ppHead;
if(!IsEmptyList(ppHead)){
cout<<"--ID-- --PASWORD--"<<endl;
do{
cout<<" "<<pCur->id<<" "<<pCur->password<<endl;
pCur=pCur->next;
}while(pCur!=ppHead);
}
}
同样,依赖于以下术式-判空:
int IsEmptyList(NodeType * ppHead){
if(!ppHead){
cout<<"Empty!"<<endl;
return 1;
}
return 0;
}
下来就是关键:
void JosephusOperate(NodeType * *ppHead,int iPassWord){
int iCounter,iFlag=1;
NodeType *pPrv=NULL,*pCur=NULL,*pDel=NULL;
pPrv=pCur=*ppHead;
while(pPrv->next!=*ppHead){
pPrv=pPrv->next;
}
while(iFlag){
for(iCounter=1;iCounter<iPassWord;iCounter++){
pPrv=pCur;
pCur=pCur->next;
}
if(pPrv==pCur)iFlag=0;
pDel=pCur;//因为有人出列,所以删除Cur所指向的结点
pPrv->next=pCur->next;//让Prv指向的结点和Cur所指向的相连
pCur=pCur->next;//移动Cur,后移一个结点
iPassWord=pDel->password;//记录下出列的人的密码
cout<<"第"<<pDel->id<<"个人的密码:"<<pDel->password<<endl;
free(pDel); //释放
}
*ppHead=NULL;
system("pause");
}
"经过近期的学习,zbc,明天就可以取领💴了,今天就到这里吧".
//这篇的时间是1/12