1、数据结构实验报告题目:静态查找表的实现成 绩 _2014 年 6 月 10 号静态查找表抽象数据类型的实现 一、设计任务、要求及所用的软件环境或工具: 1.设计任务及要求:用 C 语言实现静态查找表的抽象数据类型 2.软件环境:win7 3.开发工具:C-Free 二、抽象数据类型的实现1. 题目采用顺序存储和链式存储为存储结构,实现抽象数据类型StaticSearchTable。ADT StaticSearchTable数据对象 D:D 是具有相同特性的数据元素的集合。各个数据元素 含有类型相同的关键字,可唯一标识元素的关键字。数据关系 R:数据元素同属一个集合。基本操作 P:Create(
2、操作结果:构造一个含 n 个数据元素的静态查找表 ST。Destroy(初始条件:静态查找表 ST 存在。操作结果:销毁表 ST。Search(ST,key);初始条件:静态查找表 ST 存在,key 为和关键字类型相同的 给定值。操作结果:若 ST 中存在其关键字等于 key 的数据元素,则函数值为其值或在表中的位置,否则为“空” 。Traverse(ST,Visit();初始条件:静态查找表 ST 存在,Visit 是对元素操作的应用函数。操作结果:按某种次序对 ST 的每个元素调用函数 Visit()一次且仅一次。一旦 Visit()失败,则操作失败。ADT StaticSearchTa
3、ble2存储结构定义*公用头文件 DS0.h:#include#include #include *预定义常量和类型/函数结果状态代码#define TRUE 1#define FALSE 0#define OK 1#define ERROR 0typedef int Status;typedef int KeyType;typedef float KeyType;typedef char KeyType;typedef int ElemType;typedef ElemType TElemType;1)顺序存储结构typedef structElemType *elem; /数据元素存储空间
4、基址,0 号单元留空 int length; /表长 SSTable;2)二叉链表存储结构typedef struct BiTNodeTElemType data;struct BiTNode *lchild,*rchild; /左右孩子指针BiTNode,*BiTree;3. 算法设计1)顺序表的查找void Creat_Seq(SSTable *ST,ElemType r,int n) int i;(*ST).elem = (ElemType*)calloc(n+1,sizeof(ElemType); /动态生成n+1 个数据元素空间(0 号单元不用)if(!(*ST).elem) exi
5、t(0);for(i=1;idata=Ri; /生成结点 if(i=low)(*T)-lchild=NULL; /左子树空 elseSecondOptimal( /构造左子树 if(i=high)(*T)-rchild=NULL; elseSecondOptimal( return OK;Status Traverse(SSTable ST,void(*Visit)(ElemType) ElemType *p;int i;p=+ST.elem; / p 指向第一个元素 for(i=1;idata.key=key)return OK;else if(*T)-data.keykey)*T=(*T)
6、-lchild;else*T=(*T)-rchild;return FALSE; 4测试:1)顺序表的查找typedef struct /数据元素 long number; /准考证号char name9; int politics; int Chinese; int English; int math; int physics; int chemistry; int biology; int total; /总分 ElemType; /以教科书图 9.1 高考成绩为例void print(ElemType c)printf(“%-8ld%-8s%4d%5d%5d%5d%5d%5d%5d%5d
7、n“,c.number,c.name,c.politics,c.Chinese,c.English,c.math,c.physics,c.chemistry,c.biology,c.total);SSTable head;int main()ElemType rN=179325,“陈红“,85,86,88,100,92,90,45,179326,“陆华“,78,75,90,80,95,88,37,179327,“张平“,82,80,78,98,84,96,40; SSTable st;int i;long s;for(i=0;i查找成功:查找失败:2)有序表的查找SSTbale head;in
8、t main()int j,k,t,w;SSTable ST;int i;ST.length=LENGTH;printf(“请按大小顺序输入一个顺序表共%d 个元素!n“,ST.length);ST.elem=(ElemType*)malloc(ST.length+1)*sizeof(ElemType);for(i=1;i查找成功:查找失败:3)静态树链表的查找typedef struct /数据元素类型KeyType key;int weight;ElemType;ElemType rM=A,1,B,1,C,2,D,5,E,3,F,4,G,4,H,3,I,5; /以教科书例 9-1 为例vo
9、id print(ElemType c) /* Traverse()调用的函数 */printf(“(%c %d) “,c.key,c.weight);SSTbale head;int main()SSTable st;SOSTree t;Status i;KeyType s;Creat_Ord( /* 由全局数组产生非降序静态查找表 st */Traverse(st,print);CreateSOSTree( /* 由有序表构造一棵次优查找树 */printf(“n 请输入待查找的字符: “);scanf(“%c“,i=Search_SOSTree(if(i)printf(“%c 的权值是%
10、dn“,s,t-data.weight);elseprintf(“表中不存在此字符n“);结果截图如下:查找成功:查找失败:三、实验总结和体会1.几种存储结构的比较1)顺序查找:优点:算法简单且适应面广;缺点:平均查找长度较大,特别是当 n 很大时,查找效率较低。2)有序表的查找:优点:查找效率比顺序查找快;缺点:适应面小,只能用于顺序存储结构的有序表(以等概率为前提) 。3)静态树表的查找:优缺点与有序表的查找类似,但用于不等概率的有序表。2.思考与小结1)编程是需要大量练习的。平常写 anyview 不用写头文件,调试的机会也少,这次实验要用的时候只能再去翻 C 语言课本。2)理论跟实践是有差别的。课本上的东西也不一定全都是正确的,只有自己写代码调试一下才知道对错。3)不同的查找方法适用于不同的情况,应地制宜地选择适当的查找方法可以使我们的代码更加高效。