课程设计报告书基于链表的集合的并交差运算.docx
《课程设计报告书基于链表的集合的并交差运算.docx》由会员分享,可在线阅读,更多相关《课程设计报告书基于链表的集合的并交差运算.docx(19页珍藏版)》请在冰点文库上搜索。
课程设计报告书基于链表的集合的并交差运算
《高级语言程序设计》
课程设计报告书
题目:
基于链表的集合的并、交、差运算
专业:
学号:
学生姓名:
指导教师:
完成日期:
一、设计内容与设计要求1
1.设计内容1
2.设计要求1
二、课程设计目的1
三、程序模块分析1
1.程序控制流程图1
2.主要函数算法流程图2
1.主函数2
2.集合的并集函数3
四、函数功能说明4
1.所有函数模块声明:
4
3.主要模块的实现:
4
五、程序测试4
六、总结7
附录8
一、设计内容与设计要求
1.设计内容
基于链表的集合的并、交、差运算。
2.设计要求
(1)、利用链表存放集合的元素。
(2)、在链表基础上实现集合的并、交、差。
(3)、要求有合理的输入输出。
(4)、界面要尽可能美观,要方便操作。
二、课程设计目的
在平时学习C语言的过程中,通常只是在课堂上跟随老师的讲解来进行学习,因此在练习上较为缺乏,而课程设计恰恰弥补了这点,它不仅是对平时学习的一种检测,同时在做它的过程中也对自己学习的知识进行了巩固和提高,为以后的学习和工作打下了基础。
三、程序模块分析
1.程序控制流程图
2.主要函数算法流程图
1.主函数
否
是
否是
图2主函数流程图
2.集合的并集函数
否
是
否
是
图3求并集函数流程图
求交集、差集的流程图同求并集流程图类似。
四、函数功能说明
1.所有函数模块声明:
voidinput(pointerM);//定义输入集合函数
voidoutput(pointerM);//定义输出集合函数
voidand(pointerA,pointerB,pointerC);//定义集合的并集函数
voidor(pointerA,pointerB,pointerC);//定义集合的交集函数
voiddiffer(pointerA,pointerB,pointerC);//定义集合的差集函数
3.主要模块的实现:
系统以主函数voidmain()为入口,然后调用voidinput()函数,输入元素信息,然后进入主菜单界面。
系统接收用户输入的选择,调用相应的函数,实现各功能。
数据输入界面:
构造函数voidinput(linklistl)实现集合元素的数据输入。
主菜单界面:
构造函数voidmain();实现主菜单的显示。
集合的并集运算:
构造函数vvoidbingji(linklistA,linklistB,linklistC)实现对两个集合的并集运算。
集合的交集运算:
构造函数voidjiaoji(linklistA,linklistB,linklistC)实现对两个集合的交集运算。
集合的差集运算:
构造函数voidchaji(linklistA,linklistB,linklistC);实现集合A-B的运算。
五、程序测试
程序运行页面,显示菜单
图5.1
选择1,求集合的交集,集合输入完以0结束
图5.2
选择2,求集合的并集,集合输入完以0结束
图5.3
选择3,求集合的差集集,集合输入完以0结束
图5.4
选择0,退出程序
图5.5
六、总结
这次的课程设计给了我很大的体会,我能独立的完成这项任务,是对平时的学习和练习的一种肯定,同时也提高了自己的信心
。
在完成它的过程中当然会遇到很多的困难,首先,由于对集合的三种运算的算法推敲不足,在链表类型及其尾指针的设置时出现错误,导致程序低效。
后来通过调试,错误解决。
再次,就是该算法并不能排除重复输入相同字符的情况,也不能自动滤去非法字符(如空格、阿拉伯数字等)。
这个问题需要设置字符判断语句解决。
还有就是不能循环录入数据并实现各功能,只能录入一次数据进行相关操作,虽然测试时利用do-while语句可以实现循环,但结果却出现错误,我认为应该是未对已输出的链表进行数据删除的原因,这是以后需要改善的地方。
附录
源程序清单:
#include"stdafx.h"
#include
#include
#include
#include
typedefstructnode
{
chardata;
structnode*next;
}lnode,*linklist;
/**********初始化函数***************/
lnode*init_lnode()
{
lnode*l;
l=(lnode*)malloc(sizeof(lnode));
l->next=NULL;
returnl;//返回指向新建节点的指针
}
voidinput(linklistl)//定义输入集合函数
{
lnode*s;
chartmp;
scanf("%d",&tmp);
while(tmp!
='\n')
{
s=(lnode*)malloc(sizeof(lnode));
s->data=tmp;
s->next=l->next;
l->next=s;
scanf("%d",&tmp);
}
}
/***********输出函数*****************/
voidoutput(linklistl)
{
lnode*s;
s=l->next;
while(s!
=NULL)
{
printf("%5d",s->data);//输出链表中的数据
s=s->next;
}
printf("\n");
}
/************交集函数*********************/
voidjiaoji(linklistA,linklistB,linklistC)
{
lnode*p,*q,*t;
p=A->next;//将指针p指向链表A
while(p!
=NULL)
{
q=B->next;//将指针q指向链表B
while((q!
=NULL)&&(q->data!
=p->data))
q=q->next;
if((q!
=NULL)&&(q->data==p->data))
{
t=(lnode*)malloc(sizeof(lnode));
t->data=p->data;
t->next=C->next;
C->next=t;
}
p=p->next;
}
}
/*********************差集函数****************/
voidchaji(linklistA,linklistB,linklistC)
{
lnode*p,*q,*s,*t;
p=A->next;
printf("A与B的差集是:
\n");
while(p!
=NULL)
{
q=B->next;
while((q!
=NULL)&&(p->data!
=q->data))
q=q->next;
if(q==NULL)
{
s=(lnode*)malloc(sizeof(lnode));
s->data=p->data;
s->next=C->next;
C->next=s;
}
p=p->next;
}
output(C);
C->next=NULL;
q=B->next;
printf("B与A的差集是:
\n");
while(q!
=NULL)
{
p=A->next;
while((p!
=NULL)&&(p->data!
=q->data))
p=p->next;
if(p==NULL)
{
t=(lnode*)malloc(sizeof(lnode));
t->data=q->data;
t->next=C->next;
C->next=t;
}
q=q->next;
}
output(C);
}
/********并集函数*************************/
voidbingji(linklistA,linklistB,linklistC)
{
lnode*p,*q,*t;
p=A->next;
while(p!
=NULL)
{
t=(lnode*)malloc(sizeof(lnode));
t->data=p->data;
t->next=C->next;
C->next=t;
p=p->next;
}
q=B->next;
while(q!
=NULL)
{
p=A->next;
while((p!
=NULL)&&(p->data!
=q->data))
p=p->next;
if(p==NULL)
{
t=(lnode*)malloc(sizeof(lnode));
t->data=q->data;
t->next=C->next;
C->next=t;
}
q=q->next;
}
}
voidmenu()
{
printf("**************************************\n");
printf("************1.求交集************\n");
printf("************2.求并集************\n");
printf("************3.求差集************\n");
printf("************0.退出************\n");
printf("**************************************\n");
}
voidmain()
{
lnode*a,*b,*c;
a=init_lnode();//将指针指向新建节点;
b=init_lnode();
c=init_lnode();
intm;
printf("本系统功能为求AB集合的交集,并集和差集\n");
menu();
printf("\n请在0-3中选择:
");
scanf("%d",&m);
switch(m)
{
case1:
printf("请输入A集合的元素:
\n");
printf("\n");
input(a);
printf("请输入B集合的元素:
\n");
input(b);
printf("\n输入完成\n");
printf("AB集合的交集是:
");
jiaoji(a,b,c);
output(c);
c->next=NULL;
break;
case2:
printf("请输入A集合的元素:
");
input(a);
printf("\n请输入B集合的元素:
");
input(b);
printf("\n输入完成\n");
printf("AB的合集是:
");
bingji(a,b,c);
output(c);
a->next=NULL;
break;
case3:
printf("请输入A集合的元素:
");
input(a);
printf("\n请输入B集合的元素:
");
input(b);
printf("\n输入完成\n");
chaji(a,b,c);
break;
case0:
break;
}
}/*主函数结束*/
评分标准
程
序
(70)
题目难易程度(10)
难(10)
在命题时有说明题目的难易程度
易(0分)
正确性(30)
完成要求功能且经教师测试无错误(30)
完成全部主要功能但对特殊测试样例有错误(11--20)
完成一些功能但有错误(1--10)
不能运行(0)
回答问题情况(20)
能回答出所有问题(20)
能回答部分问题(1-10)
一问三不知(-100)
注释丰富程度(10)
较多(6--10)
主要的功能语句应该给出注释
少许(0--5)
报
告
(30)
层次、结构、逻辑性(10)
合理(5--10)
行文是否符合认知逻辑,各级标题的标号是否具有层次性等
不甚合理(0--4)
语言表达能力(10)
行文流畅且仅有不多于5个错别字(5--10)
不太通顺且有多于5个错别字(0--4)
版面(10)
版面整洁,布局合理(5--10)
版面混乱,布局不合理(0--4)
总分
五级制成绩
教师签名:
批改日期:
年月日