数据结构实验折半查找C语言实现
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
#include<stdio.h>
#include<stdlib.h>
#include <conio.h>
#define overflow -1
#define EQ(a,b) ((a)==(b))
#define LT(a,b) ((a)<(b))
#define LQ(a,b) ((a)<=(b))
//--------------------------折半查找的数据结构------------------------
typedef intKeyType;
typedef struct{
KeyType key;
}ElemType;
typedef struct{
ElemType *elem;
int length;
}SST able;
//---------------------------操作函数-----------------------------------
void InitList(SSTable&ST,KeyType n);//静态查找表的初始化
void createSST able(SST able&ST);//向查找表中输入元素
void print(SST able ST);
intsearch_Seq(SSTableST,KeyType key);
void SortSST able(SSTable&ST);
intSearch_Bin(SSTableST,KeyType key);
//---------------------------算法实现-----------------------------------
////////////////////////////静态查找表的初始化,查找表长度为n/////////////////////////// void InitList(SSTable&ST,int n)
{
ST.elem=(ElemType *)malloc((n+1)*sizeof(KeyType));
if(!ST.elem)
exit(overflow);
ST.length=n;
}
////////////////////////////向查找表中输入元素///////////////////////////
void createSST able(SST able&ST)
{int a;
printf("要向查找表中输入多少元素?\n");
scanf("%d", &a);
printf("向查找表中输入元素\n");
for(inti=1;i<=a;i++)
scanf("%d",&(ST.elem[i].key));
ST.length=a;
}
///////////////////////////显示查找表里的元素//////////////////////////// void print(SST able ST)
{
inti;
printf("查找表中元素是:\n ");
for(i=1;i<=ST.length;i++)
printf("%d ",ST.elem[i].key);
printf("\n");
}
//////////////////////////查找元素key///////////////////////////////////// intsearch_Seq(SSTableST,KeyType key)
{
inti;
ST.elem[0].key=key;
for(i=ST.length;!EQ(ST.elem[i].key,key);--i);
return i;
}
/////////////////////////对查找表元素进行排序///////////////////////////// void SortSST able(SSTable&ST)
{
for(inti=1;i<ST.length-1;i++)
for(int j=1;j<=ST.length-i;j++)
{
if(ST.elem[j].key>ST.elem[j+1].key)
{
int temp=ST.elem[j].key;
ST.elem[j].key=ST.elem[j+1].key;
ST.elem[j+1].key=temp;
}
}
}
////////////////////////////////折半查找/////////////////////////////// intSearch_Bin(SSTableST,KeyType key)
{
intlow,mid,high;
low=1;
high=ST.length;
while(low<=high)
{
mid=(low+high)/2;
if(EQ(key,ST.elem[mid].key))
return mid;
else if (LT(key,ST.elem[mid].key))
high=mid-1;
else
low=mid+1;
}
return 0;
}
//--------------------------------主函数---------------------------------
void main()
{
SSTable ST;
printf(" 请输入要建立的查找表的长度:");
int n;
scanf("%d",&n);
InitList(ST,n);
printf("\n\n\n 查找表已建立,您可以选择下面您要进行的操作:");
printf("\n**************************************************************************");
printf(" \n 1:向查找表中输入元素2:显示查找表里的元素\n");
printf(" 3:查找元素key 4:对查找表元素进行排序\n");
printf(" 5:排序后进行折半查找6:清屏!选其他任意键结束!\n"); printf("**************************************************************************\n");
inti;
begin:
printf("请输入选项:");
scanf("%d",&i);
printf("\n");
switch(i)
{
case 1: createSSTable(ST);
printf("输入完毕!\n");
goto begin;
case 2:print(ST); printf(""); goto begin;
case 3:printf("请输入你要查找的元素\n");
int key;
scanf("%d",&key);
intinput_key;
input_key=search_Seq(ST,key);
if(input_key==0)
printf("元素%不在查找表中!\n",key);
else
printf("元素%d是查找表中第%d个元素\n",ST.elem[input_key].key,input_key); goto begin;
case 4:printf("排序后");
SortSSTable( ST );
print(ST);
goto begin;
case 5:
printf("请输入你要查找的数字\n");
scanf("%d",&key);
input_key=Search_Bin(ST,key);
if(input_key==0)
printf("利用折半查找法没有找到元素%c!\n",key);
else
{ printf("利用折半查找法得到的查找结果:\n");
printf("%d是查找表中第%d个元素\n",ST.elem[input_key].key,input_key); } goto begin;
case 6: system("cls");
default: break;
}
}。