目录
定义
线性表表的的顺序存储结构,指的是用一段地址连续的存储单元依次存储线性表的数据元素。
如下:
线性表中每个数据元素的类型都相同,在c语言中,用一维数组来实现顺序存储结构
线性表的顺序存储的结构代码
typedef int SQdataType; typedef struct SeqList { SQdataType *data; //后面用动态开辟的方法对其进行开辟 int size; //线性表当前长度 int capacity; //线性表当前的内存容量 }SL;
顺序存储的结构需要三个要素:
1.存储空间的起始位置
2.线性表的存储容量:capacity
3.线性表的当前长度:size
所应具备的功能
//初始化 void SeqListInit(SL* ps); //尾插 void SeqListPushBack(SL* ps, SQdataType x); //头插 void SeqListPushFront(SL* ps, SQdataType x); //尾删 void SeqListPopBack(SL* ps, SQdataType x); //头删 void SeqListPopFront(SL* ps, SQdataType x); //任意位置的插入 void SeqListInsert1(SL* ps, int i, SQdataType x); void SeqListInsert2(SL* ps, int i, SQdataType x); //删除任意位置 void SeqListDelete1(SL* ps, int i, SQdataType x); void SeqListDelete2(SL* ps, int i, SQdataType x); //空间销毁 void SeqListDestory(SL* ps); //查 int SeqListSearch(SL* ps,SQdataType x); //改 void SeqListModify(SL* ps, SQdataType);
1.初始化
void SeqListInit(SL* ps) { ps->data = NULL; ps->size = 0; ps->capacity = 0; }
2.插入新元素
在增加元素前,应对容量进行检查,如果容量不够,应ralloc更大的空间
void SeqListCheckCapacity(SL* ps) { if (ps->size == ps->capacity) //判断元素是否达到最大容量 { int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//若容量为零开辟4个空间 SQdataType* tmp = realloc(ps->data, sizeof(SQdataType) * newcapacity); if (tmp == NULL) //判断是否开辟成功 { printf("realloc fail\n"); exit(-1); } else //开辟成功 { ps->data = tmp; capacity=newcapacity; } } }
(1)在开头插入新元素
void SeqListPushFront(SL* ps, SQdataType x) { SeqListCheckCapacity(&ps);//插入前进行容量检查 int end = ps->size - 1; while (end >= 0) { ps->data[end + 1] = ps->data[end]; end--; } ps->size++; ps->data[0] = x; }
(2)在结尾插入新元素
void SeqListPushBack(SL* ps, SQdataType x) { SeqListCheckCapacity(&ps);//插入前进行容量检查 ps->data[ps->size] = x; ps->size++; }
(3)在任意处插入新元素
思路一:
void SeqListInsert1(SL* ps, int i, SQdataType x) { SeqListCheckCapacity(&ps); int k; if (i<1 || i>ps->size + 1) { printf("error\n"); return; } if (i <= ps->size) { for (k = ps->size - 1; k >= i - 1; k--) ps->data[k + 1] = ps->data[k]; } ps->data[i - 1] = x; ps->size++; }
思路二:
void SeqListInsert2(SL* ps, int i, SQdataType x) { SeqListCheckCapacity(&ps); assert(i< ps->size); int end = ps->size - 1; i -= 1; while (end >= i) { ps->data[end + 1] = ps->data[end]; --end; } ps->data[i - 1] = x; ps->size++; }
2.删除元素
(1)开头删除
void SeqListPopFront(SL* ps) { assert(ps->size > 0); int start = 1; while (start < ps->size) { ps->data[start - 1] = ps->data[start]; ++start; } ps->size--; }
(2)尾部删除
void SeqListPopBack(SL* ps) { assert(ps->size > 0); ps->size--; }
(3)任意位置删除
思路一:
void SeqListDelete1(SL* ps, int i, SQdataType x) { SeqListCheckCapacity(&ps); int k; if (i<1 || i>ps->size) { printf("error\n"); return; } if (i < ps->size) { for (k = i; k < ps->size; k++) ps->data[k - 1] = ps->data[k]; } ps->size--; }
思路二:
void SeqListDelete2(SL* ps, int i, SQdataType x) { int end = ps->size - 1; assert(i >= end); while (end > i) { ps->data[i - 1] = ps->data[i]; --i; } ps->size--; }
3.查找元素
int SeqListSearch(SL* ps,SQdataType x) { for (int i = 0; i < ps->size; i++) { if (ps->data[i] == x) return i; } return -1; }
4.修改元素
void SeqListModify(SL* ps, int pos, SQdataType x) { assert(pos < ps->size-1); ps->data[pos - 1] = x; }
线性表顺序存储结构的优缺点
优点:
无需为表示表中的元素之间的逻辑关系而增加额外的存储空间。
可以快速地存表中任一位置的元素。
缺点:
插入和删除操作需要移动大量元素