[说明]
函数diff的功能是:根据两个由整数(都大于-32768)按升序构成的单链表L1和L2(分别由A,B指向)构造一个单链表L3(由*r指向),要求L3中的所有整数都是L1并且不是L2中的整数,还要求L3中的所有整数都两两不等。
[函数]
#include <malloc.h>
typedef struct node
int d;
struct node *next
Node;
void diff (Node *A, Node *B, Node **r)
int lastnum;
Node *p;
* r=NULL ;
if (!A) return;
while( (1) )
if (A->d < B->d)
lastnum=A->d;
p=(Node*) malloc (sizeof (Node)) ;
p->d=lastnum;
p->next=*r; (2) ;
do
A=A->next ;
while( (3) );
else if (A->d> B->d)
B=B->next ;
else
(4) ;
lastnum=A->d;
while (A&&A->d==last num) A=A->next ;
while (A)
lastnum=A->d;
p=(Node*) malloc (sizeof (Node)) ;
p->d=lastnum;
(5) ;
*r=p;
while(A&&A->d==lastnum) A=A->next;
参考答案:p->next=*r
解析: 函数的功能在函数说明已经讲得很清楚了,这里就不再重复了。程序的思路是:从链表A取一个元素和链表B中第一个元素进行比较,如果链表A元素小于链表B的元素,则将链表A中元素插入到链表C中,指针后移,在后移时要屏蔽所有相同元素; 如果链表A元素大于链表B的元素,将链表B指针后移; 如果链表A元素等于链表B的元素,链表A和链表B的指针都向后移,而且要屏蔽链表A中所有相同元素。当链表A和链表B都没有结束时,循环执行上述操作。如果链表B已经到链尾,但链表A没有结束,则将链表A中的剩余元素加入到链表C中,同时也要屏蔽所有相同元素。
根据上面的分析,空(1)处需要填写循环条件,显然是链表A没有结束而且链表B也没有结束,即“A!=NULL&&B!=NULL”或A&&B或其等价形式。
至(2)所在的语句块是处理链表A元素小于链表B的元素的情况,需要将链表A中元素插入到链表C中,在它的前一条语句已经把这个结点后继指针指向链表C的第一个结点,这里需要将链表C的第一个结点设置成该结点,即“*r=p”。
空(3)处所在do...while循环的目的是屏蔽所有相同元素,需要写出这个循环的条件,显然是当一个结点的值不等于刚刚插入的结点的值或链表A已经到了链尾时就要退出循环。因此空(3)处应填写“A&&A->d= =lastnum”及其等价形式。
空(4)所在语句块是处理链表A元素等于链表B元素的情况,链表A和链表B的指针都向后移,而且要屏蔽链表A中所有相同元素。链表A的指针向后移已经写出,因此,空(4)应填写“B=B->next”。
至(5)所在while循环是处理链表B已经到链尾,但链表A没有结束的情况。这时需要将链表A中的剩余元素加入到链表C中,插入的方法和空(2)处所在语句块插入方法一致。空(5)需将要插入结点的指针域指向链表C的头指针*r,因此空(5)处应填写“p->next=*r”。