educoder:第1关:实现折半查找
```c
//折半查找的顺序表 实现文件
//每个结点的数据是关键码
//
#include"stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include "BSlist.h"
BSeqList* BSL_Create(int size)
//创建一个顺序表
//与BSL_Free()配对
{
BSeqList* blist = (BSeqList*)malloc(sizeof(BSeqList));//创建一个结构体
blist->pkey = (int*)malloc(sizeof(int)*size);//为结构体中的数组分配空间
blist->max = size;//定义数组最大容量
blist->len = 0;//当前数组容量为0
return blist;//将结构体的指针返回
}
void BSL_Free(BSeqList* blist)
//释放/删除顺序表
//与BSL_Create()配对
{
free(blist->pkey);//释放之前手动分配内存的数组
free(blist);//释放之前手动分配的结构体
}
int BSL_FindKey(BSeqList* blist, int key)
//在排序的顺序表中查找关键码值为key的结点,返回结点的编号
//返回值大于等于0时表示找到值为key的结点的编号,-1表示没有找到
{
/*请在BEGIN和END之间实现你的代码*/
/*****BEGIN*****/
if (blist->len >= blist->max) return -1;//当前长度大于最大长度的时候插入失败
int k, r, m;
k = 0; r = blist->len - 1;
//寻找插入位置
while (k <= r) {
m = (k + r) >> 1; //m=(k+r)/2 就是求k和r的向下平均值
if (key == blist->pkey[m]) return m;
else if (key<blist->pkey[m]) r = m - 1;
else k = m + 1;
}
return -1;
/******END******/
/*请不要修改[BEGIN,END]区域外的代码*/
}
int BSL_InsKey(BSeqList* blist, int key)
//在排序的顺序表中插入一个值为key的结点
//返回值大于等于0时表示插入的位置, -1表示表满(无法插入)
{
if (blist->len >= blist->max) return -1;//当前长度大于最大长度的时候插入失败
int k, r, m;
k = 0; r = blist->len - 1;
//寻找插入位置
while (k <= r) {
m = (k + r) >> 1; //m=(k+r)/2 就是求k和r的向下平均值
if (key == blist->pkey[m]) return -2;若不允许插入已存在的值,则需要此行
if (key<blist->pkey[m]) r = m - 1;
else k = m + 1;
}
//插入位置为k, 腾出k号位置
for (r = blist->len; r>k; r--)
blist->pkey[r] = blist->pkey[r - 1];
//key放入k号位置
blist->pkey[k] = key;
blist->len++;
return k;
}
int BSL_DelKey(BSeqList* blist, int key)
//在排序的顺序表中删除值为key的结点,
//存在值为x的结点则返回结点编号, 未找到返回-1
{
int k = BSL_FindKey(blist, key);
if (k<0) return -1;
int i = k;
while (i < blist->len - 1) {
blist->pkey[i] = blist->pkey[i + 1];
i++;
}
blist->len--;
return k;
}
void BSL_Print(BSeqList* blist)
//打印整个顺序表
{
if (blist->len == 0) {
printf("The list is empty.\n");
return;
}
printf("The list contains: ");
for (int i = 0; i<blist->len; i++) {
printf("%d ", blist->pkey[i]);
}
printf("\n");
}