青岛大学软件技术学院
课 程 设 计
题目名称 散列文件(C语言版)
姓 名 hzdiy
专 业
班 级
指导教师
2008 年 1 月 14 日
课程设计任务书 一. 课程设计的目的与要求 课程设计是软件设计和编程的强化训练。在此期间要用C语言结合数据结构作综合练习,目的是让同学们通过本课程设计熟悉数据结构中的程序设计思想,深刻体会算法设计的全过程,编写出高效率的应用程序,培养掌握抽象的数据结构设计能力,提高软件设计的能力,从而为今后进行系统软件和应用软件的开发打下坚实的基础。学生通过自己搜集资料、讨论及老师的指导,完成自己课题的设计和软件系统的实现。 二. 课程设计的内容 1、 对数据结构课题进行分析,提出解决方案和设计算法; 2、 根据算法思想,在C语言环境中进行调试运行; 3、 经受操作运行正确性的检查。 三. 进度安排 根据教学计划安排2周,具体如下: 1、 布置任务、进行分组、确定并熟悉课题 1天; 2、 全面熟悉各项设计任务,查阅相关资料,功能分析与概要设计 2天; 3、 完成详细设计,编写代码,整理设计报告 7天; 4、 测试设计内容,并经受检查,上交源代码及设计报告 3天; 四. 课程设计质量标准 须有规范的设计报告和在规定条件下运行的软件程序。 设计报告的要求如下: 1、对数据结构课题进行功能需求分析 2、设计合理的数据结构和系统框架 3、编程步骤和实现调用方法鲜明,程序功能齐全,能正确运行。有系统结构及算法设计,包括总体框架、函数定义和参数定义。 4、说明书、系统动态流程图要清楚 5、有测试项目、测试数据、结果、分析 6、课题完成后必须按要求提交课程设计报告 |
散列文件
目 录
前 言…………………………………………………………………..…..4
第一章 绪 论…………………………………………………….…..… 5
1.1系统开发的必要性………………………………………..….…5
1.2系统功能……………………………………………...……… 5
1.3开发系统的意义. …………..…. ………………..……… ..…5
第二章 系统平台简述……………………………………………………5
2.1C 语言概述……………..…… ..…..…. ……. ....……...…… 5
2.1.1 C 语言定义..........................................………...............…5
2.1.2 C 语言优点.......................................………...............…...6
2.1.3 C 语言缺点...................................... ………...............…..6
2.2 使用VC++的优点…………………………………...………….6
第三章 系统分析和总体设计.....................................................…… ..…7
3.1基本简介…………………………………………………………7
3.3系统框架…………………………………………….....………...7
3.4算法与数据结构设计……………………………………….……………8
第四章 模块详细设计……..…………..……………..…………..……..….…..………8
4.1判断散列文件是否存在……..…………..………………..…………..…9
4.2初始化散列文件……...…………..…………..………………..……..…10
4.3向散列文件中插入一个元素……..…………..……………..…..……11
4.4打印散列文件……..…………..……………..…………….…….………13
4.5系统主函数……..…………..……………..………..………….…………13
4.6运行结果……..…………..……………..………..……………………..…15
第五章 系统的测试、维护和改进……………..……...……………….…..……18
5.1系统测试......................................................... …………..........18
5.2系统测试评价.......................................................... ……..............19
5.3改进.............................................................…......... ……..............19
总结……………..……... …………..…… ..…..…………..………... …………………….19
致谢……………..……... …………..…… ..…..……………..………... ………………….20
参考文献...……..……... …………..…… ..…..………………..……... …………………20
前 言
直接存取文件指的是利用杂凑(Hash)法进行组织的文件。它类似于哈希表,即根据文件中关键字的特点设计一种哈希函数和处理冲突的方法将记录散列到存储设备上,故又称散列文件。
于哈希表不同的是,对于文件来说,磁盘上的文件记录通常是成组存放的。若干个记录组成一个存储单位,在散列文件中,这个存储单位叫做桶。假若一个桶能存放m个记录,这就是说,m个同义词的记录可以存放在同一地址的桶中,而当第m+1个同义词出现时才发生“溢出”。处理溢出可以采用哈希表中处理冲突的方法,但对散列文件,主要采用链地址法。
总之,散列文件的有点是:文件随机存放,记录不需要进行排序;插入、删除方便,存取速度快,不需要索引区,节省存储空间。其缺点是:不能进行顺序存储,只能按关键字随机存取,且询问方式限于简单询问,并且在经过多次的插入、删除之后,也可能造成文件结构不合理,即溢出桶满而基桶内多数为被删除的记录。此时亦需要重组文件。
散列存储方法不仅适用于内存,也同样适用与外存,即文件也可以采用散列方式存储,以散列方式存储的文件成为散列文件。散列文件通常采用链接法法处理冲突,把保存每个单链表表头的数据放在散列文件的头部,把所有单链表中的结点接在表头数据的后边。
散列文件运用拉链法解决冲突:将所有关键字为同义词的结点链接在同一个单链表中。若选定的散列表长度为m,则可将散列表定义为一个由m个头指针组成的指针数 组T[0..m-1]。凡是散列地址为i的结点,均插入到以T[i]为头指针的单链表中。T中各分量的初值均应为空指针。在拉链法中,装填因子α可以大于 1,但一般均取α≤1。
散列文件的操作主要包括初始化散列文件,向散列文件中插入一个元素,从散列文件中删除一个元素,从散列文件中查找一个元素,和打印散列文件。为了实现以上几个功能,需要结合数据结构算法,运用散列算法(哈希算法),实现一个散列文件的简单操作。
第一章 绪 论
本程序研究散列文件操作的问题。对于散列文件的处理主要运用链接法处理冲突。
1.1系统开发的必要性
散列方法不同于顺序查找、二分查找、二叉排序树及B-树上的查找。它不以关键字的比较为基本操作,采用直接寻址技术。在理想情况下,无须任何比较就可以找到待查关键字,查找的期望时间为O(1)。散列文件的基本操作,为更好的研究散列文件存储提供案例支持。
1.2 系统功能
国家正大量需求技能类的软件人才,我作为一个计算机应用的专科生,希望可以理论联系实际,并且增强自己的就业能力。编制出一个实用的程序模型来深化对课程学习内容的理解。归纳起来,功能主要是实现散列文件的初始化、插入、删除、查询。
1.3开发系统的意义
散列文件的操作主要研究的是处理冲突的一种方法,处理冲突的方法的好坏直接影响数据存储的效率,如今处理冲突的一般方法有:开放定址法和拉链法。在此运用的是拉链法处理冲突。拉链法的优点有:(1)拉链法处理冲突简单,且无堆积现象,即非同义词决不会发生冲突,因此平均查找长度较短;(2)由于拉链法中各链表上的结点空间是动态申请的,故它更适合于造表前无法确定表长的情况;(3)开放定址法为减少冲突,要求装填因子α较小,故当结点规模较大时会浪费很多空间。而拉链法中可取α≥1,且结点较大时,拉链法中增加的指针域可忽略不计,因此节省空间。但也有缺点:指针需要额外的空间,故当结点规模较小时,开放定址法较为节省空间,而若将节省的指针空间用来扩大散列表的规模,可使装填因子变小,这又减少了开放定址法中的冲突,从而提高平均查找速度。开发此系统会可以让研究者清楚的了解散列文件处理冲突的方法,增加学习的兴趣。
第二章 系统平台简述
2.1 C语言概述
2.1.1 C语言定义
C语言是一种计算机程序设计语言。它既有高级语言的特点,又具有汇编语言的特点。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。因此,它的应用范围广泛。
C语言对操作系统和系统使用程序以及需要对硬件进行操作的场合,用C语言明显优于其它解释型高级语言,有一些大型应用软件也是用C语言编写的。
C语言具有绘图能力强,可移植性,并具备很强的数据处理能力,因此适于编写系统软件,三维,二维图形和动画。它是数值计算的高级语言。
2.1.1 C语言优点
1. 简洁紧凑、灵活方便
C语言一共只有32个关键字,9种控制语句,程序书写自由,主要用小写字母表示。它把高级语言的基本结构和语句与低级语言的实用性结合起来。 C 语言可以象汇编语言一样对位、字节和地址进行操作, 而这三者是计算机最基本的工作单元。
2. 运算符丰富
C的运算符包含的范围很广泛,共有种34个运算符。C语言把括号、赋值、强制类型转换等都作为运算符处理。从而使C的运算类型极其丰富表达式类型多样化,灵活使用各种运算符可以实现在其它高级语言中难以实现的运算。
3. 数据结构丰富
C的数据类型有:整型、实型、字符型、数组类型、指针类型、结构体类型、共用体类型等。能用来实现各种复杂的数据类型的运算。并引入了指针概念,使程序效率更高。另外C语言具有强大的图形功能, 支持多种显示器和驱动器。且计算功能、逻辑判断功能强大。
4. C是结构式语言
结构式语言的显著特点是代码及数据的分隔化,即程序的各个部分除了必要的信息交流外彼此独立。这种结构化方式可使程序层次清晰, 便于使用、维护以及调试。C语言是以函数形式提供给用户的,这些函数可方便的调用,并具有多种循环、条件语句控制程序流向,从而使程序完全结构化。
5. C语法限制不太严格,程序设计自由度大
虽然C语言也是强类型语言,但它的语法比较灵活,允许程序编写者有较大的自由度。
2.1.3 C语言的缺点
1. C语言的缺点主要是表现在数据的封装性上,这一点使得C在数据的安全性上做的有很大缺陷,这也是C和C++的一大区别。
2. C语言的语法限制不太严格,对变量的类型约束不严格,影响程序的安全性,对数组下标越界不作检查等。从应用的角度,C语言比其他高级语言较难掌握。
3.[C语言指针]
指针就是C语言的一大特色,可以说C语言优于其它高级语言的一个重要原因就是因为它有指针操作可以直接进行靠近硬件的操作,但是C的指针操作也给它带来了很多不安全的因素。C++在这方面做了很好的改进,在保留了指针操作的同时又增强了安全性。Java取消了指针操作,提高了安全性。
2.2 使用vc++的优点
VC++是微软公司开发的一个IDE(集成开发环境),换句话说,就是使用c++的一个开发平台.有些软件就是这个编出来的...另外还有VB,VF.只是使用不同语言...但是,Vc++是Windows平台上的C++编程环境,学习VC要了解很多Windows平台的特性并且还要掌握MFC、ATL、COM等的知识,难度比较大。
第三章 系统分析和总体设计
本程序做的是散列文件的操作,实现对散列文件进行初始化、插入、删除、查找等基本操作。
3.2系统框架
(1)系统应该具备的基本功能
初始化散列文件、向散列文件中插入一个元素、从散列文件中删除一个记录、从散列文件中查找一个记录。
(2)系统的总体结构图
散列文件包括五大部分:判断散列是否存在、初始化散列文件、向散列文件插入一个元素、从散列文件中删除一个元素、从散列文件中查找一个元素。系统的总体结构图如下图3.1所示:
图3.1:散列文件结构图
3.3模块设计
散列文件操作主要实现的是散列文件的初始化、插入、删除、查找和判断散列文件是否存在。其每一个功能可以写在一个函数中,作为一个模块进行实现。
3.3.1判断散列文件是否存在
在散列文件存在的默认路径查找散列文件,若存在则不采取任何操作;若不存在,则提示用在默认路径新建一个散列文件,或在其他位置查找散列文件。
3.3.2初始化散列文件
初始化散列文件,首先以新建二进制文件方式新建一个二进制文件,然后动态分配一个具有N+1个整数元素(N为散列表长度)的数组空间A,然后把A中的每个元素均置为-1,表示空指针,最后把数组内容写入散列文件即可。
3.3.3向散列文件中插入一个元素
向散列文件中插入一个元素x时,首先根据元素的关键字x.key、散列表长度N和做选择的任一散列函数计算出散列地址d,接着为x生成一个内存结点,并使该结点的next域为散列表文件中下标为d的元素值(即表头指针),然后把该内存结点的值写入到散列文件数据域的空闲结点中,若不存在经删除回收的空闲结点则写入到该文件的末尾,最后把该节点在散列中的的位置序号赋给散列文件表头中下标为d的元素中,使得新插入的结点被链接到散列地址(即下标)为d的单链表的表头。
3.3.4从散列文件中删除一个元素
从散列文件中删除一个关键字为x.key的元素时,首先是计算出散列地址d,接着从散列文件表头中下标为d的位置取出对应的单链表的表头指针,然后遍历该单链表,从中查找出关键字为x.key的结点,并从单链表中删除该结点,其元素值x带回,最后把被删除的结点链接到空闲结点表的表头。假定空闲结点的表头指针保存在散列表文件中下标为m的位置,若该位置为-1,则表明散列文件中不存在空闲结点。
3.3.5从散列文件中查找一个元素
从散列文件中查找一个关键字为x.key的元素时,同样是首先计算出散列地址d,接着从散列文件中下标为d的位置取出对应单链表的表头指针,然后从单链表中顺序查找出对应的元素并带回。
3.3.6打印散列文件
首先从散列文件表头中散列地址为0的位置取出对应的单链表的表头指针,然后顺序的打印出这以单链表的所有元素的关键字,打印完此单链表,然后把散列地址加1,取出下一个单链表的表头指针,以此方法打印所有元素。
第四章 模块详细设计
散列文件的操作包括:判断散列文件的存在和散列文件的插入、删除、查找、打印。下面进行详细的介绍:
4.1判断散列文件是否存在
本结构首先是判断散列文件是否存在,存在则不进行任何处理并关闭文件,相关的代码如下:
FILE *fp;
fp = fopen(fname, "rb");
if(NULL == fp)
{
//当文件不存在时,进行新建文件或打开其他位置的代码
}
else
{
fclose(fp); //文件存在,不对文件进行任何处理,并关闭文件
}
上面的代码,用FILE *fp申请一个指向散列文件的指针,接着用fp = fopen(fname, "rb")打开散列文件,并把指针赋予fp,然后判断文件指针是否为空,为空,则提示新建文件或打开其他路径上的文件。若存在,不对文件进行任何处理,直接关闭文件。
当散列文件不存在时,新建散列文,或打开其他位置的散列文件,打开其他位置的散列文件需要输入文件的路径,相关的代码如下:
printf("--- 散列文件不存在,
是否新建散列文件(y:从新建立/n:打开其他散列文件)? ---/n");
scanf("%c", &bcreate);
if('y' == bcreate || 'Y' == bcreate) //当输入y时,新建散列文件
{
InitHashFile(fname); //调用初始化散列文件的函数进行新建
printf("--- 新建散列文件完毕! ---/n");
}
Else //当输入n时,要求用户输入散列文件的存储路径,
{
printf("请输入散列文件路径:/n");
scanf("%s", filename);
strcpy(fname, filename); //储存散列文件路径
existHash(fname); //递归调用自身,确认散列文件存在
}
上面用代码用scanf("%c", &bcreate)读取用户的选择是否新建散列文件,并赋予变量bcreate中。代码if('y' == bcreate || 'Y' == bcreate)判断变量值是否为Y/y,是则调用InitHashFile(fname)新建并初始化散列文件;否则要求用户输入文件路径,代码为scanf("%s", filename),然后用existHash(fname)递归调用自身,确认散列文件存在。
4.2初始化散列文件
本结构是以读写方式新建一个二进制散列文件,相关代码如下:
FILE *fp;
fp = fopen(fname, "wb+"); //以读写方式新建二进制散列文件
if(NULL == fp)
{
printf("Cannot open this file!/n");
exit(1);
}
上面代码用FILE *fp,声明一个文件指针,fp = fopen(fname, "wb+")以读写方式打开散列文件,if(NULL == fp)判断散列文件是否为空。
然后在动态申请N+1个整型存储空间的数组A,并对此数组使用循环进行初始化为-1,并把数组A写入散列文件中,最后删除数组A动态申请的内存空间,相关代码如下:
A = (int *)calloc(N + 1, b1); //动态分配具有N+1个整型储存空间的数组A
if(NULL == A)
{
printf("Memory alloction failare!/n");
exit(1);
}
//给数组A中的每个元素赋初值-1,表示空指针
for(i = 0; i < N + 1; i++)
{
A[i] = -1;
}
//初始化散列文件
fwrite((char *)A, (N + 1)*b1, 1, fp);
//删除数组A
free(A);
上面代码A = (int *)calloc(N + 1, b1)动态申请具有N+1个整型储存空间的动态数组A, if(NULL == A)判断A数组申请是否成功,不成功,则提示内存申请失败。使用for(i = 0; i < N + 1; i++){A[i] = -1;}来初始化数组A,把A数组的所有元素都赋值为-1。用fwrite((char *)A, (N + 1)*b1, 1, fp)把初始化后的数组A写入散列文件中。最后用free(A)删除数组A动态申请的内存空间。
4.3向散列文件中插入一个元素
本结构的实现散列文件的插入,首先要以读写方式打开散列文件,相关代码如下:
//将散列文件的表头读入到数组A中
fread((char *)A, (N + 1) * b1, 1, fp);
上面的代码是从散列文件中读取长度为(N+1)*b1长度字符,并赋予数组A中。
接着以关键字x.key计算x的散列地址,采用除留余数法,并以x和A[d]的值构成待插入散列文件的内存节点temp,代码如下:
d = x.key % N; //以关键字x.key计算x的散列地址,采用除留余数法
//以x和A[d]的值构成待插入散列文件的内存节点temp
temp.data = x; //把数值赋予结点temp的数据域data
temp.next = A[d]; //把A[d]中的链表指针赋予temp结点的next域
在接着就是确定待插入的内存结点插入到散列文件中的位置,当A[N]==-1时表明散列文件中无空闲结点,则将temp结点插入到文件的尾部,即将文件指针移到文件的尾部,再计算出此结点的位置序号len,把结点写入散列文件,并把结点序号赋值给散列地址A[d]中,相关代码如下:
//将文件指针移至文件尾
fseek(fp, 0L, 2);
//计算出文件尾的结点位置序号
len = (ftell(fp) - (N+1)*b1)/b2;
//将temp结点的值写入文件尾
fwrite((char *)&temp, b2, 1, fp);
//使A[d]指向新插入的结点
A[d] = len;
上面代码,fseek(fp, 0L, 2)将文件指针移动到文件的头部,len = (ftell(fp) - (N+1)*b1)/b2计算待插入结点的位置序号,fwrite((char *)&temp, b2, 1, fp)将temp结点插入到文件尾,再把位置序号赋予表头域A[d]中。
若存在空闲结点, 把空闲结点指向的结点位置序号赋值给p,然后将文件指针指向空闲结点的位置,读取空闲结点的指针域,并赋值给A[N],再把文件指针向前移动一个b2长度,把temp结点写入空闲结点,并把p值再赋值给A[d]中,相关代码如下:
p = A[N]; //p指向空闲单链表的表头结点
//使空闲单链表的表头指针指向其下一个结点
fseek(fp, b1 * (N+1) + p*b2, 0);
fread((char *)&pn, b2, 1, fp);
A[N] = pn.next;
//使temp的值写入到p位置的结点上
fseek(fp, -b2, 1);
fwrite((char *)&temp, b2, 1, fp);
//使A[p]指向新插入的p结点
A[d] = p;
上面代码,p = A[N]将空闲节点的表头指针赋予p,fseek(fp, b1 * (N+1) + p*b2, 0)将文件指针移动到p所指的位置,fread((char *)&pn, b2, 1, fp)读取一个结点的内容,A[N] = pn.next把读取的空闲结点的指针域赋予A[N]中,fseek(fp, -b2, 1)向前移动b2长度的位置,fwrite((char *)&temp, b2, 1, fp)写入temp结点的内容,最后再A[d] = p使A[p]指向新插入的p结点。
最后将数组A中的全部内容重新写回到散列文件的表头中,即把文件指针移到文件头部,再写入数组A,然后删除动态数组A申请的内存空间,并关闭文件,相关代码如下:
fseek(fp,0L,0); //将数组A中的全部内容写回到散列文件的表头中
fwrite((char *)A, b1 * (N+1), 1, fp);
//删除动态数组A和关闭散列文件
free(A);
fclose(fp);
上面代码,fseek(fp,0L,0)将文件指针移动到文件的头部,fwrite((char *)A, b1 * (N+1), 1, fp)把修改后的表头数组A重新写入散列文件的表头中。free(A)删除动态申请的数组A,fclose(fp)关闭散列文件。
4.4打印散列文件
本结构的功能是按散列地址顺序的打印每一个单链表的关键字。首先打开散列文件,打开的方法前面已经叙述,在次不再赘述;然后再申请动态数组A,并把散列文件表头读入数组A中,方法前面也已经叙述,不再赘述。然后开始提取第一个散列地址的指针通过此指针指向的单链表顺序的打印每一个结点的关键字,相关代码如下:
for(i = 0; i < N+1; i++) //改变散列地址
{
printf("%d:", i);
p = A[i];
while(-1 != p) //打印单链表
{
fseek(fp, (N+1)*b1 + p*b2, 0);
fread((char *)&pn, b2, 1, fp);
printf("%d->%d ", p, pn.data.key); //打印结点关键字
p = pn.next; //移到下一个结点指针
}
printf("/n");
}
上面代码,for(i = 0; i < N+1; i++)改变散列地址,以便输出每个散列地址指向的单链表,printf("%d:", i)输出散列地址号,有0开始到13,13指向空闲结点。p = A[i]把散列地址指向的指针赋予p,while(-1 != p)判断指针是否为空,为空则说明此单链表打印完毕,fseek(fp, (N+1)*b1 + p*b2, 0)将文件指针指向要打印的结点位置,fread((char *)&pn, b2, 1, fp)读取结点信息,printf("%d->%d ", p, pn.data.key)输出结点位置序号和关键字值。p = pn.next将p指针移到下一个结点。
4.7系统主函数
本结构是本系统开始运行处,在此实现函数的调用,算法的实现并且打印输出结果。此函数首先调用existHash(filename)函数检测散列文件是否存在,然后运用while循环实现对散列文件的循环操作,相关代码如下:
while(1)
{
printf("/03------------ 散列文件 -------------/03/n");
… //打印菜单
printf("/03 请输入你的选择(1-5):");
scanf("%d", &number);
switch(number)
{…} //switch分支,根据选择不同执行不同操作。
}
上面代码,while(1)是一个死循环,实现用户的循环操作。scanf("%d", &number)获取用户选择的操作编号,switch(number)判断用户选择的操作号,并执行相应的操作
当用户输入选择序号后,通过switch分支结构进行执行不同的操作,如:选择1,即初始化散列文件,则执行case 1分支,实现初始化散列文件的目的。相关代码如下:
switch(number)
{
case 0:
return;
case 1:
…..//初始化散列文件
case 2:
…….//向散列文件中插入一个元素
case 3:
…….//从散列文件中删除一个元素
case 4:
…..//从散列文件中查找一个元素
case 5:
…….//打印散列文件
default:
printf("/n--- 输入功能号表错误 ---/n");
break;
} //switch结束
上面代码,通过不同number值进入不同的case块,实现不同的操作。
4.8运行结果
初次运行程序,没有“hash”文件,程序调用函数existHash()判断散列文件是否存在,当不存在时,提示用户新建一个散列件,如图4.1:
图4.1
输入y,则新建一个“hash”文件,如图4.2:
图4.2
输入n,提示打开输入要打开的文件路径,例如:C:/hash。如图4.3:
图4.3
接下来进行对散列文件进行处理,首先我们初始化一下散列文件,如图4.4:
图4.4
然后向散列文件中插入三个元素,如:25 hello,22 goodbye,8 letsgo,,插入元素通过调用插入函数HFInsertOne()把关键字和字符数组插入散列文件。如图4.5:
图4.5
再从散列文件中删除关键字为22的元素,程序调用函数HFDelete()删除关键字为22的元素,并把元素的数据值返回显示出来。如图4.6:
图4.6
再从散列文件中查找关键字为25的元素,程序调用函数HFSearch()查找关键字为25的元素,查到则返回元素值,查找不到,则提示“查找失败!”。如图4.7:
图4.7
最后打印散列文件,调用函数HFPrint()打印元素列表。如图4.8:
图4.8
第五章 系统的测试、维护和改进
5.1系统测试
打开其他位置的散列文件的测试如下所示:
(1)当用户输入文件路径打开其他位置的散列文件,但路径输入错误。
(2)解决方法:通过递归调用,允许其重新输入,直至输入正确的路径。
5.2系统测试评价
在测试过程中,发现了很多的不当之处,也出现了很多错误,并且对错误进行更改。通过多系统的测试,证实了此系统可以正常的运行,较好地达到了预期的结果。
5.3改进
由于时间仓促,尚有很多需要改进的地方那个。针对本程序,散列文件的数据域仅能存10个字符,不能处理实际问题,在此仅仅是做测试,在实际应用中,可以把数据域中添加上实际的数据类型。
在打印散列文件时仅仅打印了关键字,可以改善把数据域也打印出来,并且可以把打印的结果储存在一个文本文件中。即可打开文本文件查看散列文件中的内容了。
总结
这次设计中遇到了很多专业问题,例如:如算法调用失败,预处理头文件错误,变量定义漏掉,声明语法错误等方面的一些问题,李老师的悉心指导和同学的热心帮助才使我顺利的完成了这次课程设计。为了解决问题查找了大量的资料参考,并及时的向老师进行请教,与同学探讨使我深入的了解。经过课程设计学习我学到了很多:为人做事要有严谨、不耻下问的态度和不屈不挠的精神。
然而这个程序仅仅是个小小的测试,它还有很多需要改进的地方。我通过这次实训了解到作为一名软件工程师,应该具有严密谨慎,吃苦耐劳,不畏艰难险阻的精神,最重要的要有创新精神,学会学习的方法,多向周围同学请教,快速高效地完成题目。在本程序的开发过程中,由于时间的仓促和知识经验有限,做的程序不是太完整,有一些地方或许有些缺陷有待于进一步的完善,并且可能不能完全满足用户的需求。
致谢
论文完成的前提是李晓娜老师给予我细心的关怀与指导,在这里表示衷心的感谢。李老师认真负责的工作态度、严谨的治学风格,使我深受启发,她的精心指导和教诲使我受益匪浅.李老师让我了解到了,作为将来的编程师所应具备的优良品质。为将来的生活和就业打下坚实的基础。
另外,在系统开发过程中,同学同样也给与我不少帮助,使得系统能及时开发完成,这里一并表示感谢。
在论文即将完成之际,回顾紧张但又充实的学习和开发过程,本人在此向所有关心我的老师以及帮助我的同学们致以最真诚的感谢。
千言万语道不尽我对你们的感谢,我会倍加努力,用成绩来报答你们的。
在这里我由衷的感谢母校---青岛大学为我们提供了这机会.还要感谢指导老师对我们的辛勤指导和同学无私的帮助!
参考文献
[1] 林琪.《C语言算法-图算法》.清华大学出版社.2003.5
[2] 董杨琴.《程序设计基础-C语言与数据结构》.中国电力出版社.2002.6
[3].蒋文蓉.《数据结构》.高等教育出版社.2005.1
[4] 钱丽萍.《C语言数据结构与程序设计》.清华大学出版社.2003.1
[5] 谭浩强.《C 语言程序设计》.清华大学出版社.
[6] 许孝凯.《数据结构课程设计》.清华大学出版社
[7] 严蔚敏.《数据结构(C语言版)》.清华大学出版社
指 导 教 师 评 语
| 评语:
成绩: 指导教师 年 月 日 |
审 核 意 见 |
签章 年 月 日 |
备 注 |
|