阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。 函数说明 函数movetoend(1inkedList La,int i)的功能是:将线性表A的第i个元素移到表尾。若移动成功,则返回0,否则返回-1。线性表A采用带头结点的单

admin2007-03-15  79

问题 阅读下列函数说明和C代码,将应填入(n)处的字句写在答题纸的对应栏内。
函数说明
   函数movetoend(1inkedList  La,int i)的功能是:将线性表A的第i个元素移到表尾。若移动成功,则返回0,否则返回-1。线性表A采用带头结点的单链表表示,La为表A的头指针,如下图所示。
   
   链表结点的类型定义为;
   typedef struct node{
        int key;
        street node*next;
   }*LinkedList;
函数
   int movetoend(LinkedList La,int i)
   {
        LinkedListp,q,prep;
        int k=1;
        p=La->next;prep=La;
        while( (1) ){/*严查找第i个元素并使指针p指向该结点*/
             prep=p;p=p->next;k++;
        }
        if(!p||k>i)return-1;
        if( (2) )    /*第i个元素结点已经是表尾结点,则无需移动*/
             return 0;
        q=p;
        while( (3) )q=q->next;/*查找表尾并使q指向表尾结点*/
         (4)=p->next;
        p->next=NULL;
          (5);
        return 0;
   }

选项

答案(1)p&&k<i,及其等价形式 (2)!p->next,及其等价形式 (3)q->next (4)prep->next (5)q->next=p

解析 本题考查的是指针运算和链表操作。
   在函数中,通过语句“p=La->next;prep=La;”可知,若链表不空,则p指向链表的第一个元素结点且prep直接指向其前趋结点,同时计数器k的值为1。因此,只要计数器k的值小于i且链表长度大于i(即p指向的结点存在),则指针p将随着while循环,向表尾方向扫描下去。因此,函数中空(1)处应填入“p&&k<i”或其等价形式。显然,当找到第i个结点时,p指向该结点,且prep指向其前趋结点,如下图(a)所示。因此, p->next为空指针表明第i个元素结点已经在表尾,无需移动,即函数中空(2)处应填入“!p->next”。反之,若第i个结点不是表尾,则可通过“prep->next=p->next’’操作将其从链表中删除,如下图(b)所示。
   
   为了将p指向的结点链接到表尾,则需找到表尾结点并令q指向该结点(通过函数中的注释得知),此时q->next应等于空指针。因此空(3)处应填入“q->next”。由于在空(4)处将p指向的结点从链表中删除,因此,空(5)处应将其接在表尾,即填入“q->next=p”。
转载请注明原文地址:https://kaotiyun.com/show/ezjZ777K
0

随机试题
最新回复(0)