利用随机函数产生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;
}
}