//循环链表.h

#include "stdafx.h"
#include<iostream>
using namespace std;
 
typedef int  Elemtype[2]  ;

typedef struct l {
    Elemtype  elem;
    struct l* next;
}l;//链表的结点类型为结构体;

l* r,*f;

bool initlist(l*&a)
{ a=(l*)malloc(sizeof(l));
  if(!a)return false;
    (*a).next=a;r=a;f=a;
  return true;
}//键头结点;

void link(l* s)
{    
    (*r).next=s;
     r=s;
    (*s).next=f;
}//将结点连成循环链表;

void creat(int b)
{ int i=0;
  for(i=0;i<b;i++)
  {  l* s=new l;     
     link(s);
  }
}//创建每个结点并连成链表;

void del(l*a)
{  l*p;   
   p=a->next->next;
   free(a->next);
   a->next=p;  
}//将没用的结点删除;

#include "stdafx.h"
#include<iostream>
#include"循环链表.h"
using namespace std;

void fun(int& c)
{
    int m;;l* a,*q;l*t=new l;        
    initlist(a);//建头结点;
    creat(c);//链表建成;  
 
    t=a->next;//t指针指向第一个结点;    
    
    int i=0;
    for(i=0;i<c;i++)
       { cout<<"请输入第"<<i+1<<"密码:"<<endl;
         cin>>t->elem[0];        
         t->elem[1]=i+1;
         t=t->next;
       }//输入密码和号数;
       
    cout<<"输入约瑟夫环的初始密码M:"<<endl;
    cin>>m;//约瑟夫环的初始密码;

    q=a ;//q指针指向头结点;
       
   cout<<"约瑟夫环的结果:"<<endl;
   while(c){
               int j=m%c;//找到出列在链表中的位置;
               if(j==0)j=c;    
               for(int i=0;i<j-1;i++)
                   if(q->next!=a ){q=q->next;}
                   else  {q=q->next->next;}    
                   //找到出列的前一个地址;
               if(q->next==a){q=q->next;}//判断下一个是否为头结点;
               t=q;    //t为出列前一个的地址;                  
               cout<<t->next->elem[1]<<",";//输出他在原先的号数;
               m=t->next->elem[0];//把密码改成出列的密码;
               del(t);c--;//在链表中删除出列的结点,并将链表长度减一;

           }
   //整个约瑟夫环的算法;
   cout<<endl;
   int y;
       cin>>y;//让显示等待输入,以便用户查看结果;
}

 

posted on 2013-02-25 19:34  叶城宇  阅读(174)  评论(0编辑  收藏  举报