赤名莉香_ 2022-07-04 11:22 采纳率: 33.3%
浏览 33
已结题

关于循环链表解决约瑟夫环

大家帮忙看一下,为什么我这个只要选第一个死就会出错误,选别的死就没事


#include<iostream>
#include<stdlib.h>
using namespace std;
typedef struct _node{
 int data;
 struct _node *next;
}Node;
void tailcreate(Node *L,int n)
{
 Node *p,*r;
 r=L;
 for(int i=1;i<=n;i++)
 {
  p=(Node *)malloc(sizeof(Node));
  p->data=i;
  
  r->next=p;
  r=p;
 }
 r->next=L->next;
 } 
 Node * Delete(Node *L,int num)
 {
  Node *p,*q;
 p=L;
  for(int i=1;;i++)
  {
   
   q=p;
   p=p->next;
   if(i==num)
   {
   if(p==L->next)  
    L->next=p->next;
    q->next=p->next;
    delete(p);
    break;
   }
   
  }
  return q;
}
void print(Node *head)
{
 
 Node *p;
 p=head;
    do
    {
     
     cout<<p->data<<' ';
     p=p->next;
    }while(p->next!=head->next);
}

  int main()
  {
   Node *head,*p;
   int n,num,m;
   cout<<"一共有几个人:";
   cin>>n; 
   m=n;
   head=(Node *)malloc(sizeof(Node));
   tailcreate(head,n);
   cout<<"第几个人死:";
   cin>>num;
   
  while(m--,m!=0)
  {
   p=Delete(head,num);head=p;
   print(head);
   cout<<endl;
   
   
    }  
    cout<<"存活编号";
    print(head);
    
     } 
  
 
  • 写回答

2条回答 默认 最新

  • 快乐鹦鹉 2022-07-04 11:46
    关注

    主要是你这个是有头结点的循环链表,当第一个节点删除时,你没有将最后一个节点的next指向第一个节点,导致print时你的while条件成立不了

     
    #include<iostream>
    #include<stdlib.h>
    using namespace std;
    typedef struct _node{
        int data;
        struct _node *next;
    }Node;
    void tailcreate(Node *L,int n)
    {
        Node *p,*r;
        r=L;
        for(int i=1;i<=n;i++)
        {
            p=(Node *)malloc(sizeof(Node));
            p->data=i;
    
            r->next=p;
            r=p;
        }
        r->next=L->next;
    } 
    Node * Delete(Node *L,int num)
    {
        Node *p,*q;
        q =L;
        p =L->next;
        if(num==1)
        {
            do
            {
                q=q->next;
            }while(q->next!=L->next);
            q->next = p->next;
            q = p->next;
            delete(p);
        }
        else
        {
            for(int i=1;;i++)
            {
    
                q=p;
                p=p->next;
                if(i==num)
                {
                    if(p==L->next)  
                        L->next=p->next;
                    q->next=p->next;
                    delete(p);
                    break;
                }
            }
        }
        return q;
    }
    void print(Node *head)
    {
    
        Node *p;
        p=head;
        do
        {
    
            cout<<p->data<<' ';
            p=p->next;
        }while(p->next!=head->next);
    }
    
    int main()
    {
        Node *head,*p;
        int n,num,m;
        cout<<"一共有几个人:";
        cin>>n; 
        m=n;
        head=(Node *)malloc(sizeof(Node));
        tailcreate(head,n);
        cout<<"第几个人死:";
        cin>>num;
    
        while(m--,m!=0)
        {
            p=Delete(head,num);head=p;
            print(head);
            cout<<endl;
    
    
        }  
        cout<<"存活编号";
        print(head);
    } 
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录
查看更多回答(1条)

报告相同问题?

问题事件

  • 系统已结题 7月12日
  • 已采纳回答 7月4日
  • 创建了问题 7月4日

悬赏问题

  • ¥20 创建taro项目,在vscode上能够写跨平台写微信小程序代码
  • ¥15 网站出现错误跳转问题
  • ¥15 Docker容器里已经安装了ssh,但打包迁移到新机器一直容器一直提示unrecognized service。
  • ¥15 综合布线实例设计,就好看好看不恐怖可好滤镜好聚
  • ¥15 使用moviepy库视频合并时出错
  • ¥30 FLUENT液固传质UDF
  • ¥15 怎么看梯度直方图以,怎么判断梯度消失/爆炸,怎么解决
  • ¥15 aspnetdll文件访问拒绝
  • ¥15 wpf中在模版中寻找元素
  • ¥15 MFC平台生成指定圆