顺序表在插入元素时应注意:
1. 插入元素不可以插在最后一个位置
2. 插入元素不可以插在超过顺序表的长度
代码实现
#include <iostream>
#include <graphics.h>
#include <Windows.h>
using namespace std;
#define MAX_SIZE 100
typedef struct {
int *elems; //顺序表的基地址
int length; //顺序表的长度
int size; //顺序表总空间大小
} Sqlist;
bool initList(Sqlist &list) {
list.elems = new int[MAX_SIZE];
if (!list.elems) {return false;} //分配内存失败
list.length = 0;
list.size = MAX_SIZE;
return true;
}
//顺序表增加元素
bool listAdd(Sqlist &list, int n) {
if (list.length == MAX_SIZE) { return false; } //存储空间已满
list.elems[list.length] = n; //传进来的n赋值给elems[];
list.length++; //表的长度加1
return true;
}
/*
* 顺序表插入元素
* 参数:
* list: 形参
* i: 表示往顺序表中插入的位置
* n: 表示往顺序表中插入的数据
*/
bool listInsert(Sqlist &list, int i, int n) {
if (i < 0 || i >= list.length) return false; //插入的位置小于0,或者大于顺序表长度
if (list.length == list.size) return false; //顺序表储存空间已满
for (int j = list.length - 1; j >= i; j--) {
list.elems[j + 1] = list.elems[j]; //从最后一个元素开始后移, 直到下标为i的元素后移
}
list.elems[i] = n; //将新数据插入下标为i的位置
list.length++; //表长度+1
return true;
}
//打印输出顺序表
void ListPrint(Sqlist &list) {
cout << "顺序表的元素" << endl;
for (int i = 0; i <= list.length - 1; i++) {
cout << list.elems[i] << " ";
}
cout << endl;
cout << "顺序表储存空间:" << list.size << " 已保存" << list.length << "个元素" << endl;
}
int main(void) {
Sqlist list;
//1.初始化
if (initList(list)) {
cout << "顺序表初始化成功!" << endl;
} else {
cout << "顺序表初始化失败!" << endl;
system("pause");
return 0;
}
//添加元素
int count = 0;
int e = 0;
int i = 0;
cout << "请输入元素个数:";
cin >> count;
for (int i = 0; i < count; i++) {
cout << "请输入要添加的元素:";
cin >> e;
if (listAdd(list, e)) {
cout << "添加成功!" << endl;
} else {
cout << "添加失败!" << endl;
}
}
ListPrint(list);
cout << "请输入插入元素的序号:";
cin >> i;
cout << "请输入插入元素的数据:";
cin >> e;
if (listInsert(list, i, e)) {
cout << "数据" << e << "在第" << i << "位置插入成功!" << endl;
} else {
cout << "数据" << e << "在第" << i << "位置插入失败!" << endl;
}
ListPrint(list);
//删除分配的内存
delete[] list.elems;
system("pause");
return 0;
}