一、操作要求
1.根据输入的查找表的表长n和n个关键字值,建立顺序查找表;
2.用顺序查找方法在上述顺序查找表中查找与已经给定关键值相等的记录;
3.选择一种排序方法对1中建立的顺序查找表进行排序;
4.在3中的有序查找表中用二分查找方法查找与已经给定关键值相等的记录 ;
5.编写main函数,设计菜单使用户能通过菜单的选择多次通过调用上述功能函数来实现所选择的查找操作,并且在每次操作后都输出其操作结果:若查找成功,则输出“查找成功”并输出这条记录在表中的位置,否则输出“查找失败”。
二、代码实现
#include<stdio.h>
#include<malloc.h>
#define OK 1
#define ERROR 0
typedef int Status;
typedef int keyType;
typedef struct{
keyType key;
}Elemtype;
typedef struct{
Elemtype *elem;
int length;
int listsize;
}SSTable;
//动态不像静态可以直接分配空间
Status creatsstable(SSTable &L,int n){
L.elem=(Elemtype *)malloc(100*sizeof(Elemtype));
if(!L.elem)
return ERROR;
L.length=n;
L.listsize=100;
printf("请输入表中的值:\n");
for(int i=1;i<=n;i++){
scanf("%d",&L.elem[i].key);
}
return OK;
}//创建一个查找表
Status copy(SSTable L,SSTable &L1){
//L1分配空间,L的关键字复制到L1的关键字中
L1.elem=(Elemtype *)malloc(100*sizeof(Elemtype));
L1.length=L.length;
L.listsize=100;
for(int i=1;i<=L1.length;i++){
L1.elem[i].key=L.elem[i].key;
}
}//复制
int search(SSTable L,keyType key){
int i;
L.elem[0].key=key;
for(i=L.length;L.elem[i].key!=key;i--);
return i;
}//顺序查找
void Insert(SSTable &L){
int i,j;
for(i=2;i<=L.length;i++)
if(L.elem[i].key<L.elem[i-1].key){
L.elem[0]=L.elem[i];
L.elem[i]=L.elem[i-1];
for(j=i-2;L.elem[0].key<L.elem[j].key;j--)
L.elem[j+1]=L.elem[j];
L.elem[j+1]=L.elem[0];
}
} //直接插入排序
int two_search(SSTable L,keyType key){
int low=1;
int high=L.length;
int mid;
while(low<=high){
mid=(low+high)/2;
if(key==L.elem[mid].key)
return mid;
else if(key<L.elem[mid].key)
high=mid-1;
else
low=mid+1;//不要+return!
}
return 0;
} //二分查找
void Output(SSTable L){
for(int i=1;i<=L.length;i++){
printf("%d\t",L.elem[i].key);
}
printf("\n");
} //输出函数
int main(){
SSTable L,L1;
int n,a,key;
printf("请输入长度:\n");
scanf("%d",&n);
creatsstable(L,n);
while(1){
printf("-----选择查找方法-----\n");
printf("1--顺序查找\n");
printf("2--二分查找\n");
printf("请选择要执行的功能(1-2):\n");
scanf("%d",&a);
switch(a){
case 1:
printf("请输入要查找的关键字:\n");
scanf("%d",&key);
if(search(L,key)){
printf("操作后的结果为:\n");
Output(L);
printf("查找成功\n");
printf("位置为:%d\n",search(L,key));
}
else
printf("查找失败\n");
break;
case 2:
printf("请输入要查找的关键字:\n");
scanf("%d",&key);
copy(L,L1);//动态所以要copy
Insert(L1);
if(two_search(L1,key)){
printf("操作后的结果为:\n");
Output(L1);
printf("查找成功\n");
printf("位置为:%d\n",two_search(L1,key));
}
else
printf("查找失败\n");
break;
}
}
}
三、运行结果