查找 c语言

//查找程序 
#include <stdio.h>
#include <windows.h>
#include <math.h>

#define TreeSize 100
typedef char SeqTree[TreeSize];
SeqTree tree;//相当于SeqTree 等于 定义一个数组(tree)



void shuru(int ch[]);//输入初始化函数
void shunxu(int ch[]);//排序 小-大
void shuchu(int ch[]);//输出
int chazhao(int ch[],int mubiao);//顺序查找
int chazhao_1(int ch[],int mubiao);//二分查找
void InitSeqTree(SeqTree tree);//树的初始化
int bangmang(int hh);//帮忙计算总节点
void CreatSeqTree(SeqTree tree, int i);//创建树
void ForCreatSeqTree(SeqTree tree,int i);//辅助创建树
void PreOrderTraverse(int index);//先序遍历输出
void chazhao_2(char ch_2);//动态查找所用
int GetSeqTreeLength(SeqTree tree);//获取树节点个数
int GetSeqTreeDepth(SeqTree tree);//获取树的深度




//全局变量 以下
int dd0=0;
int dd1=0;
int chuqu=0, depth2=0, de=0, length0=0, suan1=0, suan=0, dd=0, diyi=0, biaoshi=0, geshu1=0;
char chch='a';
char ch_2='a';

int main(void)
{
	int ch[10], mubiao_1, weizhi;
	int choose=0, choose_1=0, choose_2=0, choose_3=0;
	int choose1=0, choose2=0, choose3=0;//choose1为静态标识,choose2为动态标识
	char xuanze[10];
	system("color F1");
	system("pause");
	printf("欢迎来到查找程序!\n");
	do{
		puts("请选择查找的种类: 1.静态查找	2.动态查找 3.哈希查找 \n");
		scanf("%d",&choose);
		if(choose == 1)
			choose1=1;
		else if(choose == 2)
			choose2=1;
		else if(choose == 3)
			choose3=1;
		else
			printf("输入有误,请重新输入!\n");
	}while(choose != 1 && choose != 2);
	//printf("测试代码完成!\n");
	if(choose1 == 1)
	{
		//
		do{
			printf("\n请选择静态查找的种类\n");
			printf(" 1.顺序表查找	2.二分查找	3.索引顺序表查找 \n");
			scanf("%d",&choose_1);
			if(choose_1 == 1)
			{
				printf("本程序只处理无序的查找,毕竟有序的查找要更简单一步.\n");
				shuru(ch);
				printf("请输入需要查找的数值:");
				scanf("%d",&mubiao_1);
				weizhi=chazhao(ch,mubiao_1);
				printf("它位于第%d个\n",weizhi);
				printf("寻找次数:%d\n",dd0);
				printf("顺序为\n");
				shuchu(ch);
				printf("\n完成!\n");
			}
			else if(choose_1 == 2)
			{
				printf("二分查找的前提是已经为有序的!\n");
				printf("我们这将为你把数组排序为有序!,请放心输入!\n");
				shuru(ch);
				shunxu(ch);
				printf("请输入需要查找的数值:");
				scanf("%d",&mubiao_1);
				weizhi=chazhao_1(ch,mubiao_1);
				printf("它位于第%d个\n",weizhi);
				printf("寻找次数:%d \n",dd1);
				printf("顺序为\n");
				shuchu(ch);
				printf("\n完成!\n");
			}
			else if(choose_1 == 3)
			{
				//
				printf("不好意思,暂且未涉及!\n");
			}
			else
			{
				printf("输入有误!请重新输入!\n");
			}
		}while(choose_1!=1 && choose_1!=2 && choose_1!=3);
	}
	else if(choose2 == 1)
	{
		//
		printf("请选择动态查找的种类\n");
		printf(" 1.二叉排序树的定义与查找	2.二叉排序树的运算 \n");
		printf("%d",&choose_2);
		if(choose_2 == 1)
		{
			//
			printf("\n满二叉树情况下一共有多少节点:");
			printf("\n是否需要帮忙,你只需要输入深度我们可以帮助你计算总节点树(只适用满二叉树最多节点时!!!)\n");
			printf("需要的话请输入“ yes ”,不需要的话请输入“ no ”或其它\n");
			fflush(stdin);
			scanf("%s",&xuanze);
			getchar();
			while(chuqu==0){
				if(strcmp(xuanze,"yes") == 0 )
				{
					//qianmian:
					printf("请输入深度:");
					scanf("%d",&depth2);
					de=bangmang(depth2);
					printf("\n则总节点为:%d\n",de);
					chuqu=1;
				}
				else
				{
					chuqu=2;
					//printf("\n");
					//goto qianmain;//跳转到242行 尽量避免使用goto语句
				}
			}
			if(chuqu == 1)
				printf("请输入刚才我们告诉你的节点数!\n请输入:");
			else
				printf("满二叉树情况下一共有多少节点:");
			scanf("%d",&length0);
			printf("\n“^”代表空的地方\n");
			printf("\n请输入树根:");
			CreatSeqTree(tree,0);
			printf("请输入需要查找的字符:\n");
			fflush(stdin);
			scanf("%c",&ch_2);
			printf("\n 完成 !\n");
			printf("元素为:\n");
			PreOrderTraverse(0);
		}
		else if(choose_2 == 2)
		{
			//
			printf("\n 不好意思,本程序暂不涉及!\n");
		}
	}
	else if(choose3 == 1)
	{
		//
		printf("欢迎来到哈希查找\n");
	}
	return 0;
}

void shuru(int ch[])
{
	int i=0;
	printf("请依次输入(初始化)\n");
	for(i=0; i<10; i++)//默认10为大小
	{
		printf("请输入第%d个:ch[%d]=",i+1,i);
		scanf("%d",&ch[i]);
		printf("\n");
	}
}

void shunxu(int ch[])//排序
{
	int j=0, i=0, temp;
	for(i=0; i<10; i++)
	{
		for(j=i; j<10; j++)
		{
			if(ch[i]>ch[j])
			{
				temp=ch[j];
				ch[j]=ch[i];
				ch[i]=temp;
			}
		}
	}
}

void shuchu(int ch[])//输出
{
	int i=0;
	puts("如下");
	for(i=0; i<10; i++)
	{
		printf("ch[%d]=%d\t",i,ch[i]);
		if((i+1)%5==0 && i!=0)
			printf("\n");
	}
}

int chazhao(int ch[],int mubiao)//查找
{
	int i=0, j=0;
	for(i=0; i<10; i++)
	{
		dd0++;
		if(ch[i]==mubiao)
		{
			j=1;
			return i+1;
		}
	}
	if(j!=1)//其实有些多余!!!
		printf(" 没有找到%d !\n",mubiao);
	return -1;
}

int chazhao_1(int ch[], int mubiao)//二分查找
{
	int j=0, mid=0;
	int low=0, high=9;
	while(low<high)
	{
		dd1++;
		mid=(low+high)/2;
		if(mubiao == ch[mid])
			return mid+1;
		else if(mubiao > ch[mid])
			low=mid;
		else
			high=mid;
	}
	printf(" 没有找到%d \n",mubiao);
	return -1;
}

void InitSeqTree(SeqTree tree)
{
	int i=0;
	for(i=0;i<TreeSize;i++)
	{
		tree[i]='\0';
	}
}

int bangmang(int hh)//帮忙计算总节点
{
	//hh代表为深度
	int de1=0;
	de1=(int)pow(2,hh)-1;//pow的返回值为double型
	return de1;
}

void CreatSeqTree(SeqTree tree, int i)
{
	char ch1;
	int jjj=1;
	suan1=suan;//suan1就做一个中间变量
	getchar();
	ch1 = getchar();
	tree[i] = ch1;//从0开始哦
	dd++;
	do{
		if(diyi==0)
		{
			printf("\n请输入根部左子树:");
			ForCreatSeqTree(tree,1);
			printf("\n请输入根部右子树:");
			ForCreatSeqTree(tree,2);
			diyi=1;//变化一个值就行
		}
		else{
			if(diyi!=1){
				printf("\n请输入左子树:");
				ForCreatSeqTree(tree,i);
				printf("\n请输入右子树:");
				ForCreatSeqTree(tree,i+1);
			}
			for(jjj=1;;jjj++){//此处的中括号开始忘记了,差点出大事了逻辑有问题了
				//下面四行都是测试代码
				//printf("suan=%d\n",suan);
				//printf("(int)pow(2.,jjj)=%d\n",(int)(pow(2.,jjj)));
				//printf("jjj=%d\n",jjj);
				//printf("suan1=%d\n",suan1);
				if(suan==((int)(pow(2.,jjj))+suan1)){
					if(biaoshi == 1)
						//biaoshi=0;
						printf("\n");
					else if(biaoshi == 0){
						i=suan+1;//跳转到树的下一级别上
						if(suan==((int)pow(2.,jjj)+suan1))//开始的时候这里写了while出现了未知的bug
						{
							diyi=2;
							break;//不仅找到了,而且此时需要跳出循环了
						}
					}
				}
				else
				{
					if(biaoshi == 1){
						i=i+2;
						biaoshi=0;
					}
					else
						i=i+2;//此处的i=i+2改为i=i+1;就可以实现将^的位置取消了(数组)
					break;
				}
			}
		}
	}while(dd != length0);
}

void ForCreatSeqTree(SeqTree tree,int i)
{
	//
	char ch1;
	getchar();
	scanf("%c",&ch1);
	if(ch1 == '^'){//它不会算入节点位,但是你依然需要输入^(顺序存储的二叉树必须要按照满二叉树的形式进行存储)
		suan++; //此处的saun到底能不能加?
		dd++;
		biaoshi=1;
		geshu1++;
		return;
	}
	printf("\n*** i=%d ***\n",i);
	tree[i] = ch1;//从0开始哦
	suan++;
	dd++;
}

void PreOrderTraverse(int index)//先序遍历输出//!!!为什么我这里要加一,而且后序遍历还有问题!!!
{
	//int i=0;
	if(tree[0] == '\0' || GetSeqTreeLength(tree) == 0){
		printf("\n数组为空,不能遍历\n");
		return ;
	}
	if(tree[index] != '\0')
	{
		printf("%c\t",tree[index]);
		chch=tree[index];
		chazhao_2(chch);
	}
	if((index*2+1)<length0-geshu1+1){
		PreOrderTraverse(index*2+1);
	}
	if((index*2+2)<length0-geshu1+1){//GetSeqTreeLength(tree)
		PreOrderTraverse(index*2+2);
	}
	//index=index+1;此行代码可以不需要
}

void chazhao_2(char ch_2)//
{
	if(chch == ch_2)
		printf("查找到了!\n");
}

int GetSeqTreeLength(SeqTree tree)
{
	//
	int len=0, i =0;
	for(i=0;i<TreeSize;i++)
	{
		if(tree[i] == '\0')
			continue;//如果是初始化的状态,就直接跳过不加len
		len++;
	}
	return len;
}

int GetSeqTreeDepth(SeqTree tree)
{
	//原理较难(理解满二叉树)
	int depth=0;
	int len = GetSeqTreeLength(tree);
	while((int)pow(2,depth)-1<len)//pow的返回值为double型
	{
		depth++;
	}
	return depth;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值