阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【说明】 函数GetListElemPtr(LinkList L,int i)的功能是查找含头结点单链表的第i个元素。若找到,则返回指向该结点的指针,否则返回空指针。 函

admin2016-11-11  11

问题 阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。
【说明】
    函数GetListElemPtr(LinkList L,int i)的功能是查找含头结点单链表的第i个元素。若找到,则返回指向该结点的指针,否则返回空指针。
    函数DelListElem(LinkList L,int i,ElemType*e)的功能是删除含头结点单链表的第i个元素结点,若成功则返回SUCCESS,并由参数e带回被删除元素的值,否则返回ERROR。
    例如,某含头结点单链表L如图4-1(a)所示,删除第3个元素结点后的单链表如图4.1(b)所示。

    #define SUCCESS 0
    #define ERROR -1
    typedef  int  Status;
    typedef int ElemType;
    链表的结点类型定义如下:
    typedef  struct  Node{
    ElemType data;
       struct Node *next;
    }Node,*LinkLiSt;
  【C代码】
    LinkList  GetListElemPtr(LinkList L,  int  i)
    {  /*L是含头结点的单链表的头指针,在该单链表中查找第i个元素结点;
    若找到,则返回该元素结点的指针,否则返回NULL
    */
       LinkList P;
       int k;    /*用于元素结点计数*/
       if(i<i||!L||!L一>next)return NULL;
       k=1;P=L一>next;    /*令P指向第1个元素所在结点*/
       while (p&&__________(1)){    /*查找第i个元素所在结点*/
        ___________(2);  ++k;
      }
       return P;
    }
    Status DelLiStElem(LinkList L,int i,ElemType*e)
    {  /*在含头结点的单链表L中,删除第i个元素,并由e带回其值*/
        LinkList p,q;
        /*令P指向第i个元素的前驱结点*/
        if(i==i)
           ___________(3);
    else
          p=GetListElemPtr(L,i—1);
    if(!P||!p一>next)  return ERROR;/*不存在第i个元素*/
    q=___________(4);    /*令q指向待删除的结点*/
    p一>next=q一>next;    /*从链表中删除结点*/
    __________(5);    /*通过参数e带回被删除结点的数据*/
    free(q);
    return  SUCCESS;
  }

选项

答案(1)k<i (2)p=p->next (3)p=L (4)p->next (5)*e=q->data

解析 本题考查C语言的指针应用和运算逻辑。
    本问题的图和代码中的注释可提供完成操作的主要信息,在充分理解链表概念的基础上填充空缺的代码。
    函数GetListElemPtr(LinkList L,int i)的功能是在L为头指针的链表中查找第i个元素,若找到,则返回指向该结点的指针,否则返回空指针。描述查找过程的代码如下,其中k用于对元素结点进行计数。
    k=1;  p=L一>next;    /*令p指向第1个元素所在结点*/
    while(p&&__________(1)){    /*查找第i个元素所在结点*/
    ___________(2);    ++k;
    }
    上述代码执行时,k的初始值为1,同时p指向第一个元素结点。当找到第i个元素结点时,k应等于i,尚未到达第i个结点时,k小于i。因此,空(1)处应填入“k<i”或其等价形式,使得没有达到第i个结点时继续查找。空(2)处应填入“p=p->next”,从而使得指针p沿着链表中的结点向第i个结点移动。
    函数DelListElem(LinkList L,int i,ElemType*e)的功能是删除含头结点单链表的第i个元素结点,若成功则返回SUCCESS,并由参数e带回被删除元素的值,否则返回ERROR。
    根据注释,空(3)所在语句需要指向第一个结点之前的结点(即头结点),显然此处应填入“p=L”。
    空(4)所在语句令q指向待删除的结点,由于之前已经令p指向待删除结点的前驱结点,显然,此空应填入“p->next”。
    空(5)所在语句通过参数e带回被删除结点的数据,由于此时只能通过指针q找到被删除的结点,所以应填入“*e=q->data”。
转载请注明原文地址:https://jikaoti.com/ti/VHW7FFFM
0

最新回复(0)