C语言实现顺序表
目录:
- 前言
- 一.顺序表是什么?
- 二.顺序表的接口实现
- 1.自定义顺序表:struct SeqList
- 2.顺序表的初始化:SeqListInit
- 3.顺序表的容量检查:SeqListCheckCapacity
- 4.顺序表在尾上插入数:SeqListPushBack
- 5.顺序表的头头插入:SeqListPushFront
- 6.顺序表的尾上删除:SeqListPopBack
- 7.顺序表的头上的删除:SeqListPopFront
- 8.顺序表的数据查找:SeqListFind
- 9.顺序表的任意位置插入数据:SeqListInsert
- 10.顺序表的任意位置删除:SeqListErase
- 11.顺序表的显示数据:SeqListShow
- 12.顺序表的销毁:SeqListDestory
- 13.顺序表的查找数据:SeqListModify
- 总结
前言
线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
一.顺序表是什么?
1.顺序表的概念及结构
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
顺序表分类:
1.静态顺序表:使用定长数组存储元素
代码如下
顺序表的静态存储
#define M 10
typedef int SLDataType;
typedef struct SeqList
{
SLDataType a[M];//定长数组
int size;//有效数据的个数
}SeqList;
2.动态顺序表:使用动态开辟的数组存储
代码如下
//顺序表的动态存储
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* a; //指向动态开辟的数组
size_t size; //有效数据个数
size_t capacity; //容量空间的大小
}SeqList;
二.顺序表的接口实现
1.自定义顺序表:struct SeqList
代码如下
typedef int SLDataType;
typedef struct SeqList
{
SLDataType* a; //指向动态开辟的数组
int size; //有效数据个数
int capacity; //容量
}SeqList;
2.顺序表的初始化:SeqListInit
代码如下
void SeqListInit(SeqList* psl)
{
assert(psl);
psl->a = NULL;
psl->capacity = psl->size= 0;
}
3.顺序表的容量检查:SeqListCheckCapacity
代码如下
void SeqListCheckCapacity(SeqList* psl)
{
//检查容量
if (psl->size == psl->capaCity)//满了
{
int newCapacity = psl->capaCity == 0 ? 4 : psl->capaCity * 2;
SLDataType* tmp = (SLDataType*)relloc(psl->a, newCapacity * sizeof(SLDataType));
if (tmp == NULL)//扩容失败
{
perror("relloc fail");
exit(-1);
}
psl->capaCity = newCapacity;
psl->a = tmp;
}
}
4.顺序表在尾上插入数:SeqListPushBack
代码如下
void SeqListPushBack(SeqList* psl,SLDataType x)
{
assert(psl);
void CheckCapaCity(psl);
psl->a[psl->size] = x;
psl->size++;
}
5.顺序表的头头插入:SeqListPushFront
代码如下
```c
void SeqListPushFront(SeqList* psl, SLDataType x)
{
assert(psl);
void CheckCapaCity(psl);
int end = psl->size - 1;
while (end >= 0)
{
psl->a[end + 1] = psl->a[end];
--end;
}
psl->a[0] = x;
psl->size++;
}
6.顺序表的尾上删除:SeqListPopBack
注意:如果一直删 可能出现删空情况 应加以判断。
代码如下
void SeqListPopBack(SeqList* psl)
{
assert(psl);
psl->size--;
if (psl->size == 0)//判空
{
return;
}
}
7.顺序表的头上的删除:SeqListPopFront
代码如下
void SeqListPopFront(SeqList* psl)
{
assert(psl);
int begin = 0;
while (begin < psl->size - 1)
{
psl->a[begin] = psl->a[begin + 1];
begin++;
}
psl->size--;
}
8.顺序表的数据查找:SeqListFind
代码如下
int SeqListFind(SeqList* psl,SLDataType x)
{
assert(psl);
for(int i=0;i<psl->size;i++)
{
if(psl->a[i]==x)
{
return i;
}
}
return -1;
}
9.顺序表的任意位置插入数据:SeqListInsert
代码如下
void SeqListInsert(SeqList* psl, size_t pos, SLDataType x)
{
void CheckCapacity(psl);
assert(psl);
assert(pos <= psl->size);
size_t end = psl->size;
while (end > pos)
{
psl->a[end] = psl->a[end-1];
--end;
}
psl->a[pos] = x;
psl->size++;
}
10.顺序表的任意位置删除:SeqListErase
代码如下
void SeqListErase(SeqList* psl, size_t pos)
{
assert(psl);
assert(pos < psl->size);
size_t begin = pos;
while (begin < psl->size - 1)//删后结束位置
{
psl->a[begin] = psl->a[begin + 1];//从前往后
++begin;
}
psl->size--;
}
11.顺序表的显示数据:SeqListShow
代码如下
void SeqListShow(SeqList* psl)
{
assert(psl);
for(int i=0;i<psl->size;i++)
{
printf("%d ",psl->size[i]);
}
printf("\n");
}
12.顺序表的销毁:SeqListDestory
代码如下
void SeqListDestory(SeqList* psl)
{
assert(psl);
free(psl);
psl->a = NULL;
psl->size = psl->capaCity = 0;
}
13.顺序表的查找数据:SeqListModify
代码如下
void SeqListModify(SeqList* psl,size_t pos,SLDataType x)
{
assert(psl);
assert(pos<psl->size);
psl->a[pos]=x;
}
总结
以上就是我对数据结构中线性表的一种顺序表的认识。(遇到问题多多画图) 如有问题,请大家帮忙指出。
猛学则强,冲鸭!