目录
SeqList.h
//SeqList.h
#pragma once
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#define IN_CY 3
typedef int SLdataType;
typedef struct SeqList
{
SLdataType* a;
int size;
int capacity;
}SeqList;
//初始化函数
void SeqListInit(SeqList* ps);
//销毁函数
void SeqListDestory(SeqList* ps);
//尾插
void SeqListPushBack(SeqList* ps, SLdataType x);
//尾删
void SeqListPopBack(SeqList* ps);
//打印函数
void print(SeqList* ps);
//头插
void SeqListPushFront(SeqList* ps, SLdataType x);
//头删
void SeqListPopFront(SeqList* ps);
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLdataType x);
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos);
SeqList.c
//SeqList.C
#include "SeqList.h"
//初始化顺序表
void SeqListInit(SeqList* ps)
{
assert(ps);
ps->size = 0;
ps->capacity = 3;
ps->a = (SLdataType*)malloc(sizeof(SLdataType) * ps->capacity);
//申请空间失败
if (ps->a == NULL)
{
perror("SeqListInit");
exit(-1);
}
}
//销毁顺序表
void SeqListDestory(SeqList* ps)
{
assert(ps);
ps->size = 0;
ps->capacity = 0;
free(ps->a);
ps->a = NULL;
}
//容量检查
void SLCheckCapacity(SeqList* ps)
{
assert(ps);
if (ps->size == ps->capacity)
{
ps->capacity += IN_CY;
SLdataType* tmp = (SLdataType*)realloc(ps->a, sizeof(SLdataType) * ps->capacity);
//申请空间失败
if (tmp == NULL)
{
perror("SLCheckCapacity");
exit(-1);
}
ps->a = tmp;
}
}
//尾插
void SeqListPushBack(SeqList* ps, SLdataType x)
{
assert(ps);
SLCheckCapacity(ps);
ps->a[ps->size++] = x;
}
//尾删
void SeqListPopBack(SeqList* ps)
{
assert(ps);
assert(ps->size);
ps->size--;
}
//打印顺序表
void print(SeqList* ps)
{
assert(ps);
int i;
for (i = 0; i < ps->size; i++)
{
printf("%d ", ps->a[i]);
}
printf("\n");
}
//头插
void SeqListPushFront(SeqList* ps, SLdataType x)
{
assert(ps);
SLCheckCapacity(ps);
int end = ps->size;
while (end--)
{
ps->a[end + 1] = ps->a[end];
}
ps->size++;
ps->a[0] = x;
}
//头删
void SeqListPopFront(SeqList* ps)
{
assert(ps);
assert(ps->size);
int i;
for (i = 0; i < ps->size - 1; i++)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLdataType x)
{
assert(ps);
//下标合法检查
assert(pos>= 0 & ps->size);
SLCheckCapacity(ps);
int end = ps->size;
while (end >= pos)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->size++;
ps->a[pos] = x;
}
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{
assert(ps);
//下标合法检查
assert(pos >= 0 && pos < ps->size);
int i;
for (i = pos; i < ps->size - 1; i++)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
头插尾插复用任意位置插入
// 顺序表在pos位置插入x
void SeqListInsert(SeqList* ps, int pos, SLdataType x)
{
assert(ps);
//下标合法检查
assert(pos>= 0 & ps->size);
SLCheckCapacity(ps);
int end = ps->size;
while (end >= pos)
{
ps->a[end + 1] = ps->a[end];
end--;
}
ps->size++;
ps->a[pos] = x;
}
//头插
void SeqListPushFront(SeqList* ps, SLdataType x)
{
SeqListInsert(ps, 0, x);
}
//尾插
void SeqListPushBack(SeqList* ps, SLdataType x)
{
SeqListInsert(ps, ps->size, x);
}
头删尾删复用任意位置删除
// 顺序表删除pos位置的值
void SeqListErase(SeqList* ps, int pos)
{
assert(ps);
//下标合法检查
assert(pos >= 0 && pos < ps->size);
int i;
for (i = pos; i < ps->size - 1; i++)
{
ps->a[i] = ps->a[i + 1];
}
ps->size--;
}
//头删
void SeqListPopFront(SeqList* ps)
{
SeqListErase(ps, 0);
}
//尾删
void SeqListPopBack(SeqList* ps)
{
SeqListErase(ps, ps->size - 1);
}
SLtest.c
//SLtest.c
#include "SeqList.h"
void SLtest1()
{
SeqList s1;
SeqListInit(
SeqListPushBack(
SeqListPushBack(
SeqListPushBack(
print(
SeqListPushBack(
SeqListPushBack(
print(
SeqListPopBack(
SeqListPopBack(
SeqListPopBack(
SeqListPopBack(
SeqListPopBack(
print(
SeqListDestory(
}
void SLtest2()
{
SeqList s1;
SeqListInit(
SeqListPushFront(
SeqListPushFront(
SeqListPushFront(
print(
SeqListPushFront(
SeqListPushFront(
print(
//SeqListPopFront(
//SeqListPopFront(
SeqListPopFront(
print(
SeqListPopFront(
print(
SeqListPopFront(
print(
SeqListPopFront(
print(
SeqListDestory(
}
void SLtest3()
{
SeqList s1;
SeqListInit(
SeqListInsert(
SeqListInsert(
SeqListInsert(
print(
SeqListInsert(&s1, s1.size, 4);
SeqListInsert(&s1, s1.size, 5);
SeqListInsert(&s1, s1.size, 6);
print(
SeqListInsert(
print(
SeqListErase(&s1, s1.size - 1);
print(
}
int main()
{
//测试尾插尾删
//SLtest1();
//测试头插头删
//SLtest2();
//测试任意位置插入删除
SLtest3();
return 0;
}
测试示例
尾插:
尾删:
头插:
头删:
任意位置插入:
任意位置删除: