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

来源:互联网 发布:淘宝上买电脑主机可靠 编辑:程序博客网 时间:2024/05/02 21:44

内容:

(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;}


0 0
原创粉丝点击