小周打bug 2021-10-08 08:46 采纳率: 100%
浏览 82
已结题

C++创建单循环链表写约瑟夫环问题报错内存访问权限冲突

创建循环单链表写约瑟夫环问题,一直报错0xDDDDDDDD
源代码
#include
using namespace std;
struct Node//结点类型
{
int data; //数据域
Node* next; //指针域
};
int main()
{
int num, k;//n为人数,k为报数到几出列
cout << "请输入参加游戏的人数:";
cin >> num;
cout << "每报数到几出列:";
cin >> k;
struct Node* H = NULL, * r = NULL;//H是头指针,r是尾指针,都先赋初值为空
struct Node* p, * q;//用两个指针方便后面删除操作,使q一直是p的前驱
//创建一个无头结点的循环单链表,从尾部插入n个节点
for (int i = 1; i <= num; i++)
{
p = (struct Node*)malloc(sizeof(struct Node));
p->data = i;
if (H == NULL)//对于第一个节点的操作
H = r = p;//使头尾指针都指向第一个节点,同时也固定了头指针
else//对于其他节点的操作
{
p->next = H;//新增节点指向头指针,实现循环
r->next = p;
r = p;//新表尾替换旧表尾
}
}
p = H; q = r;//p指向第一个节点,q指向表尾,q一直做p前驱
int count = 0;//记录出列人数
while (count != num)//count=num代表所有人都出列
{
for (int j = 1; j <= k;)
{
if (j != k)
{
q = q->next;
p = p->next;
j++;
}
if (j == k)//报数到k删除节点
{
count++;
q->next = p->next;
cout << "第" << count << "个出列的人是:" << p->data << endl;
free(p);//删除p
p = q->next;//让p重新指向q的后继
j = 1;
}
}
}
return 0;
}

img

报错:

img

  • 写回答

1条回答 默认 最新

  • CSDN专家-link 2021-10-08 10:12
    关注

    主要原因是你最后循环中,while其实没起到作用,都在for循环中进行了。可for循环却没有有效的结束条件,因为一旦i==k,你就会删除节点,然后把j设置为1。其实这个for是个死循环。当节点都删除后,你的 p和q还在移动,自然就死掉了。
    修改也很简单,在for循环的if(j==k)的末尾增加while的条件判断
    if(count == num)
    break;
    即可。
    最后代码如下:

    #include <iostream>
    using namespace std;
    struct Node//结点类型
    {
        int data; //数据域
        Node* next; //指针域
    };
    int main()
    {
        int num, k;//n为人数,k为报数到几出列
        cout << "请输入参加游戏的人数:";
        cin >> num;
        cout << "每报数到几出列:";
        cin >> k;
        struct Node* H = NULL, * r = NULL;//H是头指针,r是尾指针,都先赋初值为空
        struct Node* p, * q;//用两个指针方便后面删除操作,使q一直是p的前驱
        //创建一个无头结点的循环单链表,从尾部插入n个节点
        for (int i = 1; i <= num; i++)
        {
            p = (struct Node*)malloc(sizeof(struct Node));
            p->data = i;
            if (H == NULL)//对于第一个节点的操作
                H = r = p;//使头尾指针都指向第一个节点,同时也固定了头指针
            else//对于其他节点的操作
            {
                p->next = H;//新增节点指向头指针,实现循环
                r->next = p;
                r = p;//新表尾替换旧表尾
            }
        }
        p = H; q = r;//p指向第一个节点,q指向表尾,q一直做p前驱
        int count = 0;//记录出列人数
        for (int j = 1; j <= k;)
        {
            if (j != k)
            {
                q = q->next;
                p = p->next;
                j++;
            }
            if (j == k)//报数到k删除节点
            {
                count++;
                q->next = p->next;
                cout << "第" << count << "个出列的人是:" << p->data << endl;
                free(p);//删除p
                if(count == num)
                    break;
                p = q->next;//让p重新指向q的后继
                j = 1;
            }
        }
        return 0;
    }
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 10月10日
  • 已采纳回答 10月8日
  • 创建了问题 10月8日

悬赏问题

  • ¥15 软件定义网络mininet和onos控制器问题
  • ¥15 微信小程序 用oss下载 aliyun-oss-sdk-6.18.0.min client报错
  • ¥15 ArcGIS批量裁剪
  • ¥15 labview程序设计
  • ¥15 为什么在配置Linux系统的时候执行脚本总是出现E: Failed to fetch http:L/cn.archive.ubuntu.com
  • ¥15 Cloudreve保存用户组存储空间大小时报错
  • ¥15 伪标签为什么不能作为弱监督语义分割的结果?
  • ¥15 编一个判断一个区间范围内的数字的个位数的立方和是否等于其本身的程序在输入第1组数据后卡住了(语言-c语言)
  • ¥15 Mac版Fiddler Everywhere4.0.1提示强制更新
  • ¥15 android 集成sentry上报时报错。