自己可以看看,带有注释,可以自行理解
#pragma once
#include<stdio.h>
#include<string.h>
#include <stdlib.h>
#define N 1000//动态顺序表
typedef int SLDateType;//通过用typedf来定义
typedef struct SeqList
{
SLDateType* a;//用数组来储存数据
int size;//表示数组中存储数据的个数
int capacity;//数组实际能存数据的空间多大
}SL;
//接口函数
void SeqListPrint(SL* ps);//数据的打印
void SeqListInit(SL* ps);//数据的初始化
void SeqListDestory(SL* ps);//数据的所有删除
void SepListCheckCapacity(SL* ps);//数据的扩容
void SeqListPuseBack(SL* ps, SLDateType x);//数据的插入
void SeqListPopBack(SL* ps);//数据的尾部元素删除
void SeqListPuseFront(SL* ps, SLDateType x);//数据的头部插入
void SeqListPopFront(SL* ps);//数据的头部元素的删除
//(所有变量都是指针,方便的访问)
#include"sjjg.h"
#include<assert.h>
void SeqListPrint(SL* ps) {
for (int i = 0;i < ps->size;++i) {
printf("%d", ps ->a[i]);//若是别的类型,就用该类型的打印方法
}
printf("\n");//换行符
}//打印出插入的数据
void SeqListInit(SL* ps) {
ps->a = NULL;
ps->size = ps->capacity = 0;
}//将数据初始化方便来回调用顺序表
void SeqListDestory(SL* ps) {
free(ps->a);
ps->a = NULL;
ps->capacity = ps->size = 0;
}//删除所有数据把空间归还给系统
void SepListCheckCapacity(SL* ps) {
// 如果没有空间,我们就扩容
if (ps->size == ps->capacity)//判断是否需要扩容
{
int newcapacity = ps->capacity == 0 ? 4 : ps->capacity * 2;//扩容两倍就可以了,大了可能会浪费空间,小了不够用
SLDateType* tmp = (SLDateType*)realloc(ps->a, newcapacity * sizeof(SLDateType));
if (tmp == NULL) {
printf("realloc fail\n");//小了,就输出扩容不够,失败
exit(-1);
}
ps->a = tmp;
ps->capacity = newcapacity;
}
}
void SeqListPuseBack(SL* ps, SLDateType x) {
SepListCheckCapacity( ps);//判断是否要扩容
ps->a[ps->size] = x;
ps->size++;
}//在数据后面插入数据
void SeqListPopBack(SL* ps) {
if(ps->size>0)
{
ps->size--;
}//直接ps->size--使尾部数据被消除
}//尾部删除数据
void SeqListPuseFront(SL* ps, SLDateType x) {
SepListCheckCapacity(ps);
int end = ps->size - 1;
while (end >= 0) {
ps->a[end + 1] = ps->a[end];
--end;
}
ps->a[0] = x;
ps->size++;
}//头部数据的插入
void SeqListPopFront(SL* ps) {
assert(ps->size > 0);
int begin = 1;//挪动数据
while (begin < ps->size) {
ps->a[begin - 1] = ps->a[begin];
++begin;
}
ps->size--;
}//头部数据的删除
#include"sjjg.h"
//leetcode--消失的数字
//1,排序后编及检验
//2,加起来后减去数组的元素之和,
//顺序表和链表
//顺序表本质就是数组,分为静态和动态,在数组的基础上数据必须连续。//静态的特点:如果满了就不要让插入
//N给小了不够用,给大了浪费
void TestSeqList() {
SL sl;
SeqListInit(&sl);
SeqListPuseBack(&sl, 1);
SeqListPuseBack(&sl, 2);
SeqListPuseBack(&sl, 3);
SeqListPrint(&sl);
SeqListDestory(&sl);
SeqListPopBack(&sl,10);
SeqListPrint(&sl);
}
void TestSeqList1() {
SL sl;
SeqListInit(&sl);
SeqListPuseBack(&sl, 1);
SeqListPuseBack(&sl, 2);
SeqListPuseBack(&sl, 3);
SeqListPrint(&sl);
SeqListPuseFront(&sl,10);
SeqListPuseFront(&sl, 20);
SeqListPuseFront(&sl, 30);
SeqListPrint(&sl);
SeqListPopFront(&sl);
SeqListPrint(&sl);
}
int main() {
TestSeqList();
TestSeqList1();
return 0;
}