版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/Magic_Ninja/article/details/83119587
线性基本概念
线性表的定义:线性表是具有相同特性数据元素的一个有序序列。
线性表的存储结构:
- 顺序表
- 链表
顺序表有随机访问的特性
链表结点的存储空间利用率较顺序表稍微低一些,但是方便插入删除,不需要移动任何元素
链表有一下五种形式:
- 单链表
- 双链表
- 循环单链表
- 循环双链表
- 静态链表
线性表的结构体定义
顺序的结构代码
# define MAXSIZE 100 /* 存储空间初始分配量,为常量 */
typedef int ElemType; /* ElemType是自己自定义的类型,假设为int */
typedef struct
{
ElemType data[MAXSIZE]; /* 存储数据元素,最大值为MAXSIZE */
int length; /* 线性表当前长度 */
}
链表的结构
顺序表的操作
初始化顺序表
void InitList(SqList &L) /* 要发生改变,所以要用引用型 */
{
L.length = 0;
}
查找元素位置
在顺序表中查找第一个值等于e的元素,并返回其下标。
ElemType FindElem(Sqlist L, int e)
{
for (int i = 0; i < L.length; ++i)
if (e == L.data[i])
return i;
return -1;
}
获得元素
ElemType GetElem(SqList L, int i, ElemType &e)
{
if(i < 0 || i > L.length - 1)
return 0;
e = L.data[i - 1];
return 1;
}
插入
插入算法思路:
- 插入新元素,如果位置不正确,不合理,则抛出异常,插入失败;
- 从最后一个元素开始向前遍历到第i个位置,分别将他们向后移动一个位置;
- 将要插入的元素插入位置i处;
- 顺序变长度增加1;
- 返回代码1。
实现代码如下:
/* 初始条件:顺序表已经创建,1 <= ListLength(L) */
/* 预期结果:顺序表L在i位置插入新元素e,L长度增加1 */
ElemType ListInsert(SqList &L, int i, ElemType e) // L本身要发生改变所以要引用类型,e自定类型,或者int、float、double
{
int n;
if(i < 0 || i > L.length || L.length == MAXSIZE) /* 发生错误或者达到最大值,返回错误。 */
return 0;
for(n = L.length -1; n >= i; --n)
L.data[n + 1] = L.data[n]; /* 从前往后,按顺序将每一个元素往后移动一个位置 */
L.data[i] = e; /* 插入新元素 */
++(L.length); /* 表自增1 */
return 1;
}
删除
删除顺序表L中下标为n的元素,成功返回1,删除的元素赋值给e,否则失败返回0
ElemType DeleteElem(SqList &L, int n, ElemType &e)
{
int i;
if(n < 0 || n > L.length -1)
return 0;
e = L.data[n];
for(i = p;i < L.length - 1; ++i)
L.data[i] = L.data[i + 1];
--(L.length);
return 1;
}
[1] 程杰. 大话数据结构[M]. 北京:清华大学出版社, 2016.
[2] 率辉. 2019版数据结构高分笔记[M]. 北京:机械工业出版社, 2018.
[3] 严蔚敏, 吴伟民. 数据结构(C语言版)[M]. 北京:清华大学出版社,1998.