次移到数组A的前端Aii(0≤i≤ arraySize)。 【解答】 丙为数组是一种直接仔取的数据结构,数组中元素不是像顺序表那样集中存放于表 的前端,而是根据元素下标直接存放于数组某个位置,所以将作零元素前移时必须检测整个 效组空同.并将后面变成零元素的空间清零。函数中设置-个辅助指针fre,指示当前可存 放的位汽,初值为0。 先给出作为抽象数据类型数组的类声明 incluce <iostream. t-> 在头文件"aray.h const int Default Swze-30 template class Type class Array 数组是数据类型相同的n(sie)个元素的一个集合,卜标范围从)到n-1对数组中元素 可按下标所指小位置直接访间 数组 元茶个数 panic Array( inf Size= D]efauitSizc) 构造函数 Array(const Array<, Type 复制钩避雨数 Array()( delete r 7 eletment; 析构函数 rays:Iype>& operator=( const Array*Iype&a);数组氅体赋(复制) Iype operator I(int 1): 按下标访问数组元素 int f ength() const( return Array Sizc: y 取数组长度 void compact) 数组压缩 void ReSize( int z) 修改数组长度 template< class Type. void Arrays. Type compact()1 非零几素存放地址 for (int 1=0; i Arraysize 检测个数组 发现作零元东 erien free.I: elements[i7=u: 25顺序表的插入和删除要求仍然保持各个元素原来的次序,设在等概率情形下,对有 27个元素的顺序表进行檑人·平均需要移劬多少个儿素?删酴一个几紫,又平均需噶移 动多少个元素? 【解答】 设顺序表中已有H=1ast+1个元素,last足顺序表的数据成员,表明最后表填的位
置。又设插入或删除表中各个元素的概率相等,则在捅入时因有n+1个插入位置(可以在 表中最后一个表项后面追加)每个元素位置插入的慨率为1(n+1),但在删除时只能在已 有n个表项范围内删除,所以每个元素位置删除的概率为1 插入时平均移动元素个数AM、( Average Moving Nunber)为 AMN >(n-i) +1 n+1(n+(x=1)+…+1-0) n(n-1) 埘除时平均移动元素个数AMN为 AMN=1S(n-÷-1=1 ((n-1)-(n-2) 1-0) 1(n-1)n 根据上述推导,插入时平均移动127/2=63.5个元素,删除时平均移动(1?7-1)2 63个元素。 26若矩阵Ay,中的某一元素AL订是第i行中的最小值,同时又是第列中的最大值 则称此元素为该矩阵的一个鞍点。假设以二维数组存放矩阵.试编写一个函数,确定鞍点在 数组中的位置(若鞍点存在时),并分析该函数的时问复杂度 【解答】 int minmax(int A[ ]-], const int m, const int n)I 在二维数组A[m「m中求所有鞍点·它们满足在行中最小同吋在列中最大 int *row=new intn: int x col-new intn,; 在各行中选最小数组元素,有于rw「i for(j=l;i<N;jIT) if(A[iG] rowli|) rowi=ACGl; for(j0;j<n;j+)t 在各列中选最大数组元素存于cl1i col 11=A0JU for (i=];i<m:i+…) if (AQQ]u]>> col j1) col-AlJ] for(i=0: i< m; I+: 检測矩阵,寻找鞍点并输出其位置 for(j=0:j<<I; j if ( row. 11.=colli cout <c <The saddle poir delete [2 row delete ' cot 此算法有3个并列一重循环,其时间复杂度为O(mXn)
27设有一个二维数组A[m][n],假设A[0][0存放信置在644m,AL2][2有放位置在 67610,每个元素占个空间,问4333存放充什么位置?脚注表示用十进制表示。 【解答】 设数组元素A「i;存放在起始地址为Loc(i,j)的存储单元中 Ioc(2,2)=Loc(0,0)+2*n+2=644+2“n+2=676 ∴n=(676-2-614)2=15 Loc(3,3)=1oc(0,0)+3*15+3-644+15+3=692 28利用顺序表的操作,实现以下的函数 (1)从順序表中删除具有最小值的元素并山函数返回被删元素的值。空出的位置由最 后一个元素填补·若顺序表为空则显示出错信息并退出运行 (2)从顺序表中删除第;个元素并由数返叫被删元素的值。如果i不合理或顺序表 为空则显示出错信息并退出运行 (3)向顺序表中第i个位置插入一个新的元素x。如果i不合理则显示出错信息并退 出运行 (4)从顺序表中删除具有给定值x的所有元素 5)从顺序表中删除其值在给定值s与t之间(要求;小于1的所有元素,如果s或t不 合理或顺序表为空则显示出错信息并退出运行。 (6)从有序顺序表中删除其值在给定值s与!之问(要求丶小于t)的所有元素,如果s 或t不合理或顺序表为空则显示出错信息并退出运行 (7)将两个有序顺序表合并成个新的有序顺序表并由函数返回结果顺序表。 (8)从顺序表中删除所有其值重复的元素,使表中所有元素的值均不相同。 【解答】 顺序表的类定义 ifndef SEQLIST_H 定义在头文件“ segnis. h”中 t define SEQLIST_H /顷序表的存放数组 int MaxSize; /序表的墩大可容纳项数 顺序表当前已存表项的最后位置 序表的当前指针(最近处理的表项 Seqi ist(int MaxSize); 构造数 析构s数 int Maxl ength( )const t return MaxSize; y 求表的最大长度 int Length()const I return last-1: //计算表长度 int Find( Type x)const; 定位两数:找x位置,为当前表项 void L- ocate( int i)i i>>=0&&i<= last current=i: exit(1):H
/定位函数:第1项置为当前表项 //判断x是含在表中,不置为当前表项 Type GetData()( return current ==-1?NUL L: data[current]: 2 取当前表项的值 int Insert(Type x); //插人x在表当前表项之后,置为当前表项 int Append(type x); 迫加x到衣尾,置为当前表项 Type Remove () //删除当前表项,置下一表项为当前表项 取表中第一个表项的值,置为当前表项 Type* Next()( return current last ? &data[ ++current]: NULl; //取当前表項后继友项的值,置为当前表项 Type Prior()( return current >>0. &data cLERet 取当前表项前驱表项的值.置为当前表项 int IsEmpty()( return last 判断顺序表空否,空则返凹1;香卿返凹 int 1sFul()【 return last== MaxSize-1;}/判断序表满否·满则返凹1;否则返回0 (1)实现删除具有最小值元素的函数如下: template<Type > Type* De IMin( Seql ist<<Type>>*L)[ 空,中止操作返回 I cerr << l ist is Empty " <' endl: exit(1):y 假定0号元素的值最小 for( int i=1:i< ():1+-)【 循环,找具有最小值的元素 下-个表项定位为当前表项 if(< 让min记忆当前具最小值的元素 L-c>Re 定位↑min所在表项,删除之 (2)实现删除第i个元素的函数如下〔设第i个元素在data_i,i=0,1,…,las1): template" lype> Type x DelNo f i(Seql ist<Type>>* I, int t)( C>Length) 空或i不合理,中止操作 t cerr <<List is Empty or Parameter is out range!< endl; exit(1); I,->locate(i) 定位于第j个元索 删除 (3)实现向第i个位置插入一个新的元素x的函数如下(设第;个元素在data_4] Type> void Ins No f i(se if(L…> IsFull() 0i∷>=L-> length())1表满或参数i不合理,中止操作返回
定位于第i个元素 sert( x 在第1个位置插入 (4)从顺序表中删除具有给定值x的所有元素 template<Type>> void Delvalue( Seql ist< Type>*I,, Type x)( int i=0: Type while( i< L->Iength) ‘循环,寻找具有值x的元素并删除它 删除具有值x的元素 else( temp=L->>NexIo) (5)实现删除其值在给定值与t之间(要求s小于t)的所有元素的函数如下: template<Type>> void DelNo* sto ft(SeqList< Type >>L, Type 4. Type t)( cerr<<"List is empty or parameters are illegal: << endl; exit(1):A t i=0; Type temp=l.>>First() while( i<L->length) 循环,寻找介于s与「之间的元素并删除它 if(“temp>=s&&t"temp≤=t 删除满足条件的凡素 else( temp=L->Next(: i++: (6)实现从有序顺序表中删除其值在给定值与t之间的所有元素的函数如下: template<<Type>>void DelNo sto f tl(SeyI ist< Type>* I, Type s, Type ()4 i cerT <<"Iist is empty or paramcters are illegal! << endl; exit( 1):) int i=0; Type temp 循环,寻找值≥s的第一个兀素 /退出循环时,该元素成为当前表项 clse f temp=I->>Nexto):i+I;A /′否则,继续寻找 d L->Remove(): temp-L->>GetData():t (7)实现将两个有序顺序表合并成一个新的有序顺序表均函数如下 template<Type>Seqlist<< Type> Merge(SeqList<Type>> A. Seql-ist<Type. > B) ∥合并有序顺序表A与B成为…↑新的有序顺序表并由函数返回 SeqLisI<Type>> temp f cerr << The summary of The length of L ists is out MaxSt Type value]=A First(;,*value2=B First()