头歌菜鸟入门第一关-顺序表的基本操作

编程要求:
根据提示,在右侧编辑器代码文件中的 Begin - End 区间内补充代码,实现 step1 / Seqlist.h 中的 Insert、Delete、DelValue 和 Find 四个操作函数,以实现线性表中数据的插入、删除与查找等功能。具体要求如下:

Insert 函数:在线性表位置 P 插入数据元素 x, 将X插入在位置 P(1≤P≤L.length + 1) 并返回 true。若空间已满,则打印 FULL 并返回false;如果参数 P 指向非法位置,则打印 ILLEGAL POSITION 并返回 false;

Delete 函数:删除线性表位置 P 处的数据元素,删除线性表第 P 个数据元素。将位置 P P(1≤P≤L.length) 的元素删除并返回 true。若参数 P 指向非法位置,则打印 POSITION P EMPTY(其中 P 是参数值)并返回 false。

Find 函数:查找线性表中第一个值为 x 的数据元素的位置,找到线性表中第一个值为 x 的数据元素所在下标。若找不到则返回 ERROR。

DelValue 函数:删除线性表中第一个值为 x 的数据元素: 删除第一个值为 x 的数据元素,返回该数据元素所在位置[1, L.length]。如果不存在值为 x 的数据元素,则打印“ FINDING ERROR X ”(其中 X 是参数值)则返回 ERROR。

输入输出格式请参见后续测试样例

注意:本关必读中提及的其他操作已经由平台实现,你在实现本关任务的四个操作函数时,在函数体内可调用其他操作。

注意:本关必读中提及的其他操作已经由平台实现,你在实现本关任务的四个操作函数时,在函数体内可调用其他操作。

本关涉及的代码文件 Seqlist.h 中的 4 个操作函数的代码框架如下:

/*返回线性表中X第一次出现的位置,从1开始。若找不到则返回ERROR;*/
int Find(SqList L, ElementType X) {
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    /********** End **********/
}
/*将X插入在位置P(1≤P≤L.length+1)并返回true。若空间已满,则打印“FULL”并返回false;
如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;*/
bool Insert(SqList& L, ElementType X, int P) {
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    /********** End **********/
}
/*将位置P(1≤P≤L.length)的元素删除并返回true。若顺序表是空的,则打印“LIST EMPTY” ,并返回false;
若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。*/
bool Delete(SqList& L, int P) {
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    /********** End **********/
}
/* 删除线性表中第一个值为`x`的数据元素: 删除第一个值为`x`的数据元素,
返回该数据元素所在位置`[1,L.length]`。如果不存在值为`x`的数据元素,则打印“FINDING ERROR X”(其中X是参数值)则返回`ERROR`。
该操作函数具体定义如下: */
int DeleteValue(SqList& L, ElementType X) {
    // 请在这里补充代码,完成本关任务
    /********** Begin *********/
    /********** End **********/
}
测试说明
本关的测试文件是 step1 / Main.cpp,负责对实现的代码进行测试以及必读中提及的其他操作。具体代码如下:

/*顺序表的初始化,为动态数组分配一个预定义大小的空间,
创建一个最多可存储`MAXSIZE`个数据元素的顺序存储的线性表并将表的当前长度设置为0(即length=0),
如果申请存储空间失败返回false,否则返回true;*/
bool MakeEmpty(SqList & L) {
    L.elem = new ElementType[MAXSIZE];
    if (L.elem == NULL) return false;
    L.length = 0;
    return true;
}
/*释放线性表存储空间:
释放`L.elem`所指向的用于存储线性表数据元素的存储空间。
该操作函数具体定义如下: */
void Free(SqList& L) {
    delete[]L.elem;
}
/* 判断线性表是否为空:若当前线性表是空表,则返回`true`,否则返回`false`。该操作函数具体定义如下*/  
bool IsEmpty(SqList& L)
{
    return 0 == L.length;
}
/* 判断线性表是否已满:若线性表达到最大长度,则返回 `true`,否则返回`false`。该操作函数具体定义如下:*/
bool IsFull(SqList& L)
{
    return L.length == MAXSIZE;
}
/* 打印线性表: 打印整个线性表。该操作函数具体定义如下:*/
void Print(SqList& L) {
    int i;
    if (L.length >= 1) {
        cout << "LIST IS :" << L.elem[0];
        for (i = 1; i <= L.length - 1; i++) {
            cout << "," << L.elem[i];
        }
        cout << endl;
    }
    else {
        cout << "LIST IS EMPTY!" << endl;
    }
}
int main()
{
    SqList L;
    ElementType X;
    int P, N;
    //创建一个长度为MAXSIZE的空线性表
    MakeEmpty(L);
    // 输入待插入顺序表的元素个数
    cin >> N;
    // 循环读入N个整数,并存入到线性表中的第1个位置
    while (N--)
    {
        cin >> X;
        if (Insert(L, X, 1) == false)
            cout << " Insertion Error: " << X << " is not in." << endl;
    }
    //输出当前线性表
    Print(L);
    // 输入待查找的元素个数
    cin >> N;
    // 循环读入N个整数,对其进行查找
    while (N--)
    {
        cin >> X;
        P = Find(L, X);
        if (P == ERROR)
            cout << "Finding Error: " << X << " is not in." << endl;
        else
            cout << X << " is at position " << P << "." << endl;
    }
    // 输入待删除的元素个数
    cin >> N;
    // 循环读入N个整数,按指定位置P进行删除,并将0插入到P这个位置
    while (N--)
    {
        cin >> P;
        if (Delete(L, P) == false)
            cout << " Deletion Error." << endl;
        if (Insert(L, 0, P) == false)
            cout << " Insertion Error: 0 is not in." << endl;
    }
    //输出当前线性表
    Print(L);

    // 输入待删除的元素个数
    cin >> N;
    // 循环读入N个整数,找到第一次出现的X进行删除,并将-1插入到相应位置
    while (N--)
    {
        cin >> X;
        P = DeleteValue(L, X);
        if (P == ERROR)
            cout << " Deletion Error." << endl;
        if (Insert(L, -1, P) == false)
            cout << " Insertion Error: -1 is not in." << endl;
    }
    //输出当前线性表
    Print(L);
    //释放线性表空间
    Free(L);
    return 0;
}
注意:step1 / Main.cpp 的代码不能被修改。

以下是平台对 step1 / Main.cpp 的测试样例:

输入样例:
6 //输入线性表的长度;
1 2 3 4 5 6  //依次输入线性表的数据元素;
3  //待查找元素的个数;
6 5 1 //依次输入待查找的数据元素;
2   //待删除元素的个数;
0 7  //依次输入待删除的数据元素所在位置;
3  //待删除元素的个数;
10 2 6 //依次输入待删除的数据元素。

输出样例:
LIST IS : 6, 5, 4, 3, 2, 1
6 is at position 1.
5 is at position 2.
1 is at position 6.
POSITION 0 EMPTY Deletion Error.
ILLEGAL POSITION Insertion Error : 0 is not in.
POSITION 7 EMPTY Deletion Error.
LIST IS : 6, 5, 4, 3, 2, 1, 0
FINDING ERROR 10 Deletion Error.
ILLEGAL POSITION Insertion Error : -1 is not in.
LIST IS : -1, 5, 4, 3, -1, 1, 0*/

废话先不多说,直接先给家人们上答案:

#include <iostream>
using namespace std;

#define MAXSIZE 100
#define ERROR 0

typedef int ElementType;
typedef struct LNode {
    ElementType* elem;
    int length;  /* 保存线性表中数据元素个数 */
} SqList;

/*顺序表的初始化*/
bool MakeEmpty(SqList& L);
/*释放线性表存储空间:*/
void Free(SqList& L);
/* 判断线性表是否为空 */
bool IsEmpty(SqList& L);
/* 判断线性表是否已满*/
bool IsFull(SqList& L);
/* 打印线性表*/
void Print(SqList& L);
/*返回线性表中X第一次出现的位置*/
int Find(SqList L, ElementType X);
/*将X插入在位置P(1≤P≤L.length+1)*/
bool Insert(SqList& L, ElementType X, int P);
/* 删除线性表中第一个值为`x`的数据元素 */
int DeleteValue(SqList& L, ElementType X);
/*将位置P(1≤P≤L.length的元素删除*/
bool Delete(SqList& L, int P);



/*返回线性表中X第一次出现的位置,从1开始。若找不到则返回ERROR;*/
int Find(SqList L, ElementType X) {
    for (int i = 0; i < L.length; i++)
        if (X == L.elem[i])
            return i + 1;
    return ERROR;

}
/*将X插入在位置P((1≤P≤L.length+1))并返回true。若空间已满,则打印“FULL”并返回false;
如果参数P指向非法位置,则打印“ILLEGAL POSITION”并返回false;*/
bool Insert(SqList& L, ElementType X, int P) {
    // 请在这里补充代码,完成本关任务

    if (IsFull(L)) {
        cout << "FULL";
        return false;
    }
    if (P <= 0 || P > L.length + 1) {
        printf("ILLEGAL POSITION");
        return false;
    }
    for (int i = L.length; i >= P - 1; i--)
        L.elem[i + 1] = L.elem[i];
    L.elem[P - 1] = X;
    L.length++;
    return true;

}
/*将位置P((1≤P≤L.length)的元素删除并返回true。若顺序表是空的,则打印“LIST EMPTY” ,并返回false;
若参数P指向非法位置,则打印“POSITION P EMPTY”(其中P是参数值)并返回false。*/
bool Delete(SqList& L, int P) {
    // 请在这里补充代码,完成本关任务
    if (IsEmpty(L)) {
        cout << "LIST EMPTY";
        return false;
    }

    if (P <= 0 || P >= L.length + 1) {
        printf("POSITION %d EMPTY", P);
        return false;
    }

    for (int i = P - 1; i < L.length; i++)
        L.elem[i] = L.elem[i + 1];
    L.length--;
    return true;
   
}
/* 删除线性表中第一个值为`x`的数据元素: 删除第一个值为`x`的数据元素,
返回该数据元素所在位置`[1,L.length]`。如果不存在值为`x`的数据元素,则打印“FINDING ERROR X”(其中X是参数值)则返回`ERROR`。
该操作函数具体定义如下: */

int DeleteValue(SqList& L, ElementType X) {
    for (int i = 0; i < L.length; i++) {
        if (X == L.elem[i]) {
            for (int j = i; j < L.length; j++)
                L.elem[j] = L.elem[j + 1];
            L.length--;
            return i + 1;
        }
    }

    printf("FINDING ERROR %d", X);
    return ERROR;

    
}

int main()
{
    SqList L;
    ElementType X;
    int P, N;
    //创建一个长度为MAXSIZE的空线性表
    MakeEmpty(L);
    // 输入待插入顺序表的元素个数
    cin >> N;
    // 循环读入N个整数,并存入到线性表中的第1个位置
    while (N--)
    {
        cin >> X;
        if (Insert(L, X, 1) == false)
            cout << " Insertion Error: " << X << " is not in." << endl;
    }
    //输出当前线性表
    Print(L);
    // 输入待查找的元素个数
    cin >> N;
    // 循环读入N个整数,对其进行查找
    while (N--)
    {
        cin >> X;
        P = Find(L, X);
        if (P == ERROR)
            cout << "Finding Error: " << X << " is not in." << endl;
        else
            cout << X << " is at position " << P << "." << endl;
    }
    // 输入待删除的元素个数
    cin >> N;
    // 循环读入N个整数,按指定位置P进行删除,并将0插入到P这个位置
    while (N--)
    {
        cin >> P;
        if (Delete(L, P) == false)
            cout << " Deletion Error." << endl;
        if (Insert(L, 0, P) == false)
            cout << " Insertion Error: 0 is not in." << endl;
    }
    //输出当前线性表
    Print(L);

    // 输入待删除的元素个数
    cin >> N;
    // 循环读入N个整数,找到第一次出现的X进行删除,并将-1插入到相应位置
    while (N--)
    {
        cin >> X;
        P = DeleteValue(L, X);
        if (P == ERROR)
            cout << " Deletion Error." << endl;
        if (Insert(L, -1, P) == false)
            cout << " Insertion Error: -1 is not in." << endl;
    }
    //输出当前线性表
    Print(L);
    //释放线性表空间
    Free(L);
    return 0;
}

欲知注释是啥?留下小赞,咱们下回分解!

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值