阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。 【说明】 函数diff的功能是:根据两个由整数(都大于-32768)按升序构成的单链表L1和L2(分别由A,B指向)构造一个单链表L3(由*r指向),要求13中的所有整数都是L1,并且不

admin2009-02-15  33

问题 阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。
【说明】
   函数diff的功能是:根据两个由整数(都大于-32768)按升序构成的单链表L1和L2(分别由A,B指向)构造一个单链表L3(由*r指向),要求13中的所有整数都是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 = = lastnum) 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;
       }
   }

选项

答案(1)A&&B (2)*r=p (3)A&&A->d==lastnum (4)B=B->next (5)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”或其等价形式。
   (2)空所在的语句块是处理链表A元素小于链表B的元素的情况,需要将链表A中元素插入到链表C中,在它的前一条语句已经把这个结点后继指针指向链表C的第一个结点,这里需要将链表C的第一个结点设置成该结点,即“*r=p”。
   (3)空处所在do…while循环的目的是屏蔽所有相同元素,需要写出这个循环的条件,显然是当一个结点的值不等于刚刚插入的结点的值或链表A已经到了链尾时就要退出循环。因此(3)空处应填写“A! =NULL&&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”。
转载请注明原文地址:https://jikaoti.com/ti/RrW7FFFM
0

最新回复(0)