看过了很多讲数据结构的文章,有种千篇一律的感觉,套路和顺序大致相同.于是决定,自己写的时候使用一种新的方式把它呈现给大家.
将采用提示–思考–代码及注释的方式,在看具体的代码实现之前,大家可以通过提示先试着自己写,然后再看代码实现.
结构体定义
提示:
- 应该有存放数据的地方
- 应该记录已存放了多少个元素
- 表应该有上限
typedef struct {
int *data;//应该有存放数据的地方
int length;//应该记录已存放了多少个元素
int maxsize;//表应该有上限
}SeqList;
顺序表的初始化
提示:
- 应该能得知初始化是否成功
- 给data分配内存是否成功?
- 表长有没有初始化?
#define MAXSIZE 50
bool initList(SeqList &L) {//应该能得知初始化是否成功
L.data = new int[MAXSIZE];
if (!L.data) {//给data分配内存是否成功?
return false;
}
L.length = 0;//表长有没有初始化?
L.maxsize = MAXSIZE;
return true;
}
顺序表的插入
提示:
- 顺序表可能满了,导致插入失败
- 插入位置是否合法?
bool listInsert(SeqList &L, int n, int e) {
if (L.length == L.maxsize) {//顺序表可能满了,导致插入失败
cout << "顺序表已满!" << endl;
return false;
}
else if (n > L.length || n < 0) {//插入位置是否合法?
cout << "插入位置不合法!" << endl;
return false;
}
for (int i = L.length; i >= n; i--) {
L.data[i + 1] = L.data[i];
}
L.data[n] = e;
L.length++;
return true;
}
顺序表的删除
提示:
- 删除位置是否合法?
bool listDelete(SeqList &L, int n) {
if (n<0 || n>L.length) {//删除位置是否合法?
cout << "删除位置不合法!" << endl;
return false;
}
for (int i = n; i < L.length; i++) {
L.data[i] = L.data[i + 1];
}
L.length--;
return true;
}
打印表内元素
此处无提示,选择喜欢自己的打印格式.
void printList(SeqList &L) {
cout << "顺序表内的元素有" << L.length << "个" << endl;
if (!L.length) {
return;
}
for (int i = 0; i < L.length; i++) {
cout << L.data[i] << "\t";
}
cout << endl;
}
销毁顺序表
提示:
- 注意内存泄漏
- 是否记得清空表长数据?
void destoryList(SeqList &L) {
if (L.data) {//注意内存泄漏
delete[] L.data;
}
L.length = 0;//是否记得清空表长数据?
L.maxsize = 0;
}
全部代码以及测试代码
插入和删除均从"1"开始
#include <iostream>
#define MAXSIZE 50
using namespace std;
typedef struct {
int *data;
int length;
int maxsize;
}SeqList;
bool initList(SeqList &L) {
L.data = new int[MAXSIZE];
if (!L.data) {
return false;
}
L.length = 0;
L.maxsize = MAXSIZE;
return true;
}
bool listInsert(SeqList &L, int n, int e) {
if (L.length == L.maxsize) {
cout << "顺序表已满!" << endl;
return false;
}
else if (n > L.length || n < 0) {
cout << "插入位置不合法!" << endl;
return false;
}
for (int i = L.length; i >= n; i--) {
L.data[i + 1] = L.data[i];
}
L.data[n] = e;
L.length++;
return true;
}
bool listDelete(SeqList &L, int n) {
if (n<0 || n>L.length) {
cout << "删除位置不合法!" << endl;
return false;
}
for (int i = n; i < L.length; i++) {
L.data[i] = L.data[i + 1];
}
L.length--;
return true;
}
void printList(SeqList &L) {
cout << "顺序表内的元素有" << L.length << "个" << endl;
if (!L.length) {
return;
}
for (int i = 0; i < L.length; i++) {
cout << L.data[i] << "\t";
}
cout << endl;
}
void destoryList(SeqList &L) {
if (L.data) {
delete[] L.data;
}
L.length = 0;
L.maxsize = 0;
}
int main(void) {
SeqList L;
int n, data, location;
if (!initList(L)) {
cout << "初始化失败!" << endl;
return 0;
}
cout << "请输入要添加的元素个数:";
cin >> n;
while (n--) {
cout << "请输入添加的元素:";
cin >> data;
cout << "位置:";
cin >> location;
listInsert(L, location-1, data);
}
printList(L);
cout << "请输入要删除的元素位置:";
cin >> location;
listDelete(L, location-1);
printList(L);
destoryList(L);
system("pause");
return 0;
}