阅读以下说明和 C 代码,填补代码中的空缺,将解答填入答题纸的对应栏内。 【

最全题库2022-08-02  37

问题 阅读以下说明和 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<1  ∣∣ !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==1)                     (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 指向第一个元素结点。当找到第 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://tihaiku.com/congyezige/2427172.html

最新回复(0)