vc6.0调试时出现的问题
是关于分块查找表的,在vc6.0下出现两个警告:d:\学习资料\计算机\经典算法\hope2\格式2.cpp(15) : warning C4091: 'typedef ' : ignored on left of 'struct datatype' when no variable is declared
d:\学习资料\计算机\经典算法\hope2\格式2.cpp(95) : warning C4715: 'Bi_search' : not all control paths return a value
然后我没管它直接运行,测试数据如下:
16
12 22 13 18 28 33 38 42 87 76 50 63 99 101 97 96
4
然后查找12、22、13、18都没问题,从28开始就显示“内存出错”。
求哪位大神指教。
源代码如下:
#include<iostream>
using namespace std;
typedef struct node
{
int key;
int max;
}index;
typedef struct datatype
{
int key;
};
void creat_primary_table(datatype s[],int n)
{
cout<<"请输入元素: " ;
int num;
for(int i=0;i<=n-1;i++)
{
cin>>num;
s[i].key=num;
}
cout<<"主表建立成功";
}
void creat_index_table(datatype *s , int n , index *index,int &m ,int L)
{
int keynum=n/L;
for(m=0; m<L; m++)
{
index[m].key=s[m*keynum].key;
for(int i=m*keynum;i<=m*keynum+keynum-1;i++)
if(index[m].key<s[i].key)
{
index[m].key=s[i].key ;
index[m].max=i;
}
}
cout<<"索引表建立成功";
}
int Bi_search(index *index,datatype *s,int m,int keynum,int key)
{
int low=0,high=m-1,mid=(low+high)/2;
while(low<=high && high>-1)
{
if(index[mid].key==key)
{
high=mid;
break;
}
else if(key<index[mid].key)
{
high=mid-1;
}
else
{
low=mid+1;
}
mid=(low+high)/2;
}
int i=0,j;
if(key>index[mid].key)
{
i=index[mid+1].max;
}
else
{
i=index[mid].max;
i=i/keynum+1;
}
for(j=i*keynum-keynum;j<i*keynum && j<m*keynum ;j++)
{
if(key==s[j].key)
{
return j ;
}
if(j>=m*keynum ||j>i*keynum-1 )
{
cout<<"未找到该元素";
return -1;
}
}
}
int main(void)
{
int n=0,m=0,L=0;
int i;
cout<<"请输入元素总个数: ";
cin>>n;
datatype s[50];
index index[50];
creat_primary_table(s,n);
cout<<"创建的主表为";
for(i=0;i<=n-1;i++)
{
cout<<s[i].key<<" ";
}
cout<<endl<<"请输入需要所分的块数: ";
cin>>L;
creat_index_table( s , n , index , m ,L );
cout<<"创建的索引表为";
for(i=0;i<=m-1;i++)
{
cout<<index[i].key<<" ";
}
int key,subcript;
cout<<endl<<"请输入要查询元素(以-1 退出:) " ;
cin>>key;
while(key!=-1)
{
subcript=Bi_search(index,s,m,n/L,key);
if(subcript!=-1)
{
cout<<"查询元素"<<s[subcript].key<<"的下标为:"<<subcript;
cout<<endl<<"请输入要查询元素(以-1 退出)" ;
cin>>key;
}
}
system("pause");
return 0;
}