数据结构 - 顺序表 C++ 实现
2022-03-21 21:16
1751 查看
顺序表
此处实现的顺序表为**第一个位置为 data[0] **的顺序表
顺序表的定义为
const int MAX = 50; typedef int ElemType; typedef struct { ElemType data[MAX]; int length; } SeqList; //data[0] 为第一个元素
顺序表元素的插入
在顺序表 L 位置 i 处插入元素 e
需要注意的几个点:
- 插入元素,插入位置范围为 1 ~ length + 1,否则不合法;
- 移动时的
for
的首尾元素的分析 此处为 data[0] 开始的顺序表,因此第 j 个元素位置在 data[j - 1] - 第一次移动将第 L.length 个元素移动到第 L.length + 1 处,代码为 L.data[L.length] = L.data[L.length - 1];
- 最后一次移动将第 i 个元素移动到下一个位置,代码为 L.data[i] = L.data[i - 1];
- L.data[j + 1] = L.data[j]: for 起始为 j = L.length - 1 最后为 j = i - 1;
- L.data[j] = L.data[j - 1]: for 起始为 j = L.length 最后为 j = i;
代码如下:
bool ListInsert(SeqList &L, int i, ElemType e) { if(i < 1 || i > L.length + 1) { return false; } if(L.length == MAX) { return false; } // 1. for(int j = L.length - 1; j >= i - 1; j--) { L.data[j + 1] = L.data[j]; } // 2. for(int j = L.length; j >= i; j--) { L.data[j] = L.data[j - 1]; } L.data[i - 1] = e; L.length++; return true; }
顺序表元素的删除
删除顺序表 L 位置 i 处的元素,将删除元素放在 x 中
需要注意的几个点:
删除元素,删除位置范围为 1 ~ length,否则不合法;
移动时的
for
的首尾元素的分析此处为 data[0] 开始的顺序表,因此第 j 个元素位置在 data[j - 1]
第一次移动将第 i + 1 个(data[i])元素移动到第 i 处(data[i - 1]),代码为
L.data[i - 1] = L.data[i];
最后一次移动将第 L.length 个(data[L.length-1])元素移动到第 L.length - 1 处,
代码为 L.data[L.length - 2] = L.data[L.length - 1];
L.data[j + 1] = L.data[j]: for 起始为 j = i 最后为 j = L.lenght - 1;
L.data[j] = L.data[j - 1]: for 起始为 j = i - 1 最后为 j = L.length - 2;
代码如下:
bool ListDelete(SeqList &L, int i, ElemType &e) { if(i < 1 || i > L.length) { return false; } e = L.data[i - 1]; for(int j = i - 1; j < L.length - 1; j++) { L.data[j] = L.data[j + 1]; } for(int j = i; j < L.length; j++) { L.data[j - 1] = L.data[j]; } L.length--; return true; }
顺序表的查找
按值查找返回位置
顺序查找所有顺序表中的值,若找到则返回位置(第一个位置为 data[0]),若未找到返回 0
int LocateElem(SqList L, ElemType e) { for(int i = 0; i < L.length; i++) { if(L.data[i] == e) { return i + 1; } } return 0; }
按位置查找
对于顺序表可以随机存储,直接取数即可;
ElemType GetByLocate(SqList L,int i) { return L.data[i]; }
顺序表的测试
#include<iostream> using namespace std; //静态分配空间 const int MAX = 50; typedef int ElemType; typedef struct { ElemType data[MAX]; int length; } SqList; //data[0] 为第一个元素 /* //动态分配空间 typedef struct { ElemType *data; int MAX, length; }; */ void ListInitite(SqList &L) { L.length = 0; } //插入元素,插入位置范围为 1 ~ length + 1 bool ListInsert(SqList &L, int i, ElemType e) { if(i < 1 || i > L.length + 1) { return false; } if(L.length == MAX) { return false; } // for(int j = L.length - 1; j >= i - 1; j--) { // L.data[j + 1] = L.data[j]; // } for(int j = L.length; j >= i; j--) { L.data[j] = L.data[j - 1]; } L.data[i - 1] = e; L.length++; return true; } bool ListDelete(SqList &L, int i, ElemType &e) { if(i < 1 || i > L.length) { return false; } e = L.data[i - 1]; // for(int j = i - 1; j < L.length - 1; j++) { // L.data[j] = L.data[j + 1]; // } for(int j = i; j < L.length; j++) { L.data[j - 1] = L.data[j]; } L.length--; return true; } int LocateElem(SqList L, ElemType e) { for(int i = 0; i < L.length; i++) { if(L.data[i] == e) { return i + 1; } } return 0; } ElemType GetByLocate(SqList L,int i) { return L.data[i - 1]; } int main() { SqList L; ListInitite(L); for(int i = 1; i <= 10; i++) { if(ListInsert(L, i, 3 * i)) { printf("插入成功\n"); } } cout << L.data[0] << endl; for(int i = 1; i <= L.length; i++) { ElemType k = GetByLocate(L, i); printf("%d ", k); } printf("\n元素 9 在顺序表中的位置为:%d\n", LocateElem(L, 9)); ElemType e; ListDelete(L, 8, e); //删除第 8 个元素 printf("被删除的元素为%d\n", e); printf("删除后\n"); for(int i = 1; i <= L.length; i++) { ElemType k = GetByLocate(L, i); printf("%d ", k); } return 0; }
测试数据及结果如下
插入成功 插入成功 插入成功 插入成功 插入成功 插入成功 插入成功 插入成功 插入成功 插入成功 3 3 6 9 12 15 18 21 24 27 30 元素 9 在顺序表中的位置为:3 被删除的元素为24 删除后 3 6 9 12 15 18 21 27 30
相关文章推荐
- C++数据结构 顺序表(模板类实现)
- 数据结构顺序表链表C++实现
- 数据结构 顺序表c++简单实现
- 数据结构(4) 顺序栈 c++ 模板实现
- 数据结构之单链表实现队列C++
- 数据结构图文解析之:哈夫曼树与哈夫曼编码详解及C++模板实现
- 数据结构(3)单循环链表 c++ 模板实现
- 数据结构复习:希尔排序的C++实现
- 数据结构与算法——普通树的定义与C++实现
- 线性表-顺序表、链表类模板的实现(数据结构基础 第2周)
- C/C++用匿名数据结构实现时间和空间名利双收
- 数据结构(C实现)------- 顺序表
- 数据结构顺序表定义和实现
- 数据结构之用顺序表实现二叉树
- 数据结构(3)线性表之顺序表C++实现
- 数据结构与算法:C++实现归并排序
- 数据结构:单链表 C++实现
- 数据结构图文解析之:队列详解与C++模板实现
- C++数据结构——二叉搜索树(实现自定义迭代器)
- 数据结构——链表的C++实现