数据结构课程设计集合运算.docx

上传人:b****6 文档编号:5661545 上传时间:2022-12-30 格式:DOCX 页数:9 大小:42.48KB
下载 相关 举报
数据结构课程设计集合运算.docx_第1页
第1页 / 共9页
数据结构课程设计集合运算.docx_第2页
第2页 / 共9页
数据结构课程设计集合运算.docx_第3页
第3页 / 共9页
数据结构课程设计集合运算.docx_第4页
第4页 / 共9页
数据结构课程设计集合运算.docx_第5页
第5页 / 共9页
点击查看更多>>
下载资源
资源描述

数据结构课程设计集合运算.docx

《数据结构课程设计集合运算.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计集合运算.docx(9页珍藏版)》请在冰豆网上搜索。

数据结构课程设计集合运算.docx

数据结构课程设计集合运算

第一章前言

1.1、内容:

实验题目:

编制一个演示集合的并、交和差运算的程序。

需求分析:

1、 本演示程序中,集合的元素限定为小写字母字符[“a”…”z”]。

集合输入的形式为一个以“回车符“为结束标志的字符串,串中字符顺序不限。

2、 演示程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息“之后,由用户在键盘上输入演示程序中规定的运算命令;相应的输入数据和运算结果显示在其后。

3、 程序执行的命令包括:

1) 构造集合1;2)构造在集合2;3)求并集;4)求交集;5)求差集;6)返回;7)结束。

“构造集合1”和“构造集合2”时,需以字符的形式键入集合元素

第二章数据结构设计

2.1、数据结构设计

为了实现上述程序的功能,应以有序链表表示集合。

为此,需要两个抽象数据类型:

有序表和集合。

1、有序表的抽象数据类型定义为:

readdata(pointerhead)

初始条件:

head是以head为头节点的空链表。

操作结果:

生成以head为头节点的非空链表。

pop(pointerhead)

初始条件:

head是以head为头节点的非空链表。

操作结果:

将以head为头节点的链表中数据逐个输出。

2、集合的抽象数据类型定义为:

and(pointerhead1,pointerhead2,pointerhead3)

初始条件:

链表head1、head2、head3已存在

操作结果:

生成一个由head1和head2的并集构成的集合head3。

or(pointerhead1,pointerhead2,pointerhead3)

初始条件:

链表head1、head2、head3已存在

操作结果:

生成一个由head1和head2的交集构成的集合head3。

differ(pointerhead1,pointerhead2,pointerhead3)

初始条件:

链表head1、head2、head3已存在

操作结果:

生成一个由head1和head2的差集构成的集合head3。

3、本程序抱含四个模块:

1) 节点结构单元模块——定义有序表的节点结构;

2) 有序表单元模块——实现有序表的抽象数据类型;

3) 集合单元模块——实现集合获得抽象数据类型;

4)主程序模块:

Voidmain(){

初始化;

do{

接受命令;

处理命令;

}while(“命令”!

=“退出”);

}

 

第三章算法设计

3.1、算法设计

#include

#include

typedefstructLNode//定义结构体类型指针

{

chardata;

structLNode*next;

}*pointer;

voidreaddata(pointerhead)//定义输入集合函数

{

pointerp;

chartmp;

scanf("%c",&tmp);

while(tmp!

='\n')

{

p=(pointer)malloc(sizeof(structLNode));

p->data=tmp;

p->next=head->next;

head->next=p;

scanf("%c",&tmp);

}

}

voidpop(pointerhead)//定义输出集合函数

{

pointerp;

p=head->next;

while(p!

=NULL)

{

printf("%c",p->data);

p=p->next;

}

printf("\n");

}

voidand(pointerhead1,pointerhead2,pointerhead3)//定义集合的并集函数

{

pointerp1,p2,p3;

p1=head1->next;

while(p1!

=NULL)

{

p3=(pointer)malloc(sizeof(structLNode));

p3->data=p1->data;

p3->next=head3->next;

head3->next=p3;

p1=p1->next;

}

p2=head2->next;

while(p2!

=NULL)

{

p1=head1->next;

while((p1!

=NULL)&&(p1->data!

=p2->data))

p1=p1->next;

if(p1==NULL)

{

p3=(pointer)malloc(sizeof(structLNode));

p3->data=p2->data;

p3->next=head3->next;

head3->next=p3;

}

p2=p2->next;

}

}

voidor(pointerhead1,pointerhead2,pointerhead3)//定义集合的交集函数

{

pointerp1,p2,p3;

p1=head1->next;

while(p1!

=NULL)

{

p2=head2->next;

while((p2!

=NULL)&&(p2->data!

=p1->data))

p2=p2->next;

if((p2!

=NULL)&&(p2->data==p1->data))

{

p3=(pointer)malloc(sizeof(structLNode));

p3->data=p1->data;

p3->next=head3->next;

head3->next=p3;

}

p1=p1->next;

}

}

voiddiffer(pointerhead1,pointerhead2,pointerhead3)//定义集合的差集函数

{

pointerp1,p2,p3;

p1=head1->next;

while(p1!

=NULL)

{

p2=head2->next;

while((p2!

=NULL)&&(p2->data!

=p1->data))

p2=p2->next;

if(p2==NULL)

{

p3=(pointer)malloc(sizeof(structLNode));

p3->data=p1->data;

p3->next=head3->next;

head3->next=p3;

}

p1=p1->next;

}

}

voidmain()//主函数

{

intx;

printf("(输入数据,按回车键结束,第一个集合大于第二个集合)\n");

pointerhead1,head2,head3;

head1=(pointer)malloc(sizeof(structLNode));

head1->next=NULL;

head2=(pointer)malloc(sizeof(structLNode));

head2->next=NULL;

head3=(pointer)malloc(sizeof(structLNode));

head3->next=NULL;

printf("请输入集合1:

\n");

readdata(head1);//调用输入集合函数

printf("请输入集合2:

\n");

readdata(head2);//调用输入集合函数

A:

printf("1.并集2.交集3.差集4.结束x.重新运算\n");

do{

printf("请选择序号\n");

scanf("%d",&x);

switch(x)

{

case1:

printf("两集合的并是\n");

and(head1,head2,head3);//调用并集函数

pop(head3);

head3->next=NULL;

break;

case2:

printf("两集合的交是\n");

or(head1,head2,head3);//调用交集函数

pop(head3);

head3->next=NULL;

break;

case3:

printf("两集合的差是\n");

differ(head1,head2,head3);//调用差集函数

pop(head3);

head3->next=NULL;

break;

case4:

break;

default:

gotoA;

}

}while(x!

=4);

}

第四章测试数据及程序运行情况

4.1、测试数据及程序运行情况

运行时提示输入:

输入集合1:

asd

输入集合2:

asf

根据提示输入运算类型:

1.并集2.交集3.差集4.结束x.重新运算

输入1,输出”fasd”

输入2,输出”as”

输入3,输出”d”

输入4,输出”pressanykeytocontinue”(结束)

输入其他数,输出”1.并集2.交集3.差集4.结束x.重新运算”(重新选择运算类型)

下面是运行时的界面(附图):

第五章实验过程中的问题及解决方法

5.1、实验过程中出现的问题及解决方法

1、由于对集合的三种运算的算法推敲不足,在链表类型及其尾指针的设置时出现错误,导致程序低效。

2、刚开始时曾忽略了一些变量参数的标识”&”,使调试程序浪费时间不少。

今后应重视确定参数的变量和赋值属性的区分和标识。

3、开始时输入集合后,程序只能进行一次运算,后来加入switch语句,成功解决了这一难题。

4、该算法并不能排除重复输入相同字符的情况,也不能自动滤去非法字符(如空格、阿拉伯数字等)。

5、本程序的模块划分比较合理,且尽可能的将指针的操作封装在节点和链表的两个模块中,致使集合模块的调试比较顺利。

6、本实习作业采用数据抽象的程序设计方案,将程序化分为四个层次结构,使得设计时思路清晰,实现时调试顺利,各模块具有较好的可用性,确实得到了一次良好的程序设计训练。

参考文献

[1]李云清,杨庆红,揭安全.数据结构(C语言版)[M].北京:

人民邮电大学出版社,2004.6

[2]潘彦.算法设计与分析基础[M].北京:

清华大学出版社,2007.1

[3]肖梦强,曲秀清.软件工程——原理、方法与应用[M].北京:

中国水利水电出版社,2005.10

[4]吕凤翥.C++语言程序设计(第2版)[M].北京:

电子工业出版社,2007.2

[5]严蔚敏,吴伟民.数据结构(C语言版)[M].北京:

清华大学出版社,2002.9

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

当前位置:首页 > 经管营销

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

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