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

时间:2021-02-25 04:23:08
c++
#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中间出现无法读取内存错误,求大神教一下小白

1 个解决方案

#1


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止

#1


崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处, 看不懂时双击下一行,直到能看懂为止