[填空题] 【说明2.1】 L为一个带头结点的循环链表。函数deletenode(LinkList L, int c)的功能是删除L中数据域data的值大于c的所有结点,并由这些结点组建成一个新的带

12 查阅

[填空题] 【说明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) );

&l

参考答案:

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所得到的各位余数。