数据结构查找算法

利用随机函数产生30000个随机整数,进行顺序查找、折半查找,并进行比较。建立二叉排序树,并进行查找

代码如下:

#include<stdlib.h>
#include<stdio.h>
#include<conio.h>
#define NULL 0
#define MAX 100
typedef int KeyType;
typedef struct
{ 
	KeyType key;
}ElemType;//元素类型
//顺序查找
typedef struct{
	ElemType *elem;
	int length;
}SSTable;
int Create(SSTable *ST)
{
	int i,n;
	printf("\n 请输入表长: ");
	scanf("%d",&n);
	ST->elem=(ElemType*)malloc((n+1)*sizeof(ElemType));
	if(!ST->elem)return 0;
	printf(" 请输入 %d 个数据:",n);
	for(i=1;i<=n;i++)scanf("%d",&(ST->elem[i].key));
	ST->length=n;
	return 1;
}
//在顺序表中查找关键字等于key的数据元素,若找到,则函数值为该元素在表中的位置,
//否则为0,指针变量time记录所需和关键字进行比较的次数。
int Search(SSTable ST,KeyType key,int*time)
{
	int i;
	ST.elem[0].key=key;
	*time=1;
	for(i=ST.length;ST.elem[i].key!=key;i--,++*time);
	return i;
}
void ST()
{
	SSTable ST;
	KeyType key;
	int i,time;
	char ch;
	if(Create(&ST))
	{
		printf(" 创建成功");//创建成功
		//可重复查询
		do{
			printf(" 输入你想要查找的关键字:");
			scanf("%d",&key);
			i=Search(ST,key,&time);
			if(i!=0)//查找成功!输出所在位置及key与元素关键字的比较次数
			{
				printf("查找成功,位置为%d",i);
				printf("\n 与关键字比较的次数为 %d",time);
			}
			else//查找失败,输出key与元素关键字的比较次数
			{
				printf("查找失败!");
				printf("\n 与关键字比较的次数为  %d",time);
			}
			printf("\n 继续吗(y/n):\n");
			//是否继续,y或Y表示继续查询,其他表示退出查询
			ch=getch();
		}while(ch=='y'||ch=='Y');
	}
	else//表ST建立失败,输出内存溢出的消息
		printf("\n 溢出");
}
//折半查找
typedef struct
{
	int e[MAX+1];
	int length;
}Stable;
void create_seq(Stable *list);
int sort_seq(Stable *list);
int bin_search(Stable *list,int k,int low,int higt);
void bin()
{
	Stable *list,table;
	int i,key;
	list=&table;
	printf("请输入线性表的长度:");
	scanf("%d",&list->length);
	create_seq(list);
	sort_seq(list);
	printf("排列后的数据\n");
	for(i=1;i<=list->length;i++)
		printf("list.e[%d].key=%d\n",i,list->e[i]);
	printf("\n请输入查找的值:");
	scanf("%d",&key);
	bin_search(list,key,1,list->length);
}
void create_seq(Stable *list)
{
	int i;
	printf("请输入顺序表的内容:\n");
	for(i=1;i<=list->length;i++)
	{
		printf("list.e[%d].key=",i);
		scanf("%d",&list->e[i]);
	}
}
int sort_seq(Stable *list)
{
	int i,j,flag;
	for(i=1;i<list->length;i++)
	{
		flag=0;
		for(j=1;j<list->length-i+1;j++)
			if(list->e[j]>list->e[j+1])
			{
				list->e[0]=list->e[j+1];
				list->e[j+1]=list->e[j];
				list->e[j]=list->e[0];
				flag=1;
			}
			if(flag==0)
				return 1;
	}
	return -1;
}
int bin_search(Stable *list,int k,int low,int high)
{
	int mid;
	if(low>high)
	{
		printf("没有查找到要查找的值\n");
		return (0);
	}
	mid=(low+high)/2;
	if(list->e[mid]==k)
	{
		printf("查找成功\n");
		printf("list[%d]=%d\n",mid,k);
			return (mid);
	}
	if(list->e[mid]<k)
		return(bin_search(list,k,mid+1,high));
	else
		return (bin_search(list,k,low,mid-1));
}
//二叉排序树
typedef struct BiTNode
{
	ElemType data;
	struct BiTNode *lchild,*rchild;
}BiTNode,*BiTree;
//在二叉排序树bt中查找其关键字给定值的结点是否存在,并输出相应信息
BiTree SearchBST(BiTree bt,KeyType key)
{
	if(bt==NULL)return NULL;
	else if(bt->data.key==key)return bt;
	else if(key<bt->data.key)return SearchBST(bt->lchild,key);
	else return SearchBST(bt->rchild,key);
}
//在二叉排序树中插入一个新结点
void InsertBST(BiTree *bt,BiTree s)
{
	if(*bt==NULL)*bt=s;
	else if(s->data.key<(*bt)->data.key)InsertBST(&((*bt)->lchild),s);
	else if(s->data.key>(*bt)->data.key)InsertBST(&((*bt)->rchild),s);
}//对已经建立好的二叉排序树进行中序遍历,将得到一个按关键字有序的元素序列
void Inorder(BiTree bt)
{
	if(bt!=NULL)
	{
		Inorder(bt->lchild);
		printf("%5d",(bt->data).key);
		Inorder(bt->rchild);
	}
}

void BT()
{
	char ch;
	KeyType key;
	int i=0;
	BiTNode *s,*bt;
	//建立一棵二叉排序树,元素值从键盘输入,直到输入关键字等于-1为止
	printf("n 请输入数据(输入-1结束):\n");
	scanf("%d",&key);
	bt=NULL;
	while(key!=-1)
	{
		s=(BiTree)malloc(sizeof(BiTNode));
		(s->data).key=key;
		s->lchild=s->rchild=NULL;
		InsertBST(&bt,s);
		scanf("%d",&key);
	}
	printf("\n 二叉排序树创建完成!\n");
	Inorder(bt);//中序遍历已建立的二叉排序树
	do{//二叉排序树的查找,可多次查找,并输出查找的结果
		printf("\n\n 请输入你想要查找的关键字:");
		scanf("%d",&key);
		s=SearchBST(bt,key);
		if(s!=NULL)printf("查找成功 ,值为%d",s->data.key);
		else printf(" 查找不成功!");
		printf("\n\n 继续吗 (y/n):\n");
		ch=getch();
	}while(ch=='y'||ch=='Y');
}

void main()
{
	int ch;
	printf("1--顺序查找\n");
	printf("2--折半查找\n");
	printf("3--二叉排序树\n");
	printf(" 请选择(1-3) ");
	scanf("%d",&ch);
	switch(ch)
	{
	case 1:
		ST();
		break;
	case 2:
		bin();
		break;
	case 3:
		BT();
		break;
	}
}

 

    原文作者:查找算法
    原文地址: https://blog.csdn.net/markin2333/article/details/81205367
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞