程序运行中报错中断:0x0041188c 处有未经处理的异常: 0xC0000005: 读取位置 0xfeeefef6 时发生访问冲突
约瑟夫回环的问题,在dev c++上可以正常运行,到了vs2010就报错,怀疑是链表中内存分配出了问题但是找不到,求帮助!
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到全部人全部出列为止,要使用单循环链表
约瑟夫回环的问题,在dev c++上可以正常运行,到了vs2010就报错,怀疑是链表中内存分配出了问题但是找不到,求帮助!
一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止报数。报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人开始重新从1报数,如此下去,直到全部人全部出列为止,要使用单循环链表
#include <iostream> using namespace std; typedef struct people { int num; int data; struct people* next; }people,*Linklist; void InitList (Linklist &L) { L=new people; L->next=L; } int creat(Linklist &L) { int data,num=1; Linklist r=L,p=L; cout<<"请依次输入密码(输入-1结束):"<<endl; cin>>data; while(data!=-1) { p->num=num++; p->data=data; p->next=L; r->next=p; r=p; p=new people; cin>>data; } return num-1; } Linklist _delete(Linklist &L,int num) { Linklist p=L,q=L,Q=L; int data; while(p->num!=num) { q=p; p=p->next; } if(p->num==num&&p==L) { while(Q->next!=L) Q=Q->next; Q->next=p->next; delete p; } else { q->next=p->next; delete p; } return q->next; } int main() { int start,i,j=0,len; Linklist L,p; InitList(L); len=creat(L); cout<<"请输入开始数:"; cin>>start; p=L; for(j=0;j<len;j++) { for(int i=0;i<start-1;i++) { p=p->next; } start=p->data; cout<<p->num<<" "; p=_delete(L,p->num); } return 0; }
解决方案
10
void InitList (Linklist &L) { L = new people; L->next = L; }
没有考虑L未初始化的情况
说实话,假如不是想本人一个链表的库,为什么用现成的呢,stl什么的
每次解决一个问题都要重新写个容器吗
40
_delete函数有一个问题,当删除L结点时,q->next返回的是无效结点,并且main函数的L没有及时更新。