线性表的查找操作(线性表的顺序查找、二分查找、分块查找)

内容:

(1)随机产生n个两位整数,构造一个查找表。

(2)输入一个整数,利用顺序查找法在查找表中查找该整数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。

(3)对查找表按递增顺序进行排序。

(4)输入一个整数,利用折半查找法在有序表中查找该整数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。

(5)输入整组数无序,但局部有序的一组整数,建立查找表,输入一个整数,利用分块查找法查找该数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。

代码如下:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <time.h>

typedef struct table{
	int *elem;
	int length;
}SSTable;

typedef struct search{
	int key;
	int first;
}Search;

void InitTable(SSTable &ST)
{//建立查找表 
	int i,j,n;
	srand(time(0));
	printf("请输入随机生成数的个数:");
	scanf("%d",&n);
	
	ST.elem=(int *)malloc(sizeof(int)*(n+1));

	for(i=1;i<=n;i++)
		ST.elem[i]=rand()%90+10;
	ST.length=n;
}

int _Search(SSTable ST,int key)
{//顺序查找 
	int n,i,j;
	ST.elem[0]=key;
	for(i=ST.length;ST.elem[i]!=key;i--);
	return i;
}

void Display(SSTable ST)
{//显示在屏幕上 
	int i;
	for(i=1;i<=ST.length;i++)
		printf("%d ",ST.elem[i]);
	putchar('\n');
}

void Sort(SSTable &ST,int k)
{//从小到大排序 
	int i,j;
	int temp;
	for(i=k;i<ST.length;i++)
	{
		for(j=i+1;j<=ST.length;j++)
		{
			if(ST.elem[i]>ST.elem[j])
			{
				temp=ST.elem[i];
				ST.elem[i]=ST.elem[j];
				ST.elem[j]=temp;
			}
		}
	}
	
}
int Search_Bin(SSTable ST,int key)
{//二分查找
	int i,j;
	int left=1,right=ST.length;
	int mid=(left+right)/2;
	
	while(left<=right)
	{
		if(ST.elem[mid]==key)
			return mid;
		if(ST.elem[mid]<key)
		{
			left=mid+1;
			mid=(left+right)/2;
		}
		if(ST.elem[mid]>key)
		{
			right=mid-1;
			mid=(left+right)/2;
		}
	}
	return 0;
}

int Block_Search(SSTable &ST)
{//分块查找 
	Search S[10];
	int i,j,n,m,index,key,temp;
	
	
	printf("请输入分多少块:");
	scanf("%d",&index);
	
	
	for(i=0;i<index;i++)
	{
		S[i].key=0;
		S[i].first=0;
	}
	
	
	m=ST.length/index;
	
	if(ST.length%index)
		m++;
	

	printf("重新输入%d个数:",ST.length);
	
	for(i=1;i<=ST.length;i++)
	{
		temp=(i-1)/m;
		if(!S[temp].first)
			S[temp].first=i;
		scanf("%d",&ST.elem[i]);
		if(S[temp].key<ST.elem[i])
			S[temp].key=ST.elem[i];
	}
	
	
	
	printf("请输入要查找的数:");
	scanf("%d",&key);
	
	S[(ST.length-1)/m+1].first=ST.length+1;
	
	for(i=0;i<index;i++)
	{
		if(key<=S[i].key)
			break;
	}
	
	if(i<index)
	{
		for(j=S[i].first;j<S[i+1].first;j++)
		{
			if(ST.elem[j]==key)
				return j;
		}
	}
	return 0;
}


int main()
{
	SSTable ST;
	int i,j,n,key;

	InitTable(ST);
	
	Display(ST);
	
	printf("请输入要查找到数:");
	scanf("%d",&key);
	j=_Search(ST,key);		//顺序查找 
	printf("该数字在表中的位置为(0为未查找到):%d\n",j);
	
	Sort(ST,1);
	Display(ST);
	//排序并显示 
	printf("请输入要查找的数:");
	scanf("%d",&key);
	
	j=Search_Bin(ST,key);	//二分查找
	printf("该数字在表中的位置为(0为未查找到):%d\n",j);


	j=Block_Search(ST);	//分块查找
	printf("该数字在表中的位置为(0为未查找到):%d\n",j);
	
	
	return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值