静态查找表的操作

一、操作要求

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;			
				}
		}
	}

三、运行结果

  • 5
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值