SeqList.h
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDatatype;//动态顺序表
typedef struct SeqList {SLDatatype* arr;int size;//有效数据个数int capacity;//空间容量
}SL;//将类型struct SeqList改为SL//顺序表的初始化
void SLInit(SL* s);//顺序表的销毁
void SLDestroy(SL* s);//增容
void SLCheckCapacity(SL* s);//顺序表的插入
void SLPushBack(SL* s, SLDatatype x);//尾插
void SLPushFront(SL* s, SLDatatype x);//头插//指定位置之前插入/删除数据
void SLInsert(SL* s, int pos, SLDatatype x);
void SLErase(SL* s, int pos);//删除//查找数据位置
int SLFind(SL* s, SLDatatype x);//顺序表插入数据的删除
void SLPopBack(SL* s);//删除尾部的数据
void SLPopFront(SL* s);//删除头部的数据//打印
void SLPrint(SL s);
SeqList.c
#include "SeqList.h"//初始化,接收的是地址
void SLInit(SL* s) {s->arr = NULL;s->size = 0;s->capacity = 0;
}//增容
void SLCheckCapacity(SL* s) {int NewCapacity = s->capacity == 0 ? 4 : 2 * s->capacity;//判断capacity是否为0,不为0就扩大2倍SLDatatype* tmp = (SLDatatype*)realloc(s->arr, NewCapacity * sizeof(SLDatatype));//空间增容//realloc有可能申请失败 if (tmp == NULL) {perror("realloc:");exit(1);//终止程序}//申请成功s->arr = tmp;s->capacity = NewCapacity;
}//销毁
void SLDestroy(SL* s) {if (s->arr) {free(s->arr);}s->arr = NULL;s->size = 0;s->capacity = 0;
}//尾插
void SLPushBack(SL* s, SLDatatype x) {assert(s);//判断指针有效性if (s->size == s->capacity) {//给空间增容SLCheckCapacity(s);}s->arr[s->size++] = x;//插入之后size要加1
}//头插
void SLPushFront(SL* s, SLDatatype x) {assert(s);//判断指针有效性if (s->size == s->capacity) {//给空间增容SLCheckCapacity(s);}/*int NewSize = s->size;while (NewSize) {s->arr[NewSize] = s->arr[NewSize - 1];NewSize--;}*/for (int i = s->size; i > 0; i--) {s->arr[i] = s->arr[i - 1];}s->arr[0] = x;s->size++;
}//打印
void SLPrint(SL s) {for (int i = 0; i < s.size; i++) {printf("%d ", s.arr[i]);}printf("\n");
}//尾删
void SLPopBack(SL* s) {assert(s);assert(s->size);s->size--;//减掉一位
}//头删
void SLPopFront(SL* s) {assert(s);assert(s->size);for (int i = 0; i < s->size - 1; i++) {s->arr[i] = s->arr[i + 1];}s->size--;
}//指定位置之前插入
void SLInsert(SL* s, int pos, SLDatatype x) {assert(s);//位置超出容量范围则终止程序if (pos > (s->capacity) || pos < 0)exit(1);//容量不够则增容if (s->capacity == s->size) {SLCheckCapacity(s);}for (int i = s->size; i > pos; i--) {s->arr[i] = s->arr[i - 1];}s->arr[pos] = x;s->size++;
}//删除指定位置的数据
void SLErase(SL* s, int pos) {assert(s);if (pos > (s->capacity) || pos < 0)exit(1);for (int i = pos; i < s->size; i++) {s->arr[i] = s->arr[i + 1];}s->size--;
}//查找数据的位置
int SLFind(SL* s, SLDatatype x) {assert(s);for (int i = 0; i < s->size; i++) {if (s->arr[i] == x) {return i;}}return 0;
}
Test.c
#include "SeqList.h"void Test01() {//SL s1;//SLInit(&s1);//SLPushBack(&s1, 4);//SLPushBack(&s1, 2);//SLPushBack(&s1, 8);//SLPushBack(&s1, 3);//SLPushBack(&s1, 7);//SLPrint(s1);///*SLPopFront(&s1);//SLPrint(s1);//SLPopFront(&s1);//SLPrint(s1);//SLPopBack(&s1);//SLPrint(s1);//SLPopBack(&s1);//SLPrint(s1);*///SLInsert(&s1, 3, 6);//SLPrint(s1);//SLErase(&s1, 0);//SLPrint(s1);//int position = SLFind(&s1, 6);//printf("%d", position);SL s;SLInit(&s);SLPushBack(&s, 5);SLPushBack(&s, 2);SLPushBack(&s, 8);SLPushBack(&s, 10);SLPushBack(&s, 22);SLPrint(s);SLPopBack(&s);SLPrint(s);SLPushFront(&s, 66);SLPrint(s);SLInsert(&s, 3, 77);SLPrint(s);
}int main() {Test01();return 0;
}