二分查找代码:
//二分(要求线性表必须有序)查找
#include <stdlib.h>
#include <stdio.h>
typedef struct list {
int* data;
int length;//元素长度
int num;
}list;
list* init(int length) {
list* L = (list*)malloc(sizeof(list));
L->length = length;
L->data= (int*)malloc(sizeof(int)*length);
L->num = 0;//元素个数为零
return L;
}
void add(list* L, int data) {
if (L->num < L->length)
L->data[(L->num)++] = data;
else
printf("字符长度超出最大长度,%d添加失败\n", data);
}
void shuchu(list* L) {
printf("顺序字段是:");
for (int i = 0; i < L->num; i++)
printf("%d->", L->data[i]);
printf("NULL\n");
}
int ss(list* L, int yuansu) {
int start=0,end=L->num-1,mid;//数组下标
while (start <= end) {
mid = (start + end) / 2;
if (L->data[mid] > yuansu)
end = mid - 1;
else if (L->data[mid]< yuansu)
start = mid + 1;
else
return mid;
}
return -1;
}
int digui(list* L, int yuansu,int start,int end) {
if (start == end)
if (L->data[start] == yuansu) {
return start;
}
else return -1;
int mid = (start + end) / 2;
if (L->data[mid] > yuansu)
digui(L, yuansu, start, mid - 1);
else if (L->data[mid] < yuansu)
digui(L, yuansu, mid+1, end );
else
return mid;
}
int main() {
int i = 0, j = 5;
list* L = init(5);
add(L, 0);
add(L, 1);
add(L, 2);
add(L, 3);
add(L, 4);
add(L, 5);
add(L, 6);
add(L, 7);
shuchu(L);
while (j--) {
printf("输入查找的数字:");
scanf_s("%d", &i);
//ss(L, i) ? printf("此数存在\n") : printf("此数不存在\n");
printf("%d in %d\n", L->data[ss(L, i)], ss(L, i));
}
j = 5;
printf("递归查找:\n");
while (j--) {
printf("输入查找的数字:");
scanf_s("%d", &i);
//ss(L, i) ? printf("此数存在\n") : printf("此数不存在\n");
printf("%d in %d\n", L->data[digui(L, i,0,L->num-1)], digui(L, i, 0, L->num-1));
}
}
输出结果: