链表一类的问题自己还是弄得不是特别熟,发现那天还是把题目做错了。今天在电脑上好好写了下。晕啊,啥时候自己也能成为一个编程达人呢。努力中,努力找工作当中。程序写在下面,这样应该对了吧。呵呵。
- //Josephus环问题
- /*
- 设有total 个人围成一圈,对他们进行顺时针编号,从第start个人开始数1,数到第m个人,第m个人出局。
- 接着从出局人的下一个开始从1数,同样第m个人出局,最终这些人全部出局。请以下面的函数实现将出局
- 人的次序以双向链表形式实现。
- struct node * locate(int total,int start,int m),
- 其中,struct node {
- int order;
- node* left;
- node* right;
- };
- */
- #define LENG sizeof(struct node)
- struct node
- {
- int order;
- struct node* left;
- struct node* right;
- };
- //环状链表实现
- struct node* locate(int total, int start ,int m)
- {
- struct node* cp1,*cp2,*head;// 创建环状链表时用到的指针
- struct node* cpp1,*cpp2,*head2;//创建出局顺序的链表
- struct node* p1,*p2,*fpointer; //进行计数M 时用到的指针
- int i,j,k;//循环变量
- if(total<1 || start<1 || m<1)
- exit(3);
- //开始创建环形链表队列
- cp1=(struct node*)malloc(LENG);
- cp1->left=cp1->right=NULL;
- cp1->order=1;
- head=cp2=cp1;
- for(i=2;i<=total;i++)
- {
- cp1=(struct node*)malloc(LENG);
- cp1->order=i;
- cp1->right=NULL;
- cp1->left=cp2;
- cp2->right=cp1;
- cp2=cp1;
- }
- cp2->right=head;
- head->left=cp2;
- //创建一个非环形链表用于标志出局顺序
- cpp1=(struct node*)malloc(LENG);
- cpp1->left=cp1->right=NULL;
- cpp1->order=1;
- head2=cpp2=cpp1;
- for(i=2;i<=total;i++)
- {
- cpp1=(struct node*)malloc(LENG);
- cpp1->order=i;
- cpp1->right=NULL;
- cpp1->left=cpp2;
- cpp2->right=cpp1;
- cpp2=cpp1;
- }
- p1=head;
- p2=head2;
- //将出局顺序写入新的双向链表中
- for(k=1;k<start%total;k++)//第一个循环将从第start%total个人开始数
- {
- fpointer=p1;
- p1=p1->right;
- }
- for(i=2;i<=total;i++)
- {
- for(j=1;j<m%total;j++)
- {
- fpointer=p1;
- p1=p1->right;
- }
- p2->order=p1->order;//数到第m个人,将这个人的序列号安排在链表2的最左面元素中
- p2=p2->right; //链表2指向下一个元素
- fpointer->right=p1->right;//链表1删除掉第m个元素后,将此元素以后的首元素左指针向前移
- free(p1);//将p1释放
- p1=fpointer->right;//链表1指向下一个元素
- }
- }