//查找程序
#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;
}
查找 c语言
最新推荐文章于 2024-01-24 22:54:04 发布