c++中总是说无法读取内存怎么回事

comeonbabe_ 2017-10-23 10:52:22
#include <iostream>

using namespace std;

/*请设计实现集合类,元素类型为整形,
集合采用带头结点单链表表示。该集合类支持集合元素
增加、删除、查询;并支持集合并、交、差运算;
利用你设计的集合类,实现本题要求。
程序应体现面向对象程序设计思想,结构合理。为保证结果唯一,
集合元素递增排列。如需用到拷贝构造和赋值应重载.
空间应正确释放. 要求使用移动复制和移动赋值
,但本平台编译器不支持,所以,这部分代码以注解形式提供.*/
typedef struct LNode
{
int data;
struct LNode *next;
}LNode,*Linklist;


class Set
{
public:
Linklist L;
void Add_Elem(int x);
void Delete_Elem(int x);
bool Search(int x);
Set();
~Set();
};


void Create_L(Linklist &L)
{
L=(Linklist)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
}

Set::Set()
{
L=(Linklist)malloc(sizeof(LNode));
if(!L)
exit(OVERFLOW);
L->next=NULL;
}

Set::~Set()
{
Linklist q=L,p=L;
while (p->next!=NULL)
{
p=p->next;
free(q);
q=p;
}
free(p);
}

void Set::Add_Elem(int x)
{
Linklist p=L,q;
while ((p->next)!=NULL&&(p->next->data)<=x)
{
if(p->next->data==x)
{
cout<<"错误:集合中不能有重复元素!"<<endl;
exit(1);
}
p=p->next;
}
q=(Linklist)malloc(sizeof(LNode));
if(!q)
exit(OVERFLOW);
q->data=x;
q->next=p->next;
p->next=q;
}

void Set::Delete_Elem(int x)
{
Linklist p=L,q;
if(Search(x)==true)
{
while (p->next->data<x)
{
p=p->next;
}
q=p->next;
p->next=q->next;
free(q);
}
}

bool Set::Search(int x)
{
Linklist p=L;
while (p->next->data<x)
{
p=p->next;
}
if(p->next->data==x)
{
cout<<"找到该元素了"<<endl;
return true;
}
else
{
cout<<"集合中没有该元素!"<<endl;
return false;
}
}


Set Union(Set myset1,Set myset2)
{
Set myset;
Linklist p=myset1.L,q=myset2.L,r=myset.L;
while (p->next&&q->next)
{
if(p->next->data==q->next->data)
{
r->next=(Linklist)malloc(sizeof(LNode));
if(!r->next)
exit(OVERFLOW);
r=r->next;
p=p->next;
q=q->next;
r->data=p->next->data;
}
else if(p->next->data<q->next->data)
{
r->next=(Linklist)malloc(sizeof(LNode));
if(!r->next)
exit(OVERFLOW);
r=r->next;
p=p->next;
r->data=p->data;
}
else if(q->next->data<p->next->data)
{
r->next=(Linklist)malloc(sizeof(LNode));
if(!r->next)
exit(OVERFLOW);
r=r->next;
q=q->next;
r->data=q->data;
}
}

if(!(p->next)&&q->next)
{
while(q->next)
{
r->next=(Linklist)malloc(sizeof(LNode));
if(!r->next)
exit(OVERFLOW);
r=r->next;
q=q->next;
r->data=q->data;
}
}
if(!(q->next)&&p->next)
{
while (p->next)
{
r->next=(Linklist)malloc(sizeof(LNode));
if(!r->next)
exit(OVERFLOW);
r=r->next;
p=p->next;
r->data=p->data;
}
}
return(myset);
}

void Display(Set myset)
{
if(!myset.L->next)
cout<<'{'<<'}'<<endl;
else
{
Linklist p=myset.L->next;
cout<<'{';
while (p->next)
{
cout<<p->data<<',';
p=p->next;
}
cout<<p->data<<'}'<<endl;
}
}

int _tmain(int argc, _TCHAR* argv[])
{
Set A;
Set B;
A.L=(Linklist)malloc(sizeof(LNode));
A.L->next=NULL;
B.L=(Linklist)malloc(sizeof(LNode));
B.L->next=NULL;
int m,n;
int i=0,j=0,x;
cin>>m>>n;
while (i<=m)
{
cin>>x;
A.Add_Elem(x);
i++;
}
while (j<=n)
{
cin>>x;
B.Add_Elem(x);
j++;
}
Display(A);
Display(B);
Display(Union(A,B));
return 0;
}
//目前只是想做一下那个并集,但是调试时总是在union中间出现无法读取内存错误,求大神教一下小白
...全文
1972 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-10-24
  • 打赏
  • 举报
回复
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧