0
点赞
收藏
分享

微信扫一扫

数据结构二分查找

白衣蓝剑冰魄 2022-04-05 阅读 81

二分查找代码:

//二分(要求线性表必须有序)查找
#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));
	}
}

输出结果:
在这里插入图片描述

举报

相关推荐

0 条评论