数据结构C语言版之查找(折半选择快速等)

//查找:
#include<stdio.h>
#include<time.h>
#include<stdlib.h>
typedef struct{	
	int *elem;
	int length;
}SStable;
typedef struct SYlist{
	int num;
	int *Key;
	int *start;
}SYlist;
void CreatSearchlist(SStable &S)
{
	int i;
	printf("请输入表长:\n");
	scanf("%d",&S.length);
	S.elem=(int*)malloc((S.length)*sizeof(int));
	for(i=1;i<S.length;i++)
		S.elem[i]=rand()%89+10;	
}
int Search(SStable S,int key)
{
	S.elem[0]=key;
	while(S.elem[S.length]!=key)
		S.length--;
	return S.length;
}
void ShowSStable(SStable S)
{
	int i;
	for(i=1;i<S.length;i++)
	printf("%5d",S.elem[i]);
	printf("\n");
}
void Sort(SStable &S)
{
	int i,j,temp;
	for(i=1;i<S.length-1;i++)
	{
		for(j=1;j<S.length-i-1;j++)
		{
			if(S.elem[j]>S.elem[j+1])
			{
				temp=S.elem[j];
				S.elem[j]=S.elem[j+1];
				S.elem[j+1]=temp;
			}
		}
	}
	ShowSStable(S);
}
int Zbsearch(SStable S,int e)
{
	int mid,high=S.length-1,low=1;
	while(low<=high)
	{
		mid=(low+high)/2;
		if(S.elem[mid]==e)
			return mid;
		else if(S.elem[mid]<e)
			low=mid+1;
		else
			high=mid-1;
	}
	return 0;
}
void CreatSylist(SYlist &sy,SStable &S)
{
	int i,n;
	printf("\n\n\n建立索引表:\n");
	printf("请输入数据个数:\n");
	scanf("%d",&n);
	S.length=n+1;
	S.elem=(int*)malloc((S.length)*sizeof(int));
	printf("请输入一组数(局部有序):\n");
	for(i=1;i<S.length;i++)
		scanf("%d",&S.elem[i]);
	printf("请输入关键字个数:\n");
	scanf("%d",&sy.num);
    sy.Key=(int*)malloc(sy.num*sizeof(int));
	sy.start=(int*)malloc(sy.num*sizeof(int));
	for(i=0;i<sy.num;i++)
	{   printf("请输入第%d个关键字:\n",i+1);
		scanf("%d",&sy.Key[i]);
		printf("请输入该关键字的位置:\n");
		scanf("%d",&sy.start[i]);
	}
}
int Sysearch(SYlist sy,SStable S,int m)
{
	int i=0,j;
	
	while(m>sy.Key[i])
		i++;
	if(i>0 && i<sy.num-1)
	{
		for(j=sy.start[i];j<sy.start[i+1];j++)
		{
			if(S.elem[j]==m)
				return j;
		}
	}
    if(i==0)
	{
		for(j=1;j<sy.start[1];j++)
		{
			if(S.elem[j]==m)
				return j;
		}
	}
	if(i>=sy.num-1)
	{
		for(j=sy.start[sy.num];j<S.length;j++)
		{
			if(S.elem[j]==m)
				return j;
		}
	}
}
int main()
{
	SStable S;
	SYlist sy;
	int key,e,m;
	srand(time(0));
	CreatSearchlist(S);
	printf("随机产生的%d个两位数构造的查找表为:\n",S.length-1);
	ShowSStable(S);
	printf("\n请输入要查找的数:");
	scanf("%d",&key);
	if(Search(S,key))
		printf("查找成功!该数在表中的位置为:%d\n",Search(S,key));
	else
		printf("查找失败!\n");
    printf("对表中数据按递增进行排序后的序列为:\n");
	Sort(S);
	printf("\n请输入要查找的数:");
	scanf("%d",&e);
	if(Zbsearch(S,e))
		printf("折半查找成功!该数在表中的位置为:%d\n",Zbsearch(S,e));
	else
		printf("查找失败!\n");
	CreatSylist(sy,S);
	printf("\n请输入要查找的数:");
	scanf("%d",&m);
	Sysearch(sy,S,m);
    if(Sysearch(sy,S,m))
		printf("查找成功!该数在表中的位置为:%d\n",Sysearch(sy,S,m));
	else
		printf("查找失败!\n");
	return 0;
}

posted @ 2015-12-24 12:35  Joe.Smith  阅读(377)  评论(0编辑  收藏  举报