数据结构上机实践课程(2018年秋)10月机考

B. 线性链表的插入和删除

单点时限: 2.0 sec

内存限制: 512 MB

实现线性链表的插入与删除操作

只需完成给定函数的定义。

NODE* insertLinklist(NODE* head, int tar, int val) {
   // TODO
}

NODE* deleteLinklist(NODE* head, int tar) {
   // TODO
}

其中

NODE表示链表的结构体,定义如下

typedef struct node
{
    int data;   //存储数据
    struct node* next;  //指向下一个结点的指针
} NODE;

本题没有表头结点,head指向链表的第一个元素

特别的,如果链表为空,headNULL

显然,为了完成该链表维护工作,你需要实现上述两个辅助函数

插入操作中:

tarval表示将存放新值$val$的结点插入到值为$tar$的结点之前

数据保证:

  • 当链表不为空时,值为$tar$的结点一定在链表中
  • 若有多个结点存放的值都为$tar$,则插入到第一个之前
  • 若链表为空,则将$val$作为链表的第一个结点,即将head指向这个新的结点

删除操作中:

tar表示删除存放值为$tar$的结点

若有多个结点存放的值是$tar$,则删除第一个

特别的,在删除操作中,你需要对两种特殊情况作出处理:

  • 如果链表为空,输出提示信息EMPTY LIST
  • 如果链表不为空但值为$tar$的结点不存在,输出提示信息NOT FOUND

提示

只能使用C或者C++提交。

对于C/C++,判题程序类似,如下:

#include <stdio.h>
#include <stdlib.h>

typedef struct node
{
    int data;
    struct node* next;
} NODE;

NODE* insertLinklist(NODE* head, int tar, int val);
NODE* deleteLinklist(NODE* head, int tar);

/* 你的代码将会被嵌入在这个位置 */

int main()
{
    /* 输入及其他处理,细节隐藏不表 */

    NODE* head = createLinklist(/* 创建链表,细节隐藏不表 */);    

    for (/* 若干操作,细节隐藏不表 */)
        if(/* 判断插入还是删除,细节隐藏不表 */)
            head = insertLinklist(head, tar, val);
        else
            head = deleteLinklist(head, val);

    /* 后续判题,细节隐藏不表 */

    return 0;
}