M L= P;
(3) D
(4) D
(5) D
(6) A
7 试分别以不同的存储结构实现单线表的就地逆置算法,即在原表的存储空间将线性表
(a
1
,a
2
,…,a
n
)逆置为(a
n
,a
n-1
,…,a
1
)。
【解答】(1)用一维数组作为存储结构
void invert(SeqList *L, int *num)
{
int j;
ElemType tmp;
for(j=0;j<=(*num-1)/2;j++)
{ tmp=L[j];
L[j]=L[*num-j-1];
L[*num-j-1]=tmp;}
}
(2)用单链表作为存储结构
void invert(LinkList L)
{
Node *p, *q, *r;
if(L->next ==NULL) return; /*链表为空*/
p=L->next;
q=p->next;
p->next=NULL; /* 摘下第一个结点,生成初始逆置表
*/
while(q!=NULL) /* 从第二个结点起依次头插入当前逆置表
*/
{
r=q->next;
q->next=L->next;
L->next=q;
q=r;
}
}
11 将 线 性 表 A=(a1,a2,……am), B=(b1,b2,……bn) 合 并 成 线 性 表 C, C=(a1,b1,……
am,bm,bm+1,…….bn) 当 m<=n 时,或
C=(a1,b1, ……an,bn,an+1,……am)当 m>n 时,线
性表 A、B、C 以单链表作为存储结构,且 C 表利用 A 表和 B 表中的结点空间构成。注意:
单链表的长度值 m 和 n 均未显式存储。
【解答】算法如下:
LinkList merge(LinkList A, LinkList B, LinkList C)
{ Node *pa, *qa, *pb, *qb, *p;
pa=A->next; /*pa 表示 A 的当前结点*/
pb=B->next;
p=A; / *利用 p 来指向新连接的表的表尾,初始值指向表 A 的头结点*/
while(pa!=NULL && pb!=NULL) /*利用尾插法建立连接之后的链表*/
{ qa=pa->next;
qb=qb->next;
p->next=pa; /*交替选择表 A 和表 B 中的结点连接到新链表中;*/
p=pa;
p->next=pb;
p=pb;
pa=qa;
3