计算机软件课程设计集合运算Word文件下载.docx
- 文档编号:20333769
- 上传时间:2023-01-22
- 格式:DOCX
- 页数:16
- 大小:283.02KB
计算机软件课程设计集合运算Word文件下载.docx
《计算机软件课程设计集合运算Word文件下载.docx》由会员分享,可在线阅读,更多相关《计算机软件课程设计集合运算Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
1)界面友好,函数功能要划分好
2)总体设计应画一流程图
3)程序要加必要的注释
4)要提供程序测试方案
5)程序一定要经得起测试,宁可功能少一些,也要能运行起来,不能运行的程序是没有价值的。
(二).问题描述和分析
本课程设计中,链表长度不能超过100,集合输入的形式为一个以“回车符”为结束标志的字符串,串中字符顺序不限,且允许出现重复字符或非法字符,程序应能自动滤。
输出的运算结果字符串中将不含重复字符或非法字符。
问题描述:
有两个集合A、B,要求它的交集、并集。
用两个链表L1、L2存储集合A、B。
描述该问题的存储结构,算法,并通过编写程序来实现。
问题分析:
1.定义一个链表来存储集合元素;
2.链表L包括数据域和指针域,数据域中存储集合元素,指针域中存储下一个集合元素的位置;
3.创建若干个基本函数,通过函数调用对链表进行作,实现集合的交、并运算。
二.设计内容
(一).数据结构设计
1.数据结构设计考虑
创建三个带头结点的单链表,用来存储两个集合中的元素和最终的结果,为实现集合的交,并运算功能,应以有序链表表示集合。
为此,需要两个抽象数据类型:
有序表和集合。
2.逻辑结构存储结构
逻辑结构:
创造一个带结点的单链表包括(头结点L,结点若干,尾结点)
单链表中每个结点包括(*next表示指针data表示域)
(二).算法设计
程序以用户和计算机的对话方式执行,即在计算机终端上显示“提示信息”之后,由用户在键盘上输入演示程序中规定的运算命令;
相应的输入数据(滤输入中的非法字符)和运算结果显示在其后。
程序执行的命令包括:
a)构造集合A;
b)构造集合B;
c)求交集;
d)求并集;
e)结束。
“构造集合A”和“构造集合B”时,需以字符串的形式键入集合元素。
三.概要设计
(一).程序结构图
(二).具体程序设计
1.定义链表typedefintElemType;
typedefstructLnode
2.返回链表长度
3.返回指定节点的值
4.定位制定值的节点的值
5.显示链表voiddisplay(structLnode**L)
6.创建链表,并设置链表为空voidcreat(structLnode**L)
7.向链表中插入元素voidinsert(structLnode**L,intn,ElemTypex)
8.插在第n个节点的前面
9.删除指定位置的节点
10.初始化链表voidinit(structLnode**L,intlen)
11.复制链表L1到L2voidcopy(structLnode**L1,structLnode**L2)
12.求交集
voidintersection(structLnode**L1,structLnode**L2,structLnode**L3)
13.求并集
unionset(structLnode**L1,structLnode**L2,structLnode**L3)
14.把L1复制到L3,然后比较L2和L3,得到L2与L3中没有的元素,并插入
15.插在排序的位置上
insert(&
*L3,k,t2->
data);
16.插在链尾
四.算法分析
源代码如下:
#include<
stdio.h>
stdlib.h>
alloc.h>
#definenull0
#defineM100
typedefintElemType;
/*定义链表*/
{
ElemTypedata;
structLnode*next;
};
intlenth(structLnode**L)
intn=0;
structLnode*t;
t=*L;
while(t!
=null)
{
n++;
t=t->
next;
}
returnn;
}
ElemTypeget(structLnode**L,intn)
inti=1;
while(i<
n&
&
t!
t=t->
i++;
if(t!
{
return(t->
else
printf("
The%dthLnodehaven'
tfind!
\n"
n);
intlocate(structLnode**L,ElemTypex)
intn=1;
structLnode*t;
while(t!
=null&
t->
data!
=x)
n++;
if(t==null)
return(0);
return(n);
voiddisplay(structLnode**L)/*显示链表*/
if(t==null)
Thelinkisnull!
"
);
else
do
%d>
>
t->
while(t!
=null);
voidcreat(structLnode**L)/*创建链表*/
*L=null;
voidinsert(structLnode**L,intn,ElemTypex)/*向链表中插入元素*/
structLnode*t1,*t2;
intj=1;
t1=(structLnode*)malloc(sizeof(structLnode));
t1->
data=x;
t2=*L;
if(n==1)
next=t2;
*L=t1;
while(j<
n-1&
t2->
next!
t2=t2->
j++;
if(j==n-1)
next=t2->
t2->
next=t1;
else
Inserterror!
voiddelete(structLnode**L,intn)
structLnode*t1,*t2;
t1=*L;
if(n==1)
t2=t1;
*L=t1->
while(i<
t1->
t1=t1->
if(t1->
i==n-1)
t2=t1->
else
Deleteerror!
if(t2==null)
free(t2);
voidinit(structLnode**L,intlen)/*初始化链表*/
intd[M],i,j,k,ti;
input:
for(i=1;
i<
=len;
i++)
scanf("
%d"
&
d[i]);
for(j=1;
j<
j++)
for(k=j+1;
k<
k++)
if(d[j]>
d[k])
ti=d[j];
d[j]=d[k];
d[k]=ti;
len;
if(d[i]==d[i+1])
Don'
tallowthesamedata!
Pleasereinput!
gotoinput;
creat(&
*L);
insert(&
*L,i,d[i]);
Thedataofthelinktableis:
"
display(&
voidcopy(structLnode**L1,structLnode**L2)/*复制链表L1到L2*/
inti,len;
ElemTypet;
len=lenth(&
*L1);
*L2);
t=get(&
*L1,i);
*L2,i,t);
voidintersection(structLnode**L1,structLnode**L2,structLnode**L3)/*求交集*/
inti,j,k=1;
t1=*L1;
t2=*L2;
*L3);
=lenth(&
if(t1->
data==t2->
data)
*L3,k,t1->
k++;
t1=t1->
unionset(structLnode**L1,structLnode**L2,structLnode**L3)/*求并集*/
inti,j,k;
structLnode*tt,*t2,*t3;
copy(&
*L1,&
t3=*L3;
{
k=1;
if(t2->
data==t3->
k=0;
break;
elseif(t2->
data<
t3->
data>
if(k<
*L3))
t3=t3->
if(k>
0&
elseif(k>
lenth(&
tt=(structLnode*)malloc(sizeof(structLnode));
tt->
data=t2->
data;
next=null;
t3->
next=tt;
voiddiffrenceset(structLnode**L1,structLnode**L2,structLnode**L3)
inti,t,n;
*L2,i);
n=locate(&
*L3,t);
if(n)
delete(&
*L3,n);
main()
{intlen1,len2;
charr;
staticstructLnode*head1,*head2,*head3,*head4;
printf("
/**********************thebegin************************/\n"
Pleaseinputthelenthofthefirstlinktable!
scanf("
len1);
Thelenthofthefirstlinktableis%d,pleaseinput%ddatas!
len1,len1);
init(&
head1,len1);
/--------------------------------------------------------/n"
Pleaseinputthelenthofthesecondlinktable!
len2);
Thelenthofthesecondlinktableis%d,pleaseinput%ddatas!
len2,len2);
head2,len2);
\n\n/---------------------------------------------------/\n"
intersection(&
head1,&
head2,&
head3);
Theintersectionoftwolinktable:
display(&
unionset(&
head4);
Theunionsetoftwolinktable:
/*********************theend**************************/\n"
五.结果分析
1.在turboc2.01环境中输入源代码
2.按Atl+F9编译文件
得到以下结果,发现无错误。
3.由提示按任意键,后按Ctrl+F9编译运行,得到以下结果。
给第一个链表的长度设为5后按Enter
程序开始(thebegin)
4.输入以下数字:
102578991000
5.输完数字后按Enter,得到以下结果,第一个链表输入完毕。
6.由提示任意给定第二个链表长度为17。
7.屏幕提示链表长度已定,并要求输入17个数字。
8.输入以下17个数字:
123456789
2878869910012015010000
9.按Enter屏幕显示如下
10.按Alt+F5查看输出结果
得出交集:
7899
并集:
123456789102528788699100120150********0
程序结束(theend)
六.心得体会
通过实践才发现C语言程序设计的掌握直接关系到数据结构上机实验效果。
C语言程序设计是编程的基础。
尤其,指针、结构体和函数等知识点是“程序设计基础与C语言”中的学习难点,自己普遍理解不深,难以在编程中灵活应用,但这些知识点在数据结构课程中频繁应用。
对这些知识点的熟练掌握是在数据结构课程中理解理论算法和完成上机实验的重要保证。
为此,我在学习中注意做到以下两点:
1.与“程序设计基础与C语言”知识做好课程之间的衔接,将数据结构课程中经常用到的知识点上机实践。
2.在学数据结构算法之前复习C语言中的指针、结构体和函数等知识点。
具体形式可以是在课堂上以程序实例的形式对这些知识点进行复习,尤其是难理解、容易混淆和犯错误的地方;
适当做些涉及这些知识点的课外编程作业,通过作业发现自己存在的问题然后集体重点复习;
特别是指针、结构体和函数等知识。
七.参考文献
1.催俊凯。
计算机软件基础。
机械工业出版社。
2007.7
2.唐发根。
数据结构教程(第二版)。
北京航空航天大学出版社。
2005.5
3.谭浩强。
C程序设计(第三版)。
清华大学出版社。
2005
4.严蔚敏,吴伟民。
数据结构(C语言版)。
北京:
5.王宏生,宋继红。
数据结构。
国防工业出版社,2006.1
6.李建学,李光元,吴春芳。
数据结构课程设计案例精编(用C/C++描述)。
2007.2
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机软件 课程设计 集合 运算