实验内容
1.建立顺序查找表,并在此查找表上实现顺序查找操作。
2.对上述顺序查找表选择一种简单的排序方法对此进行排序
3. 在上述有序顺序查找表上实现二分查找操作。
实验要求
编程实现如下功能:
(1)根据输入的查找表的表长n和n个关键字值,建立顺序查找表;
(2)用顺序查找方法在上述顺序查找表中查找与已经给定关键值相等的记录;
(3)选择一种排序方法对(1)中建立的顺序查找表进行排序;
(4)在(3)中的有序查找表中用二分查找方法查找与已经给定关键值相等的记录 ;
(5)编写main函数,设计菜单使用户能通过菜单的选择多次通过调用上述功能函数来实现所选择的查找操作,并且在每次操作后都输出其操作结果:若查找成功,则输出“查找成功”并输出这条记录在表中的位置,否则输出“查找失败”。
代码段
主要实现两个功能,一个是顺序查找一个是二分查找。
#include <stdio.h>
#include <malloc.h>
#define MAXSIZE 100 //顺序查找表的最大长度
#define OK 1;
#define OVERFLOW -1;
typedef int Status;
typedef int KeyType; //整型关键字类型
typedef int InfoType;
typedef struct{
KeyType key; //关键字域
InfoType otherinfo; // 其它数据项
}ElemType; //记录类型
typedef struct{
ElemType *elem; //记录存储空间基地址,构造表时按实际长度分配,0号单元留空
int length; //表长度
}SSTable; //静态查找表类型
Status Creat_SSTable(SSTable &ST) //构造一个容量为MAXSIZE的空顺序表
{ ST.elem = (ElemType *)malloc(MAXSIZE*sizeof(ElemType));//有序表预分配空间的大小
if (!ST.elem) //如果空间分配失败
return OVERFLOW;
ST.length=0;
return OK;
}//Creat_SSTable
int Search_Seq(SSTable ST, KeyType key) //顺序查找函数
// 采用带监视哨的顺序查找方法在查找表的n个记录中查找出关键字值为key的记录
//若查找成功,则返回其下标位置;否则,返回0
{ int i;
ST.elem[0].key = key; //"哨兵"
for(i=ST.length; ST.elem[i].key!= key; i--); //从后往前进行查找
return i; //若找到,则返回下标位置;若没有找到,则返回0
}//Search_Seq
int Search_Bin(SSTable ST, KeyType key) //二分查找函数
// 采用二分查找方法在有序表的n个记录中查找出关键字值为key的记录
//若查找成功,则返回其下标位置;否则,返回0
{ int low=1; //查找范围的下界
int high=ST.length; //查找范围的上界
while(low<=high)
{ int mid=(low+high)/2;//中间位置,当前比较的记录位置
if(key==ST.elem[mid].key)
return mid; //查找成功,返回下标位置
else if(key<ST.elem[mid].key)
high=mid-1; //查找范围缩小到前半段
else
low=mid+1; //查找范围缩小到后半段
}
return 0;
}//Search_Bin
void Sort_Select(SSTable &ST)
//对表L进行直接选择排序
{ for(int i=1; i<ST.length; ++i) //控制n-1趟排
{ int min=i; //假设无序子表中的第一条记录的关键字最小
for(int j=i+1; j<=ST.length; ++j)
if (ST.elem[j].key<ST.elem[min].key)
min=j;
if (min!=i) //如果最小关键字记录不在无序子表的第一个位置,则交换
{ ElemType temp=ST.elem[i]; //将最小关键字记录与无序子表中第一个记录交换
ST.elem[i]=ST.elem[min];
ST.elem[min]=temp;
}//if
} //for i
printf("对顺序表排列后所得:\n");
for(int i=1;i<=ST.length;i++)
printf("% d",ST.elem[i].key);
}
int main() //主函数
{ SSTable ST;
int i,pos,x,key;
Creat_SSTable(ST); //创建一个空的顺序表
printf("请输入所要创建的顺序表的长度:");
scanf("%d",&ST.length);
printf("请输入各个记录的关键字值:\n");
for(i=1;i<=ST.length;i++)
scanf("%d",&ST.elem[i].key);
while(1)
{ printf("----------排序菜单------------\n");
printf(" 1---顺序查找\n");
printf(" 2---二分查找\n");
printf(" 3---退出\n");
printf("请选择(1-3):");
printf("----------排序菜单------------\n");
scanf("%d",&x);
switch(x)
{ case 1:
printf("请输入需要查找的关键字:"); //请求输入待查找的记录关键字值
scanf("%d",&key);
pos=Search_Seq(ST,key); //调用顺序查找函数
break;
case 2:
Sort_Select(ST);
printf("\n请输入需要查找的关键字:"); //请求输入待查找的记录关键字值
scanf("%d",&key);
pos=Search_Bin(ST,key); //调用二分法查找函数
break;
case 3: return 0;
default: printf("选择错误,请重选!\n");
}
if(pos==0)
printf("\n查找失败,这个记录没有找到!\n"); //若找不到,提示信息
else
printf("\n查找成功,这个记录所在表中的位置是: %d\n",pos);} //若找到,输出位置
}