目录
// SeqList.h #pragma once #include#include #include typedef int SLDateType; typedef struct SeqList { SLDateType* a; int size; int capacity; }SeqList; // 对数据的管理:增删查改 void SeqListInit(SeqList* ps); void SeqListDestroy(SeqList* ps); void SeqListPrint(SeqList* ps); void SeqListPushBack(SeqList* ps, SLDateType x); void SeqListPushFront(SeqList* ps, SLDateType x); void SeqListPopFront(SeqList* ps); void SeqListPopBack(SeqList* ps); // 顺序表查找 int SeqListFind(SeqList* ps, SLDateType x); // 顺序表在pos位置插入x void SeqListInsert(SeqList* ps, int pos, SLDateType x); // 顺序表删除pos位置的值 void SeqListErase(SeqList* ps, int pos);
- #define _CRT_SECURE_NO_WARNINGS
- #include
- #include
- typedef int SLDataType;
- typedef struct SeqList {
- SLDataType* a;
- int size;
- int capacity;
- }SL;
-
- void SLInit(SL* psl);
- void SLDestory(SL* psl);
- void SLPrint(SL* psl);
- void SLPushBack(SL* psl, SLDataType x);
- void SLCheckCapacity(SL* psl);
- void SLPushFront(SL* psl, SLDataType x);
- void SLPopBack(SL* psl);
- void SLInsert(SL* psl, int pos, SLDataType x);
- void SLErase(SL* psl, int pos);
- int SLFind(SL* psl, SLDataType x);
- #define _CRT_SECURE_NO_WARNINGS
- #include"SeqList.h"
- #include"assert.h"
- //初始化
- void SLInit(SL* psl) {
- psl->a = NULL;
- psl->size = 0;
- psl->capacity = 0;
- }
-
-
-
- //销毁
- void SLDestory(SL* psl) {
- if (psl->a != NULL) {
- free(psl->a);
- psl->a = 0;
- psl->size = 0;
- psl->capacity = 0;
- }
- }
1.先判满了,是否有效个数等于空间总数,如果等于判空间是否为空
2.空了的话,先给capacity赋初值为4,不为空则给空间动态扩容两倍
- //封装函数
- void SLCheckCapacity(SL* psl) {
- assert(psl);
- if (psl->size == psl->capacity) { //当空间满了,即数据个数等于容量
- int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;//当容量为0的时候扩容也为0,所以当capacity==0时给他赋初值4个空间,不为0扩容两倍
- SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType) * newcapacity);
- if (tmp == NULL) { //如果扩容失败返回realloc fail
- perror("realloc fail");
- return 0;
- }
- psl->a = tmp; //用tmp接收的原因是,如果ralloc开辟失败,用psl->a接收会导致原始地址丢失
- psl->capacity = newcapacity;
- }
- }
-

- //尾插
- void SLPushBack(SL* psl,SLDataType x){
- assert(psl);
- SLCheckCapacity(psl);
- psl->a[psl->size] = x;
- psl->size++;
- }
for循环遍历一遍数组,并打印
- //打印
- void SLPrint(SL* psl) {
- for (int i = 0; i < psl->size; i++) {
- printf("%d ", psl->a[i]);
- }
- printf("\n");
- }

- //头插
- void SLPushFront(SL* psl, SLDataType x) {
- assert(psl);
- SLCheckCapacity(psl);
- int end = psl->size - 1;
- while (end >= 0) {
- psl->a[end + 1] = psl->a[end];
- --end;
- }
- psl->a[0] = x;
- psl->size++;
- }
- //尾删
- void SLPopBack(SL* psl) {
- assert(psl);
- /*if (psl->size == 0) {
- return;
- }*/
- assert(psl->size> 0);
- psl->size--;
-
-
- }

- //头删法
- void SLPopFront(SL* psl) {
-
- assert(psl);
- int begin = 0;
- while (begin <= psl->size - 1) {
- psl->a[begin] = psl->a[begin+1];
- ++begin;
- }
- psl->size--;
-
- }

- //指定下标位置插入
- void SLInsert(SL* psl, int pos, SLDataType x) {
- assert(psl);
- assert(pos >= 0 && pos <= psl->size);
- SLCheckCapacity(psl);
- int end = psl->size - 1;
- while (end >= pos) {
- psl->a[end + 1] = psl->a[end];
- --end;
- }
- psl->a[pos] = x;
- psl->size++;
- }

- void SLErase(SL* psl, int pos) {
- assert(psl);
- assert(pos>=0&&pos
size); - int begin = pos + 1;
- while (begin < psl->size) {
- psl->a[begin - 1] = psl->a[begin];
- ++begin;
- }
- psl->size--;
-
- }
用for循环遍历一遍,如果i的值等于x则返回下标i;
- //按值查找下标
- int SLFind(SL* psl, SLDataType x) {
- assert(psl);
- for (int i = 0; i <= psl->size - 1; i++) {
- if (psl->a[i] == x) {
- return i;
- }
- }
- return -1;
- }
- #define _CRT_SECURE_NO_WARNINGS
- #include
- #include"SeqList.h"
-
-
- void TestL1() {
- SL sl; //SL是结构体名,sl是创建一个类,用来测试
- SLInit(&sl);
- SLPushBack(&sl, 1); //插入数据
- SLPushBack(&sl, 2);
- SLPushBack(&sl, 3);
- SLPushBack(&sl, 4);
- SLPushBack(&sl, 5);
- SLPushBack(&sl, 6);
- SLPushBack(&sl, 7);
- SLPushBack(&sl, 8);
- SLPushBack(&sl, 9);
- SLPrint(&sl);
- SLPushFront(&sl, 10);
- SLPushFront(&sl, 20);
- SLPushFront(&sl, 30);
- SLPushFront(&sl, 40);
- SLPrint(&sl);
- SLPopBack(&sl);
- SLPopBack(&sl);
- SLPopBack(&sl);
- SLPopBack(&sl);
- SLPrint(&sl);
- SLDestory(&sl);
- }
- void TestL2() {
- SL sl; //SL是结构体名,sl是创建一个类,用来测试
- SLInit(&sl);
- SLPushBack(&sl, 1); //插入数据
- SLPushBack(&sl, 2);
- SLPushBack(&sl, 3);
- SLPushBack(&sl, 4);
- SLPushBack(&sl, 5);
- SLPushBack(&sl, 6);
- SLPushBack(&sl, 7);
- SLPushBack(&sl, 8);
- SLPushBack(&sl, 9);
- SLPrint(&sl);
-
- SLInsert(&sl, 2, 10);
- SLPrint(&sl);
-
- SLErase(&sl, 3);
- SLPrint(&sl);
- SLFind(&sl, 4);
- SLPrint(&sl);
-
- }
- int main() {
- TestL2();
- }
