mz314 2016-11-09 06:56 采纳率: 0%
浏览 1223

C\C++,用循坏列表实现约瑟夫问题,求大腿指导!

以下是我用循环列表实现约瑟夫问题的代码,通过调试,已经发现了DeleteDeath()函数那里存在空指针导致程序崩溃的问题,然后就一头雾水了,求大神指导,我这段程序改怎么改正从而实现约瑟夫问题!谢谢了!!!

 #include<iostream>
#include<stdlib.h>
using namespace std;
//循环链表结构定义
typedef struct node
{
    int data;
    struct node *next;
}ListNode;
typedef ListNode *LinkList;
//建立带头结点的单循环链表
void initRing(int n, LinkList &R)
{
    ListNode *p, *rear;
    p = NULL;
    //构造一个空的循环列表
    R = (LinkList)malloc(sizeof(ListNode)); //建立头结点
    R->next = R;
    rear = R;   //尾指针指向头结点
    for (int i = 1; i <= n; i++) {
        p = (LinkList)malloc(sizeof(ListNode));
        p->data = i;
        p->next = NULL;
        rear->next = p;
        rear = p;
        rear->next = R;
    }
}
//获取出列的人的编号
void DeleteDeath(int n, int m, LinkList &R)
{
    int i;
    LinkList p, q, s;
    s = (LinkList)malloc(sizeof(ListNode));
    q = R;
    p = R;
    while (R->next != NULL) {
        for (int i = 1; i<m; i++) {         
            p = p->next;     //找到第m-1个节点
            q = p;           //用 q 记录第m-1个节点
        }
        s->data = p->next->data;  //将下一个,即第m个节点删除
        cout << s->data << endl;
        free(p->next);      
        q->next = p->next->next;    //问题出在这行,q->next出现了空指针
    }
}
int main()
{
    LinkList R;
    int n, m;
    cout << "总人数n= "<< "   " << "报数上限m=" << endl;
    cin >> n >> m;


    initRing( n, R);
    DeleteDeath( n,  m, R);

    return 0;
}
  • 写回答

6条回答 默认 最新

报告相同问题?

悬赏问题

  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog
  • ¥15 Excel发现不可读取的内容