阅读下列函数说明和C函数,将应填入______处的语句写在答题纸的对应栏内。 [函数6说明] 函数DelA_InsB(LinkedList La,LinkedList Lb,int key1,int key2,int len)的功能是:将线性表

admin2007-03-10  52

问题 阅读下列函数说明和C函数,将应填入______处的语句写在答题纸的对应栏内。
   [函数6说明]
   函数DelA_InsB(LinkedList La,LinkedList Lb,int key1,int key2,int len)的功能是:将线性表A中关键码为key1的结点开始的len个结点,按原顺序移至线性表B中关键码为key2的结点之前,若移动成功,则返回0;否则返回-1。线性表的存储结构为带头结点的单链表,La为表A的头指针,Lb为表B的头指针。单链表结点的类型定义为:
   typedef struct node {
         int key;
         struct node * next;
   } * LinkedList;
   [函数6]
   int DelA InsB(LinkedList La,LinkedList Lb,int key1,int key2,int len)
   { LinkedListp,q,s,prep,pres;
   int k;
   if(! La->next‖! Lb->next‖->next‖len<=0)return-1;
   p=La->next;prep=La;
   while(p&&p->key!=key1){                      / * 查找表A中键值为key1的结点 * /
   prep=p;p=p->next;
   }
   if(! p)return -1;                            / * 表A中不存在键值为key1的结点 * /
   q=p;k=1;
   while(q&&  (1)  ){                            / * 在表A中找出待删除的len个结点 * /
       (2);k++;
   }
   if(! q)return-1:                             / * 表A中不存在要被删除的len个结点 * /
   s=Lb->next;  (3);
   while(s s && s->key!=key2){                  / * 查找表B中键值为key2的结点 * /
        pres=s;s=s->next;
   }
   if(! s)return-1;                             / * 表B中不存在键值为key2的结点 * /
     (4)=q->next;                            / * 将表A中的len个结点删除 * /
   q->next=(5);
   pres->next=p;                               / * 将len个结点移至表B * /
   return 0;
   }

选项

答案(1)k<len (2)q=q->next (3)pres=Lb (4)prep->next (5)s或pres->next

解析 本题是在链表插入和删除单个结点的基础上进行扩展,一次性插入多个结点和删除多个结点其原理和插入、删除一个结点的运算是一致的。首先在A链表中查找键值为key1的结点,使用了下列循环:
   While(p&&p->key!=key1) {        / * 查找表A中键值为key1的结点 * /
       Prep=p;p=p->next;
   }因此,当找到键值为key1的结点时,p指向该结点,prep指向p的前驱。然后看在p的后面是否有len个结点,使用了下列语句:
   q=p;k=1;
   while(q&&(1)) {              / * 在表A中找出待删除的len个结点 * /
     (2);k++;
   }显然,首先把q指向p,k为计数器,所以该循环的结束条件有2个,一个是p的后面没有 len个结点,这时q为空,所以(2)空应填写q=q->next,使q的指针往后移动;另一个是 p的后面有len个结点,这时k=len。所以(1)空应填写k<len。
   根据上面的语句,如果p的后面有len个结点,则q指向第len个结点。如图2-2所示(虚线表示省略了中间若干个结点)。
   
   同样,在表B中查找键值为key2的结点,使用了下列循环:
   s=Lb->next;(3);
   while(s&&s->key!=key2){          / * 查找表B中键值为key2的结点 * /
       pres=s;s=s->next;
   }首先,s指向第一个结点,然后进行循环,循环的结束条件也是2个,要么s为空(这时说明从头到尾都没有找到键值为key2的结点),要么找到了,s指向该结点,pres指向s的前驱。但是,如果第一个结点的键值就是key2的话,根据循环条件,循环中的语句不执行,则pres没有值,所以(3)空应该填写pres=Lb,使pres始终指向s的前驱。如图2-3所示 (虚线表示省略了中间若干个结点)。
   最后将p到q的连续len个结点从A表中删除,在B表中插入,如图2-4所示。
   程序中使用的语句如下:
   
     (4)=q->next;          / * 将表A中的len个结点删除 * /
   q->next=(5);
   pres->next=p;             / * 将len个结点移至表B * /
   要把p到q的连续len个结点从A表中删除,就要把p的前驱(prep)的next指向q的next,因此,(4)空应填写prep->next。然后把q的next指向B表中s,把s的前驱 (pres)的next指向p,所以,(5)空应填写s。
转载请注明原文地址:https://jikaoti.com/ti/1eW7FFFM
0

最新回复(0)