}
voidList:
:
Add(intvalue)//添加单个结点功能函数
{
ListNode*add=newListNode(value);
add->SetLink(NULL);
ListNode*preCurrent=head;
ListNode*current=preCurrent->GetLink();
while(current!
=NULL&¤t->GetData()!
=value)
{
preCurrent=current;
current=preCurrent->GetLink();
}
if(head==tail&¤t==NULL)
{
head->SetLink(add);
tail=add;
}
if(head!
=tail&¤t==NULL)
{
preCurrent->SetLink(add);
add->SetLink(NULL);
tail=add;
}
if(current!
=NULL&¤t->GetData()==value)
{
add->~ListNode();
return;
}
}
voidList:
:
AddList(List*Set)//添加一串结点
{
ListNode*p=NULL;
intc;
p=Set->GetHead()->GetLink();
while(p!
=Set->GetTail()->GetLink())
{
c=p->GetData();
this->Add(c);
p=p->GetLink();
}
}
voidList:
:
Delete()//删除集合;deletep
{
ListNode*p=NULL,*cur=NULL;
cur=this->GetHead()->GetLink();
while(cur!
=this->GetTail()->GetLink())
{
p=cur;
cur=cur->GetLink();
p->~ListNode();
p=NULL;
}
}
voidList:
:
Combine(List*C1)//求并
{
ListNode*p=NULL;
p=((C1->GetHead())->GetLink());
while(p!
=(C1->GetTail())->GetLink())
{
this->Add(p->GetData());
p=p->GetLink();
}
}
voidList:
:
Mix(List*Set)//求交
{
ListNode*p=NULL,*q=NULL,*del=NULL;
intj=0;
del=this->GetHead();
p=this->GetHead()->GetLink();
while(p!
=this->GetTail()->GetLink())
{
j=0;
q=(Set->GetHead())->GetLink();
while(q!
=Set->GetTail()->GetLink())
{
if(p->GetData()==q->GetData())
{
j=1;
}
q=(q->GetLink());
}
if(j==0)
{
del->SetLink(p->GetLink());
p->~ListNode();
p=del->GetLink();
}
else
{
del=p;
p=(p->GetLink());
}
}
}
voidList:
:
Subtract(List*Set)//求差
{
ListNode*p=NULL,*q=NULL,*b=NULL;
p=Set->GetHead()->GetLink();
q=this->GetHead()->GetLink();
b=this->GetHead();
while(p!
=(Set->GetTail())->GetLink())
{
b=this->GetHead();
q=(this->GetHead())->GetLink();
while(q!
=(this->GetTail())->GetLink())
{
if(p->GetData()==q->GetData())
{
b->SetLink(q->GetLink());
q->~ListNode();
q=b->GetLink();
}
else
{
b=q;
q=q->GetLink();
}
}p=p->GetLink();}
}
3.函数的调用关系图
4.调试分析
a、调试中遇到的问题及对问题的解决方法
调试中遇到了很多的问题,最为头疼的是:
指针的越位,像这样的问题,在程序编译时不会出现错误,当运行时往往出错,很难找到出错的地方,解决方法是:
在程序运行时出错的功能去找,仔细的分析每一个指针看在运行时,会不会出现越位的情况,并改正。
大家都知道,再用C/C++编写程序时,指针是最为灵活的,用它可以解决很多问题,都再用指针式也伴随着很多的问题,向前面提到的越位,还有在市纺织真是错误的是放其他空间,对这样的问题,必须在申明指针时对其初始化(NULL)。
除此之外,还有就是,对无用内存的释放,由于,内存的利用对电脑的运行很重要,所以,要对无用内存进行释放,以提高内存利用率。
b、算法的时间复杂度和空间复杂度
该算法的时间复杂度是:
O(N2)。
该算法的空间复杂度是:
572KB。
5.测试结果
1)初始化界面:
2)操作界面:
3)输入集合名和集合元素:
4)浏览系统中存在的集合及其元素:
5)删除集合:
6)修改元素输入有误的集合:
7)对系统中已有的集合进行求并运算:
8)对系统中已有的集合进行求交运算:
9)对系统中已有的集合进行求差运算:
10)退出集合运算系统:
6.源程序(带注释)
#include
#include
#defineSIZE10
usingnamespacestd;
classListNode//结点类定义:
{
private:
intdata;
ListNode*link;
public:
ListNode():
link(NULL){}
~ListNode(){}
ListNode(intvalue):
link(NULL),data(value){}
voidSetLink(ListNode*next){link=next;}
ListNode*GetLink(){returnlink;}
intGetData(){returndata;}
};
classList//链表类定义:
{
private:
ListNode*head;
ListNode*tail;
stringName;
public:
List(){head=tail=newListNode;head->SetLink(NULL);}
List(stringstr);
~List(){}
ListNode*GetHead(){returnhead;}
ListNode*GetTail(){returntail;}
stringGetName(){returnName;}
voidAdd(intc);
voidPrintData();
voidAddList(List*Set);
voidCombine(List*C1);
voidMix(List*Set);
voidSubtract(List*S1);
voidChangeHead(ListNode*cur);
voidChangeTail(ListNode*cur);
voidChangeName(stringc);
boolIsempty();
voidDelete();
};
List:
:
List(stringstr)
{
Name=str;
head=tail=newListNode;
head->SetLink(NULL);
}
voidList:
:
PrintData()//输出集合元素功能函数
{
ListNode*cur=NULL;
cur=this->GetHead()->GetLink();
while(cur!
=((this->GetTail())->GetLink()))
{
cout<<"\t"<GetData();
cur=cur->GetLink();
}
cout<}
voidList:
:
Add(intvalue)//添加单个结点功能函数
{
ListNode*add=newListNode(value);
add->SetLink(NULL);
ListNode*preCurrent=head;
ListNode*current=preCurrent->GetLink();
while(current!
=NULL&¤t->GetData()!
=value)
{
preCurrent=current;
current=preCurrent->GetLink();
}
if(head==tail&¤t==NULL)
{
head->SetLink(add);
tail=add;
}
if(head!
=tail&¤t==NULL)
{
preCurrent->SetLink(add);
add->SetLink(NULL);
tail=add;
}
if(current!
=NULL&¤t->GetData()==value)
{
add->~ListNode();
return;
}
}
voidList:
:
AddList(List*Set)//添加一串结点
{
ListNode*p=NULL;
intc;
p=Set->GetHead()->GetLink();
while(p!
=Set->GetTail()->GetLink())
{
c=p->GetData();
this->Add(c);
p=p->GetLink();
}
}
boolList:
:
Isempty()
{
if((this->GetHead())->GetLink()==((this->GetTail())->GetLink()))return1;
elsereturn0;
}
voidList:
:
Delete()//删除集合;deletep
{
ListNode*p=NULL,*cur=NULL;
cur=this->GetHead()->GetLink();
while(cur!
=this->GetTail()->GetLink())
{
p=cur;
cur=cur->GetLink();
p->~ListNode();
p=NULL;
}
}
voidList:
:
Combine(List*C1)//求并
{
ListNode*p=NULL;
p=((C1->GetHead())->GetLink());
while(p!
=(C1->GetTail())->GetLink())
{
this->Add(p->GetData());
p=p->GetLink();
}
}
voidList:
:
Mix(List*Set)//求交
{
ListNode*p=NULL,*q=NULL,*del=NULL;
intj=0;
del=this->GetHead();
p=this->GetHead()->GetLink();
while(p!
=this->GetTail()->GetLink())
{
j=0;
q=(Set->GetHead())->GetLink();
while(q!
=Set->GetTail()->GetLink())
{
if(p->GetData()==q->GetData())
{
j=1;
}
q=(q->GetLink());
}
if(j==0)
{
del->SetLink(p->GetLink());
p->~ListNode();
p=del->GetLink();
}
else
{
del=p;
p=(p->GetLink());
}
}
}
voidList:
:
Subtract(List*Set)//求差
{
ListNode*p=NULL,*q=NULL,*b=NULL;
p=Set->GetHead()->GetLink();
q=this->GetHead()->GetLink();
b=this->GetHead();
while(p!
=(Set->GetTail())->GetLink())
{
b=this->GetHead();
q=(this->GetHead())->GetLink();
while(q!
=(this->GetTail())->GetLink())
{
if(p->GetData()==q->GetData())
{
b->SetLink(q->GetLink());
q->~ListNode();
q=b->GetLink();
}
else
{
b=q;
q=q->GetLink();
}
}
p=p->GetLink();
}
}
voidList:
:
ChangeHead(ListNode*cur)
{
head=cur;
}
voidList:
:
ChangeTail(ListNode*cur)
{
tail=cur;
}
voidList:
:
ChangeName(stringc)
{
Name=c;
}
List*p[SIZE]={NULL};
inti=0;
voidMenu()//菜单功函数
{
cout<<"^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^"<cout<<"\t\4\4********\4\3\t陈玮的集合运算器\t\3\4********\4\4"<cout<"______________________________________________"<cout<<"\t║\t\t请选择对集合的操作序号:
║"<cout<<"\t║\t1:
添加集合:
║"<cout<<"\t║\t2:
删除集合:
║"<cout<<"\t║\t3:
浏览集合:
║"<cout<<"\t║\t4:
修改集合:
║"<cout<<"\t║\t5:
集合A与B求并:
║"<cout<<"\t║\t6:
集合A与B求交:
║"<cout<<"\t║\t7:
集合A与B求差:
║"<cout<<"\t║\t0:
退出:
║"<cout<<"\t║║"<cout<<"\t║\t输入'0'作为集合名则返回上级菜单║"<cout<<"\t║\t现有集合数:
"<
"<cout<<"╚══════════════════════╝"<}
voidAdd_List()//添加集合功能函数
{
intc=1,flag=1;
stringch;
if(i==SIZE)
{
cout<<"\t集合数已到上限,若坚持输入此个数,请改宏定义'SIZE'"<return;
}
cout<<"\t请输入集合名:
"<REPEAT:
cin>>ch;
if(ch=="0")
{
cout<<"\t返回上级菜单!
\n"<return;
}
for(intj=0;j
{
if(ch==p[j]->GetName())
{
cout<<"\t集合"<"<gotoREPEAT;
}
}
p[i]=newList(ch);
cout<<"\t请输入集合"<"<while
(1)
{
cin>>c;
if(c!
=0)
{
if(flag==0)p[i]->Add(flag);
flag=1;
p[i]->Add(c);
}
elseif(c==0&&flag!
=0)
{
flag=c;
}
else
{
break;
}
}
/*while(c!
=0)flag1==0&&(c==0&&flag==0)
{
cin>>c;
if(c!
=0)
p[i]->Add(c);
}*/
i++;
cout<<"\t添加成功"<}
voidSkim_List()//浏览集合功能函数
{
if(i==0)
{
cout<<"\t不存在任何集合!
!
!
"<return;
}
for(intj=0;j
{
if(p[j]!
=NULL)
{
if(p[j]->Isempty())
{cout<<"\t集合"<
GetName()<<"为空集!
"<else
{
cout<<"\t集合"<
GetName()<<"元素有:
"<p[j]->PrintData();
}
}
}
}
voidDel_List()//删除集合功能函数
{
if(i==0)
{
cout<<"\t不存在任何集合!
!
!
"<return;
}
ListNode*p1=NULL,*cur=NULL;
stringch,ch0;
intk=-1;
cout<<"\t请选择下面集合名,删除:
"<Skim_List();
cout<<"\t请输入集合名:
"<RE:
cin>>ch;
if(ch=="0")
{
cout<<"\t返回上级菜单!
\n"<return;
}
for(intj=0;j
{
ch0=p[j]->GetName();
if(ch0==ch)
k=j;
}
if(k==-1)
{
cout<<"\t集合"<"<gotoRE;
}
else
{
p[k]->Delete();
p[k]->~List();
p[k]=NULL;
for(;k
{
p[k]=p[k+1];
}
i--;
cout<<"\t删除成功"<}
}
voidRevise_Li