#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
*/