关闭

顺序表的查找

146人阅读 评论(0) 收藏 举报
分类:
顺序表的查找
内容:
(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");
	else
		printf("位置是%d.\n",n);
	return 0;
}


0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:20627次
    • 积分:1877
    • 等级:
    • 排名:千里之外
    • 原创:174篇
    • 转载:13篇
    • 译文:0篇
    • 评论:3条
    最新评论