zoukankan      html  css  js  c++  java
  • 约瑟夫环程序设计

      程序设计思想  

      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;

    }

  • 相关阅读:
    测试用例编写思路
    pipenv和virtualenv
    HTTP协议
    性能测试实践
    性能测试
    JS创建类和对象
    servlet的转发与重定向
    早晚得看算法
    安卓开始啦
    写于大三下开学前(即将休学)
  • 原文地址:https://www.cnblogs.com/dotacai/p/4871315.html
Copyright © 2011-2022 走看看