四、算法阅读题(本大题共4小题,每小题5分,共20分)
30.阅读下列算法,并回答问题:
(1)假设L=(3,7,7,11,20,20,20,51,51),写出执行函数f30(&L)后的L;
(2)简述f30的功能。
void f30(SeqList*L)
{ ∥L为非空的有序表
int i=1,k=0;
while(i<L->length)
{
if(L->data[i]!=L->data[k])
L->data[++k]=L->data[i];
i++;
}
L->length=k+1;
}
(1)
(2)
31.阅读下列算法,并回答问题:
(1)假设栈S=(3,8,6,2,5),其中5为栈顶元素,写出执行函数f31(&S)后的S;
(2)简述函数f31的功能。void f31(Stack *S){
Queue Q;InitQueue(&Q);
while(!StackEmpty(S))
EnQueue(&Q,Pop(&S));
while(!QueueEmpty(Q))
Push(&S,DeQueue(&Q));
}
(1)
(2)
32.假设具有n个结点的完全二叉树顺序存储在向量BT[1.. n]中,阅读下列算法,并回答问题:
(1)若向量BT为:
A B C D E F G
1 2 3 4 5 6 7
画出执行函数f32(BT,7,1)的返回结果;
(2)简述函数f32的功能。
BinTree f32(DataType BT[],int n,int i)
{
BinTree p;
if (i>n) return NULL;
p=(BinTNode*)malloc(sizeof(BinTNode));
p->data=BT[i];
p->lchild=f32(BT,n,i*2);
p->rchild=f32(BT,n,i*2+1);
return p;
}
(1)
(2)
33.已知有向图的邻接表和邻接矩阵定义如下:
﹟define MaxNum 50 ∥图的最大顶点数
typedef struct node {
int adjvex; ∥邻接点域
struct node *next; ∥链指针域
} EdgeNode; ∥边表结点结构
typedef struct{
char vertex; ∥顶点域
EdgeNode *firstedge; ∥边表头指针
} VertexNode; ∥顶点表结点结构
typedef struct {
VertexNode adjlist [MaxNum]; ∥邻接表
int n,e; ∥图中当前顶点数和边数
} ALGraph; ∥邻接表描述的图
typedef struct{
char vertex[MaxNum]; ∥顶点表
int adjmatrix [MaxNum][MaxNum]; ∥邻接矩阵
int n,e; ∥图中当前顶点数和边数
} AMGraph; ∥邻接矩阵描述的图
下列算法是将邻接表描述的图G1改为邻接矩阵描述的图G2,在空白处填上适当内容使算法完整:
void f33(ALGraph G1,AMGraph *G2)
{ int i, j;
EdgeNode *p;
G2->n=G1.n;
G2->e= (1) ;
for (i=0; i<G1.n; i++)
{ G2->vertex[i]= (2) ;
p=G1.adjlist[i].firstedge;
for (j=0; j<G1.n; j++) G2->adjmatrix[i][j]=0;
while (p)
{ G2->adjmatrix[i][p->adjvex]=1;
(3) ;
}
}
}
(1)
(2)
(3)
五、算法设计题(本题10分)
34.设顺序表L是一个递增有序表。编写算法,要求利用二分查找法确定插入位置,将元素x插入到L中,使L保持有序。