阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。 【说明2.1】 L为一个带头结点的循环链表。函数deletenode(LinkList L, int c)的功能是删除L中数据域data的值大于c的所有结点,并由这些结点组建成一个

admin2009-02-15  74

问题 阅读下列函数说明和C代码,将应填入(n)处的字句写在对应栏内。
   【说明2.1】
   L为一个带头结点的循环链表。函数deletenode(LinkList L, int c)的功能是删除L中数据域data的值大于c的所有结点,并由这些结点组建成一个新的带头结点的循环链表,其头指针作为函数的返回值。
  【函数2.1】
    LinkList deletenode(LinkList L, int c)
  {  
       LinkList Lc,p,pre;
       pre=L;
       p=(1);
       Lc=(LinkList)malloc(sizeof(ListNode) );
       Lc->next=Lc
       while(p!=L)
           if(p->data>c)
           {
                 (2);
                 (3);
               Lc->next=p;
               p=pre->next;
      }
          else
          {
             pre=p;
             p=pre->next;
          }
       return Lc;
}   
   【说明2.2】
   递归函数dec_to_k_2(int n, int k)的功能是将十进制正整数n转换成k<2≤k≤9)进制数,并打印。
   【函数2.2】
    dec_to_k_2(int n, int k)
   {    /*将十进制正整数n转换成k(2≤k≤9)进制数*/
       if(n!=0)
       {
           dec_to_k_2((4),k);
           printf("%d",(5));
       }
   }

选项

答案(1)pre->next或L->next (2)pre->next=p->next (3)p->next=Lc->next (4) n/k (5)n% k

解析 这一题共有两个函数,第一个函数是考查链表的删除和插入操作,第二个函数是考查递归函数。
   先看第一个函数。(1)空所在语句是对指针p赋初值,通过下面的程序可以判断指针pre所指的结点是指针p所指的结点前驱结点,因此 (1)空处应填写“pre->next”或“L->next”。(2)、(3)空所在的语句块是处理当指针p所指的结点是一个大于c的结点,则将该结点从链表L中删除,再将它插入到链表Lc中。由指针pre和指针p的关系,从链表中删除指针p所指结点很简单,只需将指针pre的next域修改为指针p的next域即可,因此(2)空处应填写“pre->next=P->next”或其等价形式。将指针p所指的结点插入到链表Lc的过程是,先将指针P的next域指向指针Lc的next所指的结点,再将指针Lc的next指向指针p所指的结点。因此(3)空处应填写“p->next=Lc->next”或其等价形式。
   再来分析第二个函数。将十进制正整数转换成k进制数,采用除 k取余法。最开始得到余数作为k进制数的最低位,最后得到的余数作为k进制数的最高位。用n不断地除以k,直到商为0。转换所得到的k进制数是从低位开始生成,而输出则应该从高位开始。根据这一特点,用递归法求解时,先应将n/k转换成k进制,再输出n%k。因此 (4)空、(5)空处分别填写“n/k”、“n% k。当然这个问题也可以通过非递归的算法来完成,这样在转换过程中,需要一个栈来暂存n除以k所得到的各位余数。
转载请注明原文地址:https://jikaoti.com/ti/RvW7FFFM
0

相关试题推荐
最新回复(0)