顺序表的查找

来源:互联网 发布:西瓜播放器mac版 编辑:程序博客网 时间:2024/05/22 07:47
顺序表的查找
内容:
(1)随机产生n个两位整数,构造一个查找表。
(2)输入一个整数,利用顺序查找法在查找表中查找该整数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。
(3)对查找表按递增顺序进行排序。
(4)输入一个整数,利用折半查找法在有序表中查找该整数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。
(5)输入整组数无序,但局部有序的一组整数,建立查找表,输入一个整数,利用分块查找法查找该数是否存在。若查找成功,返回该整数在表中的位置;查找失败则返回0。
#include<stdio.h>#include<stdlib.h>typedef struct elem{int key;int location;//记录的位置}elem;typedef struct node{   elem* base;   int length;}SStable;void Creattable(SStable &s){     int i; printf("请输入表的长度:\n"); scanf("%d",&s.length);s.base=(elem*)malloc(s.length*sizeof(elem));for (i=1;i<=s.length;i++)    { s.base[i].key=rand()%90+10; s.base[i].location=i;}}int Search(SStable s,int n){int i;   s.base[0].key=n;   for (i=s.length;i>>=0;i--)   if (s.base[i].key==n)   return s.base[i].location;   return 0;}void Sort(SStable &s){int i,j,k;elem temp;for (i=1;i<s.length;i++){k=i;for (j=i+1;j<=s.length;j++)if (s.base[k].key>s.base[j].key)           k=j;if (k!=i){  temp=s.base[k];  s.base[k]=s.base[i];  s.base[i]=temp;}}for (i=1;i<=s.length;i++) printf("关键字:%d 位置:%d\n",s.base[i].key,s.base[i].location);}int fenzhi(SStable s,int n){int low=1,high=s.length,mid;    while (low<=high){   mid=(low+high)/2;   if (s.base[mid].key==n)   return s.base[mid].location;   else  if (s.base[mid].key<n)   low=mid+1;   else    high=mid-1;}   return 0;}int Binsearch(SStable &s){int i,m,n,k,j;int b[10],key;//b数组用来记录每块中最大值printf("请输入表的长度以及块数.\n");scanf("%d%d",&s.length,&n);     m=s.length/n; s.base=(elem*)malloc(s.length*sizeof(elem)); i=1; j=1; b[1]=0; while (i<=s.length) {    scanf("%d",&s.base[i].key);s.base[i].location=i;if (b[j]<s.base[i].key)      b[j]=s.base[i].key;if (i%m==0){  j++;  b[j]=0;}i++; } for (i=1;i<=s.length;i++) printf("%d ",s.base[i].key); printf("\n"); printf("请输入关键值:\n"); scanf("%d",&key); if (b[j]<key)return 0; k=1; while (b[k]<key) k++; for (i=(k-1)*m+1;i<=k*m;i++) if (key==s.base[i].key)return s.base[i].location;for (i=j*m+1;i<=s.length;i++)//对于不足以构成一个块的数组进行扫描if (key==s.base[i].key)//不太对题意,相当于多分出一个块,现在没想出更好的方法来解决return s.base[i].location;return 0;}int main(){SStable s;int key,m,n;Creattable(s);    printf("请输入要查找的关键值:\n");scanf("%d",&key);m=Search(s,key); if (m) printf("位置是%d.\n",m); else printf("该表中不存在该关键字\n"); printf("经过排序后得:\n"); Sort(s); printf("请输入要查找的关键值:\n");scanf("%d",&key);m=fenzhi(s,key);if (m) printf("位置是%d.\n",m); else printf("该表中不存在该关键字\n");n=Binsearch(s);if (!n)printf("查找失败.\n");elseprintf("位置是%d.\n",n);return 0;}


0 0
原创粉丝点击