#include
<
iostream
.h
>
#define MaxSize 30 //MaxSize为事先定义的整型常量,它要大于等于主表中元素的个数n
#define ILMSize 10 //ILMSize为事先定义的整型常量,它要大于等于索引项数m
typedef int IndexKeyType;
typedef int KeyType;
struct ElemType
{
int key;
};
struct IndexItem
{
IndexKeyType index;//IndexKeyType为事先定义的索引值类型
int start;//子表中第一个元素所在的下标位置
int length;//子表的长度域
};
typedef IndexItem indexlist[ILMSize];//ILMSize为事先定义的整型常量,它要大于等于索引项数m
typedef ElemType mainlist[MaxSize];//MaxSize为事先定义的整型常量,它要大于等于主表中元素的个数n
Indsch(mainlist A,indexlist B,int m,IndexKeyType k1,KeyType k2)
//利用主表A和大小为m的索引表B索引查找索引值为k1,关键字为k2
//的记录,返回该记录在主表中的下标位置,若查找失败则返回-1
{
int i,j;
//在索引表中顺序查找索引值为k1的索引项
for(i=0;i < m ;i++)
if(k1 ==B[i].index)//若IndexKeyType被定义为字符串
//类型,则条件应改为strcmp(k1,B[i].index) ==0
break;
//若i等于m,则表明查找失败,返回-1
if(i ==m)
return -1;
//在已经查找到的第i个子表中顺序查找关键字为k2的记录
j =B[i].start;
while(j<B[i].start+B[i].length)
if(k2 ==A[j].key)//若KeyType被定义为字符串
//类型,则条件应改为strcmp(k2,A[j].key) ==0
break;
else
j++;
//若查找成功则返回元素的下标位置,否则返回-1
if(j<B[i].start+B[i].length)
return j;
else
return -1;
}
void main()
{
int i;
int m =3;//索引项的个数,这里假设将主表分表三块,则有三个索引项
int mlnum =15;//主表中元素的个数
indexlist B;
mainlist A;
cout<<"输入主表中的"<<mlnum<<"个元素"<<endl;
for(i =0;i<mlnum;i++)
cin > >A[i].key;
cout < <"输入"<<m <<"个索引项(索引值、子表中第一个元素所在的下标位置、子表的长度域:"<<endl;
cout<<"这里用n表示第n块"<<endl;
for(i =0;i<m;i++)
cin > >B[i].index>>B[i].start>>B[i].length;
cout < <"输入块号k1 和要查找的关键字k2:"<<endl;
int k1,k2;
cin > >k1>>k2;
int findindex=Indsch(A,B,m,k1,k2);
if(findindex!=-1)
cout < <"找到,下标:"<<findindex <<"值为:"<<A[findindex].key<<endl;
else
cout<<"找不到"<<endl;
}
//测试用例
/*
输入主表中的15个元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
输入3个索引项(索引值、子表中第一个元素所在的下标位置、子表的长度域:
这里用n表示第n块
1 0 5
2 5 5
3 10 5
输入块号k1和要查找的关键字k2:
2 8
找到,下标:7值为:8
*/
/*
http://java2.xinwen365.net
QQ群:
34409541 讨论网页
34409326 讨论JAVA 已满
34408784 讨论VC++
34409699 讨论VC++
9143041 讨论MFC编程
10614204 讨论C#
10613030 讨论Win32编程
10613067 讨论游戏开发
18779860 讨论JAVA
*/
#define MaxSize 30 //MaxSize为事先定义的整型常量,它要大于等于主表中元素的个数n
#define ILMSize 10 //ILMSize为事先定义的整型常量,它要大于等于索引项数m
typedef int IndexKeyType;
typedef int KeyType;
struct ElemType
{
int key;
};
struct IndexItem
{
IndexKeyType index;//IndexKeyType为事先定义的索引值类型
int start;//子表中第一个元素所在的下标位置
int length;//子表的长度域
};
typedef IndexItem indexlist[ILMSize];//ILMSize为事先定义的整型常量,它要大于等于索引项数m
typedef ElemType mainlist[MaxSize];//MaxSize为事先定义的整型常量,它要大于等于主表中元素的个数n
Indsch(mainlist A,indexlist B,int m,IndexKeyType k1,KeyType k2)
//利用主表A和大小为m的索引表B索引查找索引值为k1,关键字为k2
//的记录,返回该记录在主表中的下标位置,若查找失败则返回-1
{
int i,j;
//在索引表中顺序查找索引值为k1的索引项
for(i=0;i < m ;i++)
if(k1 ==B[i].index)//若IndexKeyType被定义为字符串
//类型,则条件应改为strcmp(k1,B[i].index) ==0
break;
//若i等于m,则表明查找失败,返回-1
if(i ==m)
return -1;
//在已经查找到的第i个子表中顺序查找关键字为k2的记录
j =B[i].start;
while(j<B[i].start+B[i].length)
if(k2 ==A[j].key)//若KeyType被定义为字符串
//类型,则条件应改为strcmp(k2,A[j].key) ==0
break;
else
j++;
//若查找成功则返回元素的下标位置,否则返回-1
if(j<B[i].start+B[i].length)
return j;
else
return -1;
}
void main()
{
int i;
int m =3;//索引项的个数,这里假设将主表分表三块,则有三个索引项
int mlnum =15;//主表中元素的个数
indexlist B;
mainlist A;
cout<<"输入主表中的"<<mlnum<<"个元素"<<endl;
for(i =0;i<mlnum;i++)
cin > >A[i].key;
cout < <"输入"<<m <<"个索引项(索引值、子表中第一个元素所在的下标位置、子表的长度域:"<<endl;
cout<<"这里用n表示第n块"<<endl;
for(i =0;i<m;i++)
cin > >B[i].index>>B[i].start>>B[i].length;
cout < <"输入块号k1 和要查找的关键字k2:"<<endl;
int k1,k2;
cin > >k1>>k2;
int findindex=Indsch(A,B,m,k1,k2);
if(findindex!=-1)
cout < <"找到,下标:"<<findindex <<"值为:"<<A[findindex].key<<endl;
else
cout<<"找不到"<<endl;
}
//测试用例
/*
输入主表中的15个元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
输入3个索引项(索引值、子表中第一个元素所在的下标位置、子表的长度域:
这里用n表示第n块
1 0 5
2 5 5
3 10 5
输入块号k1和要查找的关键字k2:
2 8
找到,下标:7值为:8
*/
/*
http://java2.xinwen365.net
QQ群:
34409541 讨论网页
34409326 讨论JAVA 已满
34408784 讨论VC++
34409699 讨论VC++
9143041 讨论MFC编程
10614204 讨论C#
10613030 讨论Win32编程
10613067 讨论游戏开发
18779860 讨论JAVA
*/