线性表的定义
线性表是零个或多个数据元素的有限序列,而线性表又分为顺序存储结构和链式存储结构两种。
- 首元素无前驱
- 尾元素无后继
- 中间元素只有一个前驱和一个后继
线性表的顺序存储结构
#define MAX_SIZE 100 //线性表最多能存放多少个数据
typedef int ElemType; //以后可直接再次出修改 类型
typedef struct
{
ElemType data[MAX_SIZE]; //数据
int length; //线性表的表长
}SList;
注意线性表的长度和数组的长度,线性表的长度不能大于数组的长度
线性表的操作
//线性表的初始化
void SListInit(SList* L);
//打印表
void SListPrint(SList* L);
//头插
void SListPushFront(SList* L, ElemType val);
//尾插
void SListPushBack(SList* L,ElemType val);
//找到val在表中的位置 找不到报错
int SListFind(SList* L, ElemType val);
//头删
void SListPopFront(SList* L);
//尾删
void SListPopBack(SList* L);
//线性表的插入 在 src 的位置上插入
void SListInsert(SList* L,ElemType src, ElemType val);
//线性表的删除
void SListDele(SList* L, ElemType val);
//线性表的修改 将src的值 修改成 val
void SListModify(SList* L, ElemType src, ElemType val);
//销毁线性表
void SListDestroy(SList* L);
//是否为空 为空 则返回 true 否则 返回 false
bool SListEmpty(SList* L);
以上就是一些用的操作函数了。
这些函数的实现主要用到的也就是数组的知识了。
1.插入
首先,判断数组长度是否可以再插入。
然后,找到需要插入的位置即可
void SListInsert(SList* L,ElemType src, ElemType val)
{
assert(L->length <= MAX_SIZE);
//找到合适的位置
int index = SListFind(L, src);
int i;
//将所有元素全部向后移动
for (i = L->length; i >= index; i--)
{
L->data[i+1] = L->data[i];
}
//最后插入
L->data[index] = val;
L->length++;
}
2.删除
而删除与插入正好是相反的,只需要找到和是的位置,然后直接将所有的元素向前移动即可。
//线性表的删除
void SListDele(SList* L, ElemType val)
{
//无元素则无需删
assert(L->length != 0);
//找到合适的位置
int index = SListFind(L, val);
int i;
//向前挪动
for (i = index; i < L->length-1; i++)
{
L->data[i] = L->data[i+1];
}
L->length--;
}
总结
用数组来首先线性表其实是一个很简单的数据结构,增删查改。但是你会发现就是在增和删的时候,会有大量的数据进行前移或后移,要是数据元素多的情况下,会大大消耗时间,并不是很好。
所以在此基础上又引出了链式存储结构------链表
- 最坏情况下:
- 插入 O(n)
- 删除 O(n)
- 按位查找 O(1)
- 按值查找 O(n)