PTA(顺序表)2-4 在指定位置插入元素

2-4 在指定位置插入元素

分数 6

作者 张志梅

单位 青岛大学

给出 n 个整数,在指定位置 pos(位置从1起始)前插入给定的值 val,请输出插入后的整数序列。

输入格式:

包含多组测试。第一行会有一个 T 表示组数 (1<=T<=20),每组测试的第一行输入三个数 n , pos , val,第二行输入n个整数。其中,1<=n<=100,1<=pos<=n+1,1<=val<=100。

输出格式:

每组测试输出包含一行,行末不允许有多余的空格。

输入样例:

1
2
3
4
5
2
5 1 4
1 2 3 4 5
6 3 9
2 4 6 8 0 2

输出样例:

1
2
4 1 2 3 4 5
2 4 9 6 8 0 2

答案

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
#include <iostream>
using namespace std;

// 定义顺序表结构
typedef struct {
int *data;
int length;
} sqList;

// 初始化顺序表
void initList(sqList &L, int n) {
L.data = new int[n+1];
L.length = 0;
}

// 插入顺序表
void insertElem(sqList &L, int pos, int val) {
// 先将pos位置以后的往后挪
for (int i = L.length-1; i >= pos-1; i--) {
L.data[i+1] = L.data[i];
}
// 将val插进pos上
L.data[pos-1] = val;
L.length++; // 表长+1
}

int main() {
int T;
cin >> T;
for (int i = 0; i < T; i++){
int n, pos, val;
cin >> n >> pos >> val;
sqList L;
initList(L, n);
// 将读取的数插入到顺序表
for (int j = 0; j < n; ++j) {
cin >> L.data[j];
L.length++;
}
// 将val前插到pos前面
insertElem(L, pos, val);
// 输出插入后的顺序表
for (int k = 0; k < L.length; k++) {
if (k != 0) {
cout << " ";
}
cout << L.data[k];
}
// 不是最后一行要换行
if (i != T-1) {
cout << endl;
}
}
}

总结

我的错误->元素后移循环的起始条件错误

insertElem 函数中,后移循环的起始下标写为 L.data[L.length-1],这是把 “元素值” 当成了 “下标”,完全错误。

应该是L.length-1