编程要求:
根据提示,在右侧编辑器代码文件中的 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;
}
欲知注释是啥?留下小赞,咱们下回分解!