#include < iostream .h > #define MaxSize 30 //MaxSize为事先定义的整型常量,它要大于等于主表中元素的个数n#define ILMSize 10 //ILMSize为事先定义的整型常量,它要大于等于索引项数mtypedef int IndexKeyType;typedef int KeyType;struct ElemType{ int key;};struct IndexItem{ IndexKeyType index;//IndexKeyType为事先定义的索引值类型 int start;//子表中第一个元素所在的下标位置 int length;//子表的长度域};typedef IndexItem indexlist[ILMSize];//ILMSize为事先定义的整型常量,它要大于等于索引项数mtypedef ElemType mainlist[MaxSize];//MaxSize为事先定义的整型常量,它要大于等于主表中元素的个数nint Blocksch(mainlist A,indexlist B,int m,KeyType k) //利用主表A和大小为m的索引表B分块查找关键字为k的记录{ int i,j; //在索引表中顺序查找关键字为k所对应的索引项 for(i=0;i < m ;i++) if(k< =B[i].index) break; //若i等于m,则表明查找失败,返回-1 if(i ==m) return -1; //在已经查找到的第i个子表中顺序查找关键字为k的记录 j =B[i].start; while(j<B[i].start+B[i].length) if(k ==A[j].key) 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; int k; cout < <"输入要查找的数"<<endl ; cin > >k; int findindex=Blocksch(A,B,m,k); if(findindex!=-1) cout < <"找到,下标为: "<<findindex<<"值为:"<<A[findindex].key<<endl; else cout<<"没找到"<<endl; }//测试用例/*输入主表中的(子表中元素要满足块间有序:我们这里设升序,块内无序)15个元素1 4 2 3 5 10 6 9 8 7 11 15 13 12 10输入3个索引项(索引值:保存第个块的最大值,这里我们按升序排列、子表中第一个元素所在的下标位置、子表的长度域:这里用n表示第n块5 0 510 5 515 10 5输入要查找的数12找到,下标为:13值为:12*//*http://java2.xinwen365.netQQ群:34409541 讨论网页 34409326 讨论JAVA 已满 34408784 讨论VC++ 34409699 讨论VC++ 9143041 讨论MFC编程 10614204 讨论C# 10613030 讨论Win32编程 10613067 讨论游戏开发 18779860 讨论JAVA */