目录
线性表:
线性表的概念:
线性表(linear list):是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列
它是一种在逻辑上连续的结构,但是它的物理结构不一定连续,通常以数组或者链式结构存储
顺序表:
顺序表的概念:
顺序表也是线性表的一种
表中元素一个接一个的存入一组连续的存储单元中,一般是用数组存储,在数组上完成数据的增删查改等操作
接下来我们就用c语言来模拟实现一下顺序表
顺序表的分类:
静态顺序表
静态版本的顺序表不能很好的根据我们的需求进行容量的更改
动态顺序表
动态顺序表可以根据我们想要的需求进行容量的更改,所以接下来我们来模拟创建动态的顺序表
顺序表的接口
基本的增删查改接口
//Seqlist.h
//头插
void seqlist_push_front(Seqlist* pphead);
//头删
void seqlist_pop_front(Seqlist* pphead);
//尾插
void seqlist_push_back(Seqlist* pphead);
//尾删
void seqlist_pop_back(Seqlist* pphead);
//在pos处之前插入
void seqlist_insert(Seqlist* pphead, size_t pos, SLDateType x);
//删除pos位置的数据
void seqlist_erase(Seqlist* pphead, size_t pos, SLDateType x);
//查找 (找到返回下标,没找到返回-1)
int seqlist_find(Seqlist* phead, SLDateType x);
//修改
void seqlist_modify(Seqlist* pphead, SLDateType x, SLDateType y);
除了增删查改,我们还需要一些额外的操作,比如初始化顺序表,打印顺序表,检查是否需要扩容等
额外的操作
//seqlist.h
//检查是否需要扩容
void Checkcapicity(Seqlist* s);
//初始化顺序表
void seqlist_init(Seqlist* s);
//打印顺序表
void seqlist_print(Seqlist* s);
//销毁顺序表
void seqlist_destroy(Seqlist* s);
顺序表接口的实现
Seqlist.h文件
//Seqlist.h
#pragma once
#include<stdio.h>
#include<stdlib.h>
#include<assert.h>
typedef int SeqDateType;
typedef struct Seqlist
{
SeqDateType* data;
size_t size;
size_t capicity;
}Seqlist;
//初始化顺序表
void Seqlistinit(Seqlist* s);
//销毁顺序表
void Seqlistdestroy(Seqlist* s);
//查找数据
int Seqfind(Seqlist* s, SeqDateType x);
//检查扩容
void CheckSeqcapicity(Seqlist* s);
//pos位置之前插入数据
void Seqlistinsert(Seqlist* s,size_t pos, SeqDateType* data);
//删除pos位置数据
void Seqlisterase(Seqlist* s, size_t pos);
//头插
void Seqlistpush_front(Seqlist* s, SeqDateType x);
//头删
void Seqlistpop_front(Seqlist* s);
//尾插
void Seqlistpush_back(Seqlist* s, SeqDateType x);
//尾删
void Seqlistpop_back(Seqlist* s);
//打印顺序表
void Seqprint(Seqlist* s);
Seqlist.c文件
//Seqlist.c
#include"Seqlist.h"
//初始化顺序表
void Seqlistinit(Seqlist* s) //初始化的时候给4个容量
{
assert(s);
s->capicity = 4;
s->size = 0;
s->data = (SeqDateType*)malloc(sizeof(SeqDateType) * 4);
if (s->data == NULL)
{
printf("malloc faild\n");
exit(0);
}
}
//销毁顺序表
void Seqlistdestroy(Seqlist* s)
{
assert(s);
free(s->data);
s->size = 0;
s->capicity = 0;
}
//查找数据 返回下标,没找到返回-1
int Seqfind(Seqlist* s, SeqDateType x)
{
assert(s);
for (int i = 0; i < s->size; i++)
{
if (s->data[i] == x)
{
return i;
}
}
return -1;
}
//检查扩容
void CheckSeqcapicity(Seqlist* s)
{
assert(s);
if (s->size == s->capicity)
{
size_t newcapicity = s->capicity * 2;
SeqDateType* newdata = (SeqDateType*)realloc(s->data, sizeof(SeqDateType) * newcapicity);
if (newdata == NULL)
{
printf("realloc faild\n");
exit(0);
}
s->data = newdata;
s->capicity = newcapicity;
}
}
//pos位置之前插入数据
void Seqlistinsert(Seqlist* s, size_t pos, SeqDateType* data)
{
assert(s);
assert(pos <= s->size);
CheckSeqcapicity(s);
s->size++;
for (int i = s->size - 1; i > pos; i--)
{
s->data[i] = s->data[i - 1];
}
s->data[pos] = data;
}
//删除pos位置数据
void Seqlisterase(Seqlist* s, size_t pos)
{
assert(s);
assert(pos < s->size);
s->size--;
for (int i = pos; i < s->size; i++)
{
s->data[i] = s->data[i + 1];
}
}
//头插
void Seqlistpush_front(Seqlist* s, SeqDateType x)
{
assert(s);
Seqlistinsert(s, 0, x);
}
//头删
void Seqlistpop_front(Seqlist* s)
{
assert(s);
Seqlisterase(s, 0);
}
//尾插
void Seqlistpush_back(Seqlist* s, SeqDateType x)
{
assert(s);
CheckSeqcapicity(s);
Seqlistinsert(s, s->size, x);
}
//尾删
void Seqlistpop_back(Seqlist* s)
{
assert(s);
Seqlisterase(s, s->size - 1);
}
//打印顺序表
void Seqprint(Seqlist* s)
{
assert(s);
for (int i = 0; i < s->size; i++)
{
printf("%d ", s->data[i]);
}
printf("\n");
}