zoukankan      html  css  js  c++  java
  • 关于约瑟夫环的一些漏洞

    #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;   //循环链表的建立,最后一个结点越过头指针指向首结点
            }
        }
    
        int m;
        cout <<"请输入设定的上限数:";
        cin>>m;
    
        Linklist p;//验证是否可以循环输出,即循环链表是否建立成功
        p=new LNode;
        p=l->next;  //将p设为首结点
        for(int i=1;i<=m;i++) //利用输出判定循环链表的建立
        {
            cout <<p->point.number<<p->point.position<<"  ";
            p=p->next;
        }
        cout <<endl;
        p=l->next;  //循环完成后把p的位置还原
    
        int t=0;//t代表执行的次数
        for(int i=1;i<=m;i++)//利用给出的上限数开始循环 依次输出密码的位置
        {
            while(m==1)    //防止输入的上限数太小导致循环停止
            {
                i=0;    //设置i归零,从新开始循环
                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(i==m-1)
            {
                i=0;  //设置i归零,从新开始循环
                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)    //防止密码太小导致循环停止
                {
                    i=0;  //设置i归零,从新开始循环
                    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;
                }
            }
            p=p->next;
            if(t==n-1)   //判断是否只剩下一个结点,若剩下一个则结束循环
            {
                break;
            }
            
        }
        cout <<p->point.position<<endl;  //输出最后一个结点的位置
    
        return 0;
    }

    以上是修正过后的代码

    1.对于输出验证循环列表成立后没有把p指针重新指向首元节点

    2.没有判断输入的上限数的值是否太小,可能导致循环无法进行。

    3.在判断上限数以及密码太小时没有把  i 的值归零,是循环重新开始。

  • 相关阅读:
    Unique Binary Search Trees 解答
    Unique Paths II 解答
    Unique Paths 解答
    Maximum Subarray 解答
    Climbing Stairs 解答
    House Robber II 解答
    House Robber 解答
    Valid Palindrome 解答
    Container With Most Water 解答
    Remove Duplicates from Sorted List II 解答
  • 原文地址:https://www.cnblogs.com/dotacai/p/4871383.html
Copyright © 2011-2022 走看看