问答题

【函数1说明】
函数compare(SqList A, SqList B)的功能是:设A=(al,…,am)和B=(b1,…,bn)均为顺序表,“比较”,两个顺序表A和B的大小。设A’ 和B’ 分别为A和B中除去最大共同前缀后的子表(例如,A=(y,x,x,z,x,z),B=(y,x,x,2,y,x,x,z),则两者中最大的共同前缀为 (y,x,x,z),在两表中除去最大共同前缀后的子表分别为A’=(x,z)和B’=(y,x,x,z))。若 A’=B’=空表,则A=B;若A’=空表,而B’≠空表,或者两者均不为空表,且A’的首元小于 B’首元,则A<B:否则A>B。
提示:算法的基本思想为:若相等,则j+1,之后继续比较后继元素;否则即可得出比较结果。显然,j的初值应为0,循环的条件是j不超出其中任何一个表的范围。若在循环内不能得出比较结果,则循环结束时有3种可能出现的情况需要区分。
【函数1】
int compare ( SqListA, SqList B)
{
//若A<B,则返回-1;若A=B,则返回0:若A>B,则返回1
j =0;
while(i< (1) &&j<B. length)
if(A. elem[j] < B. elem[j] )return(-1)
else if(A. elem[j] > B. elem[j] )return(1);
else (2) ;
if(A. length == B. length) return(0);
else if(A. length<B. length)return(-1);
else return(1)
}//compare
//函数1的时间复杂度是 (3)
【函数2说明】
函数exchanse_L(SLnk&L,int m)的功能是:用尽可能少的辅助空间将单链表中前m个结点和后n个结点的互换。即将单链表(a1、a2…,am,b1,b2,…,bn)改变成(b1,b2,…,bn,a1, a2,…,am,)。
【函数2】
void exchange_L(SLink &L, int m)
{
if( (4) &&L->next) //链表不空且Lm!=0
{
P = L->next; k=1;
while( k < m&&p) //查找am,所在结点
{
P= (5) ;++k;
}
if( (6) &&p->next) //n! =0 时才需要修改指针
ha = L -> next; //以指针ha记a1结点的位置
L -> next = p -> next; //将B1结点链接在头结点之后
p -> next = NULL; //设am的后继为空
q= (7) ; //令q指向b1结点
while(q->next)q = (8) ; //查找bn结点
q->>next= (9) ; //将a1结点链接到bn结点之后
}
}
}
//函数2的时间复杂度是 (10)

【参考答案】

(1)A. length (2)j++ (3)O(Min(A. length,B. length))
(4)m ......

(↓↓↓ 点击下方‘点击查看答案’看完整答案 ↓↓↓)
热门 试题

问答题
【说明】 本题将有向网(带权有向图)定义为类Adjacency WDigraph。类中的数据成员n表示有向网中的顶点数;a为带权邻接矩阵,用于存储有向网中每一对顶点间弧上的权值;c为二维数组,存储有向网中每一对顶点间的最短路径长度;kay为二维数组,存储最短路径,kay[i][j]=k表示顶点i到达顶点j的最短路径必须经过顶点k。类中的主要成员函数有: Input():输入有向网的顶点数、各条弧及权值,建立带权领接矩阵a。若顶点i到顶点j有弧,则a[i][j]取弧上的权值,否则a[i][j]的值取NoEdge。 AllPairs();用弗洛伊德(Floyd)算法求有向网中每一对顶点间的最短路径长度。 OutShortestPath (int i, int j:计算顶点i到顶点j的最短路径。 outputPath(int i, int j):输出顶点i到顶点j的最短路径上的顶点。 Floyd算法的基本思想是递推地产生一个矩阵序列C0,C1,C2,…,Cn,其中C0是已知的带权邻接矩阵,a,Ck(i, j(0≤i,j<)表示从顶点i到顶点j的中间顶点序号不大于k的最短路径长度。如果i到j的路径没有中间顶点,则对于0≤k<n,有Ck(i,j)=C0(i,j)= a[i][j]。递推地产生C1,C2,…,Cn的过程就是逐步将可能是最短路径上的顶点作为路径上的中间顶点进行试探,直到为全部路径都找遍了所有可能成为最短路径上的中间顶点,所有的最短路径也就全部求出,算法就此结束。【C++代码】#include < iostream. h >#define NoEdge 10000 当两个顶点之间没有边相连时,在邻接矩阵中用NoEdge表示void Make2DArray(int * * &x, int rows, int cols);class AdjacencyWDigraph {private int n; 有向网中的顶点数目 int* *a; 存储顶点间弧上的权值 int* *c; 存储计算出的最短路径长度 int* * kay; 存储求出的最短路径pubic: int Vertices( )const j return n;} void AllPairs( ); void Input( ); 输入有向网的顶点数、各条弧及权值,建立邻接矩阵a void OutShortestPath(int i, int j); 计算顶点i到j的最短路径(试卷中未列出) ~ AdjacencyWDigraph ( ); 析构函数(试卷中未列出)private: void outputPath(int i, int j);};void AdjacencyWDigraph: :AllPairs( ) int i,j,k,t1,t2,t3; for(i=1;i<=n; k++) for(j=1;j<=n; ++j) {c[i][j]= (1) ; kay[i][j]=0;} for(k=1;k<=n; k++) for(i=1;i<=n; i++){ if(i= =k) continue; t1=c[i][k]; for(j=1;j<=n; j++){ if(j==k||j==i) continue; t2 =c[k] [j]; t3 =c[i] [j]; if( t1 ! = NoEdge && t2! = NoEdge &&(t3==NoEdge || t1+t2<t3) ) {c[i][j]= (2) ;kay[i][j]= (3) ;} } for } forvoid AdjacencyWDigraph:: outputPath(int i, int j){ 输出顶点i到j的最短路径上的顶点 if(i==j) return; if(kay[i] [j]==0)cout<<j << ; else { outputPath(i, (4) ); outputPath( (5) );}}void Adjacency WDigraph: :lnput( ){int i,j,u,v,w,E;cout << 输入网中顶点个数: ;cin> >n;cout << 输入网中弧的个数: ; cin> >E;Make2DArray (a, n+1, n+1);for(i=1;i<=n; i++) for(j=1; j<=n; j++) a[i][j]=NoEdge;for(i=1;i< =n; i++) a[i][i]=0;Make2DArray(c, n+1, n+1);Make2DArray(kay, n+1, n+1)for(i=1;i<=E; i++){cout<< 输入弧的信息(起点终点权值); ; cin> >u> >v> >w; a[u][v] =w;}}void Make2DArray(int * * &x, int rows, int cols){ int i,j;x=new int* [rows+1];for(i=0;i<rows+1;i ++ ) x[i]=new int [cols+1];for(i=1;i<= rows; i ++) for(j=1;j<=cols; j++) x[i][j]=0;