查找方法综合实例
1.问题描述
任意给出一组关键字序列,如{34, 44, 43, 12, 53, 55, 73, 64, 77},n=9。
应用常用的查找方法——顺序查找和二分查找方法进行查找。
2.设计要求
编写完整的可运行程序。
要求使用菜单的方式,使用户可以任意选择查找方法进行查找给定的关键字,并输出查找后的结果。
3.数据结构
typedef int Keytype;
typedef struct{
Keytype key;
…
} SElemType;
typedef struct{
SElemType *elem;
int length;
} SeqTable;
4.源代码
#include <stdio.h>
#define MAXSIZE 11
typedef int Keytype;
typedef struct
{
Keytype key;
} SElemType;
typedef struct
{
SElemType *elem; //数据元素存储空间基址
int length; //表的长度
} SeqTable;
void Print(SElemType r[],int n)
{
int i;
for(i=1;i<=n;i++)
printf("%3d",r[i]);
printf("\n");
}
//冒泡排序
void BubbleSort(SElemType r[],int n)
//对表中的第1到第n个记录进行冒泡排序,r[0]为临时交换空间{
int i,j,Exchanged;
for(i=1;i<=n;i++)
{
Exchanged=0; //Exchanged=0未发生交换
for(j=1;j<n-i;j++)
if(r[j].key>r[j+1].key)
{
r[0]=r[j];
r[j]=r[j+1];
r[j+1]=r[0];
Exchanged=1; //Exchanged=1发生交换
}
if(Exchanged==0) //若未交换,排序结束
break;
}
Print(r,n);
}
//顺序查找
int SearchSeq(SeqTable ST,Keytype key)
//在顺序表ST中顺序查找其关键字key的数据元素
{
int i;
ST.elem[ST.length].key=key; //监视哨
for(i=1;ST.elem[i].key!=key;i++)
;
if(i<ST.length)
return i;
else
return -1;
}
//折半查找
int SearchBin(SeqTable ST,Keytype key)
//在有序表ST中折半查找其关键字key的数据元素
{
int low,high,mid;
low=1;
high=ST.length-1;
while(low<=high)
{
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 -1; //顺序表中不存在待查元素}
void Menu()
{
printf("***********************************************\n");
printf("1.顺序查找\n");
printf("2.二分查找\n");
printf("3.退出程序\n");
printf("***********************************************\n"); }
void main()
{
SeqTable ST;
Keytype key;
int index,i;
SElemType Data[MAXSIZE]={0,34,44,43,12,53,55,73,64,77};
ST.elem=Data;
ST.length=10;
printf("待查找序列为:");
Print(Data,9);
Menu();
scanf("%d",&i);
while(i!=3)
{
switch(i)
{
case 1:
printf("顺序查找法:\n");
printf("请输入待查找的关键字:");
scanf("%d",&key);
index=SearchSeq(ST,key);
if(index==-1)
printf("序列中不存在关键字为%d的元素!\n");
else
printf("关键字为%d的元素是查找表中第%d个元素!\n",key,index);
break;
case 2:
printf("二分查找法:\n");
printf("因为二分查找法必须是有序序列,所以应先对查找序列排序:\n");
BubbleSort(Data,9);
printf("请输入待查找的关键字:");
scanf("%d",&key);
index=SearchBin(ST,key);
if(index==-1)
printf("序列中不存在关键字为%d的元素!\n");
else
printf("关键字为%d的元素是查找表中第%d个元素!\n",key,index);
break;
default:
printf("按键错误!\n");
}
printf("\n");
Menu();
scanf("%d",&i);
}
}
6.结果。