填空题
阅读以下函数说明和C语言函数,将应填入{{U}} (n) {{/U}}处的字句写在对应栏内。
[说明]
函数void diff(Node*A,Node*B,Node**r)的功能是:根据两个由整数按升序构成的单链表L1和L2(分别由A,B指向)构造一个单链表L3(由*r指向),要求L3中的所有整数都是L1,并且不是L2中的整数,还要求L3中的所有整数都两两不等。
[C函数]
#include<malloc.h>
typedef struct node {
int data;
struct node*next;
}Node;
void diff(Node*A,Node*B,Node**r)
{ int lastnum;
Node*P;
*r=NULL;
if(!A) return;
while({{U}} (1) {{/U}}>
if(A->data<B->data)
{lastnum=A->data;
p=(Node*)malloc(sizeof(Node));
P->data=lastnum;
P->next=*r;
{{U}} (2) {{/U}};
do
A=A->next;
while({{U}} (3) {{/U}}>;
}
else iffA->data>B->data)
B=B->next;
else{
{{U}} (4) {{/U}};
lastnum=A->data;
while (A &&A->data==lastnum)A=A->next;
}
while(A){
lastnum=A->data;
p=(Node*)malloc(sizeof(Node));
P->data=lastnum;
{{U}} (5) {{/U}};
*r=P;
while(A && A->data==lastnum) A=A->next;
}
}
【正确答案】
1、{{*HTML*}}A&&B (2) *r==p (3)
A&&A->data=lastnum (4) B=B->next (5) D->next==*r
【答案解析】
[解析]
程序的思路是:在链表A和链表B的指针均未到链尾时,从链表A取一个元素和链表B中第一个元素进行比较,所以(1)应填“A&&B”。如果链表A元素小于链表B的元素,则将链表A中元素直接插入链表C中,指针后移,则(2)填“*r=p”,在后移中屏蔽所有相同元素,则(3)应填“A&&A->data=lastnum”;如果链表A元素大于链表B的元素,将链表B指针后移;如果链表A元素等于链表B的元素,链表A和链表B的指针都向后移,即(4)填“B=B->next”。如果链表B已经到链尾,但链表A没有结束,则将链表A中的剩余元素加入到链表C中,所以(5)应填“p->next=*r”。