阅读以下说明和C函数,填补C函数中的空缺(1)~(5),将解答写在答题纸的对应栏内。 【说明】 函数SetDiff(LA,LB)的功能是将LA与LB中的共有元素从LA中删除,使得LA中仅保留与LB不同的元素,而LB不变,LA和LB为含头结点

admin2013-07-03  32

问题 阅读以下说明和C函数,填补C函数中的空缺(1)~(5),将解答写在答题纸的对应栏内。
    【说明】
    函数SetDiff(LA,LB)的功能是将LA与LB中的共有元素从LA中删除,使得LA中仅保留与LB不同的元素,而LB不变,LA和LB为含头结点的单链表的头指针。
    例如,单链表LA、LB的示例如下图中的(a)、(b)所示,删除与LB共有的元素后的LA如下图中的(c)所示。
   
    链表的结点类型定义如下:
    typedef struct Node{
      int data:
      struct Node*next:
    }Node,*LinkList;
    函数SetDiff(LinkList LA,LinkList LB)的处理思路如下:
    (1)从LA的第一个元素结点开始,令LA的第一个元素为当前元素;
    (2)在LB中进行顺序查找,查找与LA的当前元素相同者,方法是:令LA的当前元素先与LB的第一个元素进行比较,若相等,则结束在LB中的查找过程,否则继续与LB的下一个元素比较,重复以上过程,直到LB中的某一个元素与LA的当前元素相等(表明查找成功),或者到达LB的表尾(表明查找失败)为止;
    (3)结束在LB表的一次查找后,若在LB中发现了与LA的当前元素相同者,则删除LA的当前元素,否则,保留LA的当前元素;
    (4)取LA的下一个元素为当前元素,重复步骤(2)、(3),直到LA的表尾。
    【C函数】
    void SetDJ.ff(LinkLJ st LA,LinkLi st LB)
{
  LinkList pre,pa,pb;
  /*pa用于指向单链表LA的当前元素结点,pre指向pa所指元素的前驱*/
  /*pb用于指向单链表LB的元素结点*/
        (1)  ;/*开始时令pa指向LA的第一个元素*/
  pre:  LA;
  while(pa){
   pb=LB->next;
    /*在LB中查找与LA的当前元素相同者,直到找到或者到达表尾*/
    while(  (2)  ){
       if(pa->data= =pb->data)
         break;
      (3)  
    }

    if(!pb){
    /*若在LB中没有找到与LA中当前元素相同者,则继续考查LA的后续元素*/
    pre=pa;
    pa=pa->next;
    }
else{
    /*若在LB中找到与LA的当前元素相同者,则删除LA的当前元素*/
    pre->next=  (4)  
    free(pa);
    pa=    (5)   
    }
  }
}

选项

答案(1)pa=LA->next (2)pb!=NULL或pb或其等价形式 (3)pb=pb->next (4)pa->next (5)pre->next

解析 本题考查考生对链表基本操作的掌握。
    (1)处用于实现将pa指向LA的第一个元素。由于单链表LA包含头结点,其第一个元素应为头结点的后继结点。因此,(1)处应填入pa=LA->next。此时,pre指向LA的头结点。
    根据题目描述的函数SetDiff(LinkList LA,LinkListLB)的处理思路,在单链表LB中顺序查找与LA中当前元素相同的结点。(2)处需要填入一个循环条件,该循环条件应能实现对单链表LB的遍历。因此,(2)处应填入pb!=NULL或其等价形式。if(pa->data=pb->data)break语句用于实现处理思路中描述的“相等,则结束在LB中的查找过程”。而(3)处需要实现将选择了B中的下一个元素,因此应填入pb=pb->next。
    (4)和(5)用于实现LA中元素的删除。要删除单链表LA的当前元素,应使其前驱结点的next指针指向当前结点的后继结点的next指针。因此,(4)处应填入pa->next。当前指针pa应指向pre的后继结点,则(5)处应填入pre->next。
转载请注明原文地址:https://kaotiyun.com/show/fnjZ777K
0

最新回复(0)