问题描述
- 我是初学,一个关于顺序查找和折半查找的算法有错,求解答
-
```#include
#define Max 256typedef struct Keylist
{
int key[Max];
int len;
}Keylist;void creatKlist(Keylist L)
{
int i=0;
printf("**建立静态表**n");
printf("你需要构建多少个数据,请输入:");
scanf("%d",&L.len);
printf("n");
for(i=0;i<L.len;i++)
{
printf("请输入100以内的数据n");
scanf("%d",&L.key[i]);
}
}Keylist sort(Keylist L)
{
int i,t;
for(i=0;i
{
if(L.key[i]>L.key[i+1])
{
t=L.key[i];
L.key[i+1]=L.key[i];
L.key[i]=t;
}
}
return L;
}int Seqsearch(Keylist L,int k)
{
int i;
for(i=L.len;L.key[i]!=k;i--)
return i;
}int *Binsearch(Keylist L,int k)
{
int high=L.len,low=1,mid;
int a[1];
while(low<=high)
{
mid=(low+high)/2;
if(L.key[mid]==k)
{
a[0]=mid;
return a;
}
else if(L.key[mid]<k)
{
low=mid+1;
a[1]++;
}
else
{
high=mid-1;
a[1]++;
}
}
return a;
}void main()
{
Keylist L;
int a[1];
creatKlist(L);
int k,i,choice;
printf("请输入你想要执行的操作序号:n");
printf("1.顺序查找n2.折半查找n");
scanf("%d",&choice);
switch(choice)
{
printf("请输入关键码:n");
scanf("%d,&k");
case'1':
i=Seqsearch(L,k);
printf("顺序查找只有一次n");
if(i!=0)
printf("关键码的位置是第%d个",i);
if("i=0")
printf("关键码不存在!");
break;
case'2':
a=Binsearch(L,k);
printf("折半查找位置在%dn",a[0]);
printf("总共找了%d次n",a[1]);
break;
default:
printf("输入错误!结束进程!");
break;
}
return ;
}
解决方案
#include
#define Max 256
typedef struct Keylist
{
int key[Max];
int len;
}Keylist;
//void creatKlist( Keylist L)
void creatKlist( Keylist* L)
{
int i=0;
printf("**建立静态表**n");
printf("你需要构建多少个数据,请输入:");
scanf("%d",&L->len);
printf("n");
for(i=0;ilen;i++)
{
printf("请输入100以内的数据n");
scanf("%d",&L->key[i]);
}
}
//这个函数如果是想用来排序,显然是不对的哦
Keylist sort(Keylist L)
{
int i,t;
//for(i=0;i {
for(i=0;i < L.len; ++i )
{
if(L.key[i]>L.key[i+1])
{
t=L.key[i];
L.key[i+1]=L.key[i];
L.key[i]=t;
}
}
return L;
}
//int Seqsearch(Keylist L,int k)
int Seqsearch(Keylist* L,int k)
{
// int i;
// for(i=L->len;L->key[i]!=k;i--)
// return i;
int i;
for(i=L->len-1;L->key[i]!=k && i >= 0;i--)
;
return i;
}
//int Binsearch(Keylist L,int k)
int *Binsearch(Keylist L,int k)
{
//int high=L->len,low=1,mid;
int high = L->len-1,low=0,mid;
//int a[1];
int* a = new int[2];
a[0] = 0;
a[1] = 0;
while(low<=high)
{
mid=(low+high)/2;
if(L->key[mid]==k)
{
a[0]=mid;
return a;
}
else if(L->key[mid]<k)
{
low=mid+1;
a[1]++;
}
else
{
high=mid-1;
a[1]++;
}
}
return a;
}
void main()
{
Keylist L;
//int a[1];
int* a = NULL;
//creatKlist( L );
creatKlist( &L );
int k,i,choice;
printf("请输入你想要执行的操作序号:n");
printf("1.顺序查找n2.折半查找n");
scanf("%d",&choice);
printf("请输入关键码:n");
//scanf("%d,&k");
scanf("%d", &k);
switch(choice)
{
// printf("请输入关键码:n");
// scanf("%d,&k");
// case'1':
case 1:
//i=Seqsearch(L,k);
i=Seqsearch(&L,k);
printf("顺序查找只有一次n");
//if(i!=0)
if ( i != -1 )
printf("关键码的位置是第%d个",i+1);
//if("i=0")
else
printf("关键码不存在!");
break;
//case'2':
case 2:
//a=Binsearch(L,k);
a=Binsearch(&L,k);
printf("折半查找位置在%dn",a[0]+1);
printf("总共找了%d次n",a[1]+1);
break;
default:
printf("输入错误!结束进程!");
break;
}
//释放内存
if ( NULL != a )
{
delete[] a;
a = NULL;
}
return ;
}
解决方案二:
在creatKlist函数中 for(i=0;ilen;i++)少了个小于号,这里粘贴代码时,会吃掉那个小于号,好奇怪,嘿嘿
解决方案四:
你贴的这代码,有好多问题哦,在你代码的基础上我改了下,可以运行
#include
#define Max 256
typedef struct Keylist
{
int key[Max];
int len;
}Keylist;
//void creatKlist( Keylist L)
void creatKlist( Keylist* L)
{
int i=0;
printf("**建立静态表**n");
printf("你需要构建多少个数据,请输入:");
scanf("%d",&L->len);
printf("n");
for(i=0;ilen;i++)
{
printf("请输入100以内的数据n");
scanf("%d",&L->key[i]);
}
}
//这个函数如果是想用来排序,显然是不对的哦
Keylist sort(Keylist L)
{
int i,t;
//for(i=0;i {
for(i=0;i < L.len; ++i )
{
if(L.key[i]>L.key[i+1])
{
t=L.key[i];
L.key[i+1]=L.key[i];
L.key[i]=t;
}
}
return L;
}
//int Seqsearch(Keylist L,int k)
int Seqsearch(Keylist* L,int k)
{
// int i;
// for(i=L->len;L->key[i]!=k;i--)
// return i;
int i;
for(i=L->len-1;L->key[i]!=k && i >= 0;i--)
;
return i;
}
//int Binsearch(Keylist L,int k)
int *Binsearch(Keylist L,int k)
{
//int high=L->len,low=1,mid;
int high = L->len-1,low=0,mid;
//int a[1];
int* a = new int[2];
a[0] = 0;
a[1] = 0;
while(low<=high)
{
mid=(low+high)/2;
if(L->key[mid]==k)
{
a[0]=mid;
return a;
}
else if(L->key[mid]<k)
{
low=mid+1;
a[1]++;
}
else
{
high=mid-1;
a[1]++;
}
}
return a;
}
void main()
{
Keylist L;
//int a[1];
int* a = NULL;
//creatKlist( L );
creatKlist( &L );
int k,i,choice;
printf("请输入你想要执行的操作序号:n");
printf("1.顺序查找n2.折半查找n");
scanf("%d",&choice);
printf("请输入关键码:n");
//scanf("%d,&k");
scanf("%d", &k);
switch(choice)
{
// printf("请输入关键码:n");
// scanf("%d,&k");
// case'1':
case 1:
//i=Seqsearch(L,k);
i=Seqsearch(&L,k);
printf("顺序查找只有一次n");
//if(i!=0)
if ( i != -1 )
printf("关键码的位置是第%d个",i+1);
//if("i=0")
else
printf("关键码不存在!");
break;
//case'2':
case 2:
//a=Binsearch(L,k);
a=Binsearch(&L,k);
printf("折半查找位置在%dn",a[0]+1);
printf("总共找了%d次n",a[1]+1);
break;
default:
printf("输入错误!结束进程!");
break;
}
//释放内存
if ( NULL != a )
{
delete[] a;
a = NULL;
}
return ;
}