集合的并交差操作说明书.docx

上传人:b****6 文档编号:8428226 上传时间:2023-01-31 格式:DOCX 页数:49 大小:463.70KB
下载 相关 举报
集合的并交差操作说明书.docx_第1页
第1页 / 共49页
集合的并交差操作说明书.docx_第2页
第2页 / 共49页
集合的并交差操作说明书.docx_第3页
第3页 / 共49页
集合的并交差操作说明书.docx_第4页
第4页 / 共49页
集合的并交差操作说明书.docx_第5页
第5页 / 共49页
点击查看更多>>
下载资源
资源描述

集合的并交差操作说明书.docx

《集合的并交差操作说明书.docx》由会员分享,可在线阅读,更多相关《集合的并交差操作说明书.docx(49页珍藏版)》请在冰豆网上搜索。

集合的并交差操作说明书.docx

集合的并交差操作说明书

目录

摘要1

前言2

正文3

1.采用类c语言定义相关的数据类型3

2.各模块的伪码算法3

3.函数的调用关系图3

4.调试分析3

5.测试结果3

6.源程序(带注释)3

总结4

参考文献5

致谢6

附件Ⅰ部分源程序代码7

摘要

包括集合的输入、输出、删除集合中重复的元素、删除、修改,求两个集合的交、并、差。

在MicrosoftVisualC++中实现程序的调试这个程序实现集合中元素的录入、删除、修改、并、交、差等操作。

采用单链表对集合进行操作、运行等。

通过该题目的设计过程,可以进一步理解和熟练掌握课本中所学的各种数据结构的知识,加深对链表的认识。

学会如何把学到的知识用于解决实际问题,培养自己的动手能力。

 

关键词:

集合;链表;

前言

科学技术日新月异的进步,让人类生活发生了巨大的变化,计算机技术的飞速发展,使各行各业在计算机技术应用方面得到了广泛的普及和使用。

在数学上的应运也同样在不断的发展,这里我们要做的是集合的简单操作,包括集合的交、并、差。

经过分析,使我们使用易于与C++语言实现的MicrosoftVisualC++开发工具,利用其提供的简单操作,首先在短时间内建立程序原形,然后,对初始原型程序需求分析,编写源程序,不断修正和改进,直到形成满足要求的可行程序。

集合的操作是数据结构中最简单的操作,对集合的学习实践可以帮助我们加深对数据结的掌握程度。

本程序是用单链表来实现集合的。

可以把一个集合抽象成单链表,可以对它进行插入、删除、单链表的合并等,来实现集合的简单操作。

正文

1.采用类c语言定义相关的数据类型

classListNode//结点类定义:

{

private:

intdata;

ListNode*link;

};

classList//链表类定义:

{

private:

ListNode*head;

ListNode*tail;

stringName;

};

2.各模块的伪码算法

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();

}

}

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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高等教育 > 军事

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1