List.h文件
#include <iostream>
#define MaxSize 50 // 注意点:宏定义(#define)语句后面是不加分号的
using namespace std; // 注意点:此语句后面需要加分号
typedef int ElemType; // 注意点:typedef语句后面需要加分号
typedef struct{ // 注意点:typedef和宏定义(#define)之间的区别
ElemType data[MaxSize]; // 注意点:结构体的正确使用方法
int length;
}SqList;
void InitList(SqList &L);
int Length(SqList L);
int LocateElem(SqList L, ElemType e);
ElemType GetElem(SqList L, int i);
bool ListInsert(SqList &L, int i, ElemType e);
ElemType ListDelete(SqList &L, int i);
void PrintList(SqList L);
bool IsEmpty(SqList L);
List.cpp文件
// 1.刻画一个顺序表(建立一个顺序表通用模板)
//要确定一个顺序表,就必须要指定这个顺序表存储的数组,线性表当前的长度,线性表的最大容量
//于是考虑用结构体来刻画顺序表
//在这个结构体中要包含的变量有:1.存储线性表数据元素的数组 2.顺序表当前长度(元素个数) 3.线性表的最大容量
// 数组存储空间的分配有两种方式 1.静态分配:数组的空间会事先固定好,一旦空间占满,则无法再加入新数据
// 2.动态分配:数组的空间可以随着数据元素的增加而增加,用指针指向动态分配的数组
#include "List.h"
// 2. 对顺序表有哪些操作
// 2.1 对顺序表的初始化操作:将模板具体化,实实在在的表示一个确切的顺序表
void InitList(SqList &L) // 声明一个reference:在类型名称和reference名称之间加上&符号
{
L.length = 0; // 刚开始,顺序表的元素个数为0
}
// 2.2 对顺序表求表的长度操作:这个操作将返回顺序表的元素个数
int Length(SqList L)
{
return L.length; // 注意点:return语句后面需要加分号
}
// 2.3 对顺序表进行按值查找操作:返回在顺序表中第一个元素值等于给定元素值的序号(数组下标值加1)
int LocateElem(SqList L, ElemType e)
{
for(int i=0;i<L.length;i++)
{
if(L.data[i] == e)
return i+1;
}
return 0;
}
// 2.4 对顺序表进行按位查找操作:返回顺序表中第i个位置(数组下标+1)的元素的值
ElemType GetElem(SqList L, int i)
{
ElemType m = 0;
if(0<i<=L.length)
{
m = L.data[i-1];
return m;
}
else
{
cout << "顺序表位置违法n"; // 注意需要包含头文件和命名空间的说明
return m;
}
}
// 2.5 对顺序表进行元素插入操作:在顺序表的第i个位置上插入指定的元素e
bool ListInsert(SqList &L, int i, ElemType e)
{
if(L.length<MaxSize && 0<i<=L.length+1)
{
for(int m = L.length-1;m >= i-1; m--)
{
L.data[m+1] = L.data[m];
}
L.data[i-1] = e;
L.length += 1;
return true;
}
else
{
cout << "插入失败n";
return false;
}
}
// 2.6 对顺序表中第i个位置的元素进行删除操作,并返回删除元素的值
ElemType ListDelete(SqList &L, int i)
{
ElemType val = 0;
if(0<i<L.length)
{
ElemType val = L.data[i-1];
for(int m = i; m<L.length; m++)
{
L.data[m-1] = L.data[m];
}
L.length -= 1;
return val;
}
else
{
cout<<"删除失败!n";
return val;
}
}
// 2.7 输出操作,按前后顺序输出线性表的所有元素值
void PrintList(SqList L)
{
if(L.length>0)
{
for(int i = 0;i<L.length;i++)
{
cout << L.data[i] <<"n";
}
}
else
{
cout << "输出失败!n";
}
}
// 2.8 判空操作,若L为空表,则返回true,否则返回false
bool IsEmpty(SqList L)
{
if(L.length == 0)
return true;
else
{
return false;
}
}
ListMain.cpp文件
#include "List.h"
int main()
{
SqList L; // 定义一个顺序表
int val_init = 1;
InitList(L); // 顺序表的初始化
for(int i = 1; i<= 30; i++)
{
if(ListInsert(L, i ,val_init)) // 顺序表的插值操作
val_init += 2;
}
int length = Length(L); // 求表长
cout << "顺序表的长度为:"<<length<<"n";
int num = 17;
int count = LocateElem(L, num); // 按值查找操作
cout << "数值" << num << "在顺序表中的位置为:" << count << endl;
int p = 10;
ElemType elem = GetElem(L, p); // 按位查找操作
cout << "顺序表中第" << p << "个位置的数值为:" << elem << endl;
int p_Insert = 15;
ElemType val_insert = 100;
if(ListInsert(L, p_Insert,val_insert)) // 插值操作
{
cout << "在第"<<p_Insert<<"个位置中插入"<< val_insert << "成功!"<<endl;
}
else
{
cout << "插入操作失败"<<endl;
}
int p_del = 21;
ElemType val_del = ListDelete(L, p_del); // 删除操作
if(val_del)
{
cout << "删除顺序表中第"<<p_del<<"位置上的值成功!"<<endl;
}
else
{
cout<<"删除操作失败!"<<endl;
}
if(IsEmpty(L)) // 判空操作
{
cout << "这个顺序表是空的!"<<endl;
}
else
{
cout << "这个顺序表非空!"<<endl;
}
cout << "顺序表中的所有元素为:"<<endl;
PrintList(L); // 打印操作
}
VsCode平台要用到的编译调试配置文件launch.json和tasks.json
launch.json文件
{
// 使用 IntelliSense 了解相关属性。
// 悬停以查看现有属性的描述。
// 欲了解更多信息,请访问: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "(gdb) 启动",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}${workspaceFolderBasename}.exe",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
"miDebuggerPath": "C:/MinGW/bin/gdb.exe",
"setupCommands": [
{
"description": "为 gdb 启用整齐打印",
"text": "-enable-pretty-printing",
"ignoreFailures": true
}
],
"preLaunchTask": "C/C++: g++.exe build active file"
}
]
}
tasks.json文件
{
"version": "2.0.0",
"tasks": [
{
"type": "shell",
"label": "C/C++: g++.exe build active file",
"command": "C:MinGWbing++.exe",
"args":["${workspaceFolder}*.cpp", "-o", "${workspaceFolder}${workspaceFolderBasename}.exe","-g"],
"options": {
"cwd": "${workspaceFolder}"
},
"problemMatcher": [
"$gcc"
],
"group": {
"kind": "build",
"isDefault": true
}
}
]
}
调试运行结果