约瑟夫环程序设计

  程序设计思想  

  1.定义一个头指针。

    2.键盘输入一个数值控制链表的长度。

    3.利用输入的数值产生for循环结构输入结点位置的数据域,最后尾指针指向头节点,构成循环链表。

  4.输入报数的上限值,从头节点开始循环,报数的上限停下的结点被删除。  

  5.从被删除的结点的下一个节点开始,以被删除的数据域为上限值继续循环。 

 

  设计思想漏洞:  有开始删除的标志,没有结束标志。

遇到的问题  

  1.循环的设置,从头循环结束。

  2.对于密码位置得到设定。

 

重写的程序设计思想  

  1.建立一个包含位置与密码的数据域,再建立头指针。

  2.输入循环链表的长度,建立完好的循环链表。

  3.输入上限数,从头节点开始循环,在要删除的结点前一个节点停下。

  4.将下一个节点的密码设为上限数,输出下一个节点的位置。  

  5.删除下一个节点,利用while循环判断上限数防止上限数是否过小可能导致循环停止。 

  6.如果太小则将该节点的密码设置为上限数,输出位置,否则继续循环。  

  7.再循环到只有一个节点的时候停止循环,循环外面直接输出最后一个节点的位置。

程序代码

#include <iostream>

using namespace std;

typedef struct

{

   int number; //结点的密码    

   int position; //结点的位置

}data;

typedef struct LNode

{  

  data point;

  struct LNode *next;

}LNode,*Linklist;

int main()

{  

  Linklist l;  

  l=new LNode;  

  l->next=NULL;

  Linklist r; 

  r=new LNode;  

  r=l;

  int n;    

  cout <<"请输入链表的长度:";  

  cin>>n;

  cout <<"请输入"<<n<<"个整数:"<<endl;//链表的建立  

  for(int i=1;i<=n;i++)     

  {   

    Linklist p;

    p=new LNode;   

    cin>>p->point.number;  

    p->point.position=i;   

    p->next=NULL;   

    r->next=p;   

    r=p;   

    if(i==n)   

    {    

      p->next=l->next;    

      cout <<p->next->point.number;   

    }  

  }

   int m;  

  cout <<"请输入设定的上限数:";  

  cin>>m;

  Linklist p;//验证是否可以循环输出,即循环链表是否建立成功  

  p=new LNode;  

  p=l->next;  

  for(int i=1;i<=m;i++) //利用输出判定循环链表的建立

  {   

  cout <<p->point.number<<p->point.position<<"  ";   

  p=p->next;  

  }  

  cout <<endl;

  int t=0;//t代表执行的次数  

  for(int i=1;i<=m;i++)//利用给出的上限数开始循环 依次输出密码的位置  

  {   

    p=p->next;   

    if(i==m-1)   

    {    

      i=0;    

      m=p->next->point.number;    

      cout <<p->next->point.position<<"  ";   

       t++;    

      Linklist q;    

      q=new LNode;    

      q=p->next;    

      p->next=q->next;    

      delete q;    

      while(m==1)    //防止密码太小导致循环停止    

      {     

        m=p->next->point.number;    

        cout<<p->next->point.position<<"  ";

        t++;     

        Linklist w;     

        w=new LNode;     

        w=p->next;     

        p->next=w->next;     

        delete w;    

      }   

    }   

    if(t==n-1)   //判断是否只剩下一个结点,若剩下一个则结束循环   

    {    

      break;   

     }     

  }  

  cout <<p->point.position<<endl;  //输出最后一个结点的位置

   return 0;

}

posted on 2015-10-12 12:47  菜鸟逛街  阅读(796)  评论(0编辑  收藏  举报