怎么把这串代码改正确
#include
#include
class Set {
private:
int Setnum[100];
int length=0;
public :
Set();
Set(int n[100]);
Set(Set &s);
~Set();
void add_num(int num);
void del_num(int num);
void show_num();
Set jiaoji(Set &s2);
Set bingji(Set &s2);
Set chaji(Set &s2);
bool equals1(Set &s2);
bool ifinclude(Set &s2);
bool ifempty();
int num_size();
void beempty();
};
Set::Set()
{
this->length=0;
memset(this->Setnum,0,sizeof (Setnum));
}
Set::Set(int *n)
{
for(int i=0;i<_msize(n)/sizeof(*n);i++)
this->add_num(n[i]);
}
Set::Set(Set &s)
{
length=s.length;
for(int i=0;iSet()
{
}
void Set::add_num(int num)
{
int flag=0;
for(int i=0;iif(Setnum[i]==num)
{
flag=1;
break;
}
}
if(flag==0)
{
Setnum[length]=num;
length++;
}
}
void Set::del_num(int num)
{
int n=length;
while(n--){
if(Setnum[n]==num)
break;
}
for(int i=n;ifor(int i=0;i" ";
}
cout<Set Set::jiaoji(Set &s2)
{
Set s;
for(int i=0;ilength;i++)
{
s.Setnum[i]=this->Setnum[i];
s.length= this->length;
}
for(int i=0;iSet Set::bingji(Set &s2)
{
Set s;
for(int i=0;ilength;i++)
{
for(int j=0;jif(this->Setnum[i]==s2.Setnum[j])
{
s.Setnum[s.length]=s2.Setnum[j];
s.length++;
}
}
}
return s;
}
Set Set::chaji(Set &s2)
{
int flag=0;
Set s,sbing;
sbing=this->bingji(s2);
for(int i=0;ilength;i++)
{
flag=0;
for(int j=0;jif(this->Setnum[i]==sbing.Setnum[j])
{
flag=1;
break;
}
}
if(flag==0){
s.Setnum[s.length]=this->Setnum[i];
s.length++;
}
}
return s;
}
bool Set::equals1(Set &s2)
{
if(this->length!=s2.length)
return false;
for(int i=0;ilength;i++)
{
if(this->Setnum[i]!=s2.Setnum[i])
return false;
}
return true;
}
bool Set::ifinclude(Set &s2)
{
Set *sbing=new Set();
*sbing=this->bingji(s2);
if(sbing->length==this->length||sbing->length==s2.length)
return true;
else
return false;
}
bool Set::ifempty()
{
if(this->length==0)
return true;
else
return false;
}
int Set::num_size()
{
return this->length;
}
void Set::beempty()
{
memset(Setnum,0,sizeof(Setnum));
this->length=0;
}
int main()
{
cout<<"1.创建集合 s1 & s2和s3"<Set *s1=new Set(new int[]{1,10,9,8,7});
Set *s2=new Set(new int[]{1,8,7});
Set *s3=new Set(new int[]{1,7,9,6,5});
Set s4(*s3);
s1->show_num();
s2->show_num();
s3->show_num();
cout<<"**************************"<"2.向集合s1中添加一个元素5"<add_num(5);
s1->show_num();
cout<<"**************************"<"3.从集合s3中删除一个元素7"<del_num(7);
s3->show_num();
cout<<"**************************"<"4.计算s1和s2的交集"<Set *sjiao=new Set();
*sjiao=s1->jiaoji(*s2);
sjiao->show_num();
cout<<"**************************"<"5.计算s1和s2的并集"<Set *sbing=new Set();
*sbing=s1->bingji(*s2);
sbing->show_num();
cout<<"**************************"<"6.计算s1和s2的差集"<Set *scha=new Set();
*scha=s1->chaji(*s2);
scha->show_num();
cout<<"**************************"<"7.显示指定的集合"<"s1集合:";s1->show_num();
cout<<"s1集合:";s2->show_num();
cout<<"s1集合:";s3->show_num();
cout<<"**************************"<"8.显示s1和s2是否相等"<equals1(*s2);
cout<<"**************************"<"9.显示s1是否包含s2"<ifinclude(*s2)<"**************************"<"10.清空指定集合s4"<"清空前";s4.show_num();
s4.beempty();
cout<<"清空后";s4.show_num();
cout<<"**************************"<"11。显示指定集合是否为空 "<"s1是否为空:"<ifempty()<<" 长度:"<num_size()<"s2是否为空:"<ifempty()<<" 长度:"<num_size()<"s3是否为空:"<ifempty()<<" 长度:"<num_size()<"s4是否为空:"<" 长度:"<"**************************"<"12.Quit program"<
参考GPT和自己的思路:这段代码存在一些错误和改进的空间,具体如下:
在类定义中,length成员变量已经初始化为0,不需要在构造函数中再次初始化。同时,可以将Setnum数组的大小定义为常量,而不是固定为100。
在Set的构造函数中,应该使用动态内存分配来初始化Setnum数组。目前的代码使用了固定大小的数组,如果传入的数组大小超过100或小于100,可能会导致程序崩溃或出现其他问题。
在Set的构造函数和拷贝构造函数中,应该使用n.num_size()来获取n集合的大小,而不是使用_msize(n)/sizeof(*n)。因为_msize(n)返回的是n数组在内存中占用的大小,而不是数组元素的大小。
在Set的jiaoji函数中,应该使用s2中的元素来更新s集合,而不是使用this指针指向的集合。这样会导致s集合变为s1和s2的并集,而不是它们的交集。
在Set的bingji函数中,使用了两层循环来计算并集,时间复杂度为O(n^2)。可以使用set容器来快速计算并集。具体地,在添加元素时,判断set容器中是否已经存在该元素,如果存在就不进行添加。
在Set的chaji函数中,使用了两层循环来计算差集,时间复杂度为O(n^2)。可以使用set容器来快速计算差集。具体地,在将两个集合求并集之后,遍历原集合中的元素,如果不在并集中就加入差集中。
在Set的equals1函数中,可以使用memcmp函数来判断两个集合是否相等。因为Setnum数组是int类型,可以将其看作字节数组进行比较。
在Set的ifinclude函数中,可以使用set容器来辅助判断是否包含。具体地,将两个集合求并集,然后判断并集的大小是否等于s1或s2的大小。
在代码中存在大量的内存分配和释放,可能会导致性能问题。可以使用智能指针等技术来自动管理内存。
整理后的代码如下:
代码太多,你到底是编译错误还是运行错误
贴出错误信息
所谓的测试其实就是调用一下已写函数,判断其功能是否如我们预期一样。
int main()
{
PNode List = CreateList();//链表创建好后,用List接收头结点位置
TraverseList(List);//将头结点传入,打印该链表
return 0;
}