刷题刷出新高度,偷偷领先!偷偷领先!偷偷领先! 关注我们,悄悄成为最优秀的自己!

简答题

 

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

    ______;  ++k;

    }

    return p;

    }

    Status
DelListElem(LinkList L,int i,ElemType *e)

    {  /*在含头结点的单链表L中,删除第i个元素,并由e带回其值*/

    LinkList p,q;

    /*令P指向第i个元素的前驱结点*/

    if(i==1)

    ______;

    else

  
 p=GetListElemPtr(L,i-1);

    if(!P || !p->next)  return ERROR; /*不存在第i个元素*/

    q=______;  
 /*令q指向待删除的结点*/

    p->next=q->next;    //从链表中删除结点*/

    ______;  
 /*通过参数e带回被删除结点的数据*/

    free(q);

    return
 SUCCESS;

    }


使用微信搜索喵呜刷题,轻松应对考试!

答案:

 

 

k<i
p=p->next
p=L
p->next
*e=q->data

 

解析:

本题考察的是对链表的基本操作以及指针的使用。

对于第一个函数GetListElemPtr,其目的是找到链表中第i个元素的指针。首先初始化指针p指向链表的第一个元素,然后使用一个循环来遍历链表,直到找到第i个元素或者到达链表尾部。在循环中,每次迭代都将指针p向后移动一个节点,同时计数器k自增。因此,第一个空应填写k<i,表示当k还没有达到i时继续循环查找。第二个空填写p=p->next,用于将p指向下一个节点。

对于第二个函数DelListElem,其目的是删除链表中的第i个元素。首先处理特殊情况,当i等于1时,直接让p指向头结点。否则,使用GetListElemPtr函数找到第i-1个元素的指针,然后让p指向第i个元素的前驱结点。接着,让q指向待删除的结点,即p的后一个结点。然后修改p的后继结点为q的后继结点,从而从链表中删除q节点。最后,通过参数e带回被删除结点的数据,并释放q节点所占用的内存。因此,第三个空填写p=L,第四个空填写p->next,第五个空填写*e=q->data。

创作类型:
原创

本文链接:  阅读以下说明和C代码,填补代码中的空缺,将解答填入答题纸的对应栏内。[说明]函数GetListE

版权声明:本站点所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明文章出处。

让学习像火箭一样快速,微信扫码,获取考试解析、体验刷题服务,开启你的学习加速器!

分享考题
share