问题 问答题

阅读下列说明和C函数,在(n)处填入适当的字句。

[说明]

已知集合A和B的元素分别用不含头节点的单链表存储,函数Difference()用于求解集合A与B的差集,并将结果保存在集合A的单链表中。例如,若集合A=5,10,20,15,25,30,集合B=5,15,35,25,如图8.13(a)所示,运算完成后的结果如图8.13(b)所示。

链表节点的结构类型定义如下。

typedef struct Node

ElemType elem;

struct Node *next;

NodeType;

[C函数]

void Difference(NodeType **LA, NodeType *LB)

NodeType *pa, *pb. *pre, *q;

pre=NULL;

(1) ;

while (pa)

pb=LB;

while ( (2) )

pb=pb->next;

if( (3) )

if (!pre)

*LA= (4) ;

else

(5) =pa->next;

q= pa;

pa= pa->next;

free (q) ;

else

(6) ;

pa = pa->nex七;

 

答案

参考答案:

(1) pa=*LA (2) pb&&pb->elem!=pa->elem (3) pb

(4) pa->next或(*pa).next或*pa.next

(5) pre->next或(*pre).next或*pre.next (6) pre=pa

解析:

[分析]:

该题是一道C语言程序题。题目考查数据结构当中的链表操作。程序要实现的功能比较简单,即从链表A中,去除链表A和链表B均有的公共元素。其中的填空主要是对链表的一些基本操作,如:在链表中查询元素,将一个节点从链表中删除,及对此操作时需要注意的一些细节。只要掌握了链表基本操作,解本题还是非常容易的。

程序中的第(1)空是对pa的赋值,结合算法分析可知,pa应指向链表A的首指针。

第(2)空对应的while循环的作用是在B链表中查找与A链表当前节点值相等的节点,所以循环结束条件有两个:一是B链表已查询完毕,即pb为NULL;二是找到与A链表当前节点值相等的节点(pb->elem= =pa->elem)。所以应该填写:pb&&pb->elem !=pa->elem。

从算法分析可知,第(3)空所做的if语句的真分支是将链表A当前节点删除的操作,这表明此时在B中找到了与A链表相等的节点,结合第(2)空的分析可知第(3)空应该填写pb。

第(4)空和第(5)空是处理删除节点的两种情况,当需要删除的节点是链表首节点时,删除该节点只要将链表头指针直接指向当前节点的next域即可,所以笫(4)空填写:pa->next或(*pa).next或*pa.next;当需要删除的节点是链表的中间节点时,则将当前节点的前驱节点next域指向当前节点的后继节点,所以第(5)空填写:pre->next或(*pre).next或*pre.next。

第(4)空前面用到了pa的前驱节点pre进行相应的操作,为了保证pre始终指向pa的前驱节点。pre的值是随pa的值的变化l面变化的,当pa指向下一个节点时,pre应指向pa的当前节点,所以第(6)空应填写:pre=pa。

单项选择题
判断题