前言
这是我由C语言写的顺序表,希望对大家有帮助。
1.SeqListMain.c
#include "SeqList.h"
// 测试1
void SLTest1()
{
SL sl;
SL* ps = &sl;
SLInit(ps);
SLPushBack(ps, 1);
SLPushBack(ps, 1);
SLPushBack(ps, 1);
SLPushBack(ps, 1);
SLPushFront(ps, 2);
SLPushFront(ps, 3);
SLPushFront(ps, 3);
SLPopBack(ps);
SLPopBack(ps);
SLPopBack(ps);
SLPopBack(ps);
SLPopBack(ps);
SLPrint(ps);
SLDestroy(ps);
}
// 测试2
void SLTest2()
{
SL sl;
SL* ps = &sl;
SLInit(ps);
SLPushFront(ps, 1);
SLPushFront(ps, 1);
SLPushFront(ps, 1);
SLPushFront(ps, 1);
SLPushFront(ps, 2);
SLPushFront(ps, 3);
SLPrint(ps);
SLPopFront(ps);
SLPrint(ps);
SLDestroy(ps);
}
// 测试3
void SLTest3()
{
SL sl;
SL* ps = &sl;
SLInit(ps);
SLPushFront(ps, 1);
SLPrint(ps);
int i = SLFind(ps,1);
printf("%d\n", i);
printf("%d\n", sl.sl[i]);
i = SLFind(ps, 1);
printf("%d\n", i);
SLDestroy(ps);
}
// 测试4
void SLTest4()
{
SL sl;
SL* ps = &sl;
SLInit(ps);
SLPushBack(ps, 1);
SLPushBack(ps, 1);
SLPushBack(ps, 1);
SLPrint(ps);
SLInsert(ps, 3, 3);
SLPrint(ps);
SLErase(ps, 2);
SLPrint(ps);
SLDestroy(ps);
}
// 测试5
void SLTest5()
{
SL sl;
SL* ps = &sl;
SLInit(ps);
SLDestroy(ps);
SLPushBack(ps, 1);
SLPrint(ps);
SLDestroy(ps);
}
// 测试6
void SLTest6()
{
SL sl;
SL* ps = &sl;
SLInit(ps);
SLPushBack(ps, 1);
SLPrint(ps);
SLModify(ps, 0, 2);
SLPrint(ps);
SLDestroy(ps);
}
// 主函数
int main(void)
{
printf("SLTest1:\n");
SLTest1();
printf("SLTest2:\n");
SLTest2();
printf("SLTest3:\n");
SLTest3();
printf("SLTest4:\n");
SLTest4();
printf("SLTest5:\n");
SLTest5();
printf("SLTest6:\n");
SLTest6();
return 0;
}
2.SeqList.h
#pragma once
#define _CRT_SECURE_NO_WARNINGS 1
//_CRT_SECURE_NO_WARNINGS
// 头文件的引用
#include <stdio.h>
#include <assert.h>
#include <stdlib.h>
#include <stdbool.h>
// 顺序表中的类型
typedef int SLDateType;
// 顺序表的结构体
typedef struct SeqList
{
SLDateType* sl;
size_t size;
size_t capacity;
}SL;
// 对数据的管理:
// 初始化顺序表
void SLInit(SL* ps);
// 删除所有数据
void SLDestroy(SL* ps);
// 打印所有数据
void SLPrint(const SL* ps);
// 顺序表的最后处增加
void SLPushBack(SL* ps, SLDateType x);
// 顺序表的最前处增加
void SLPushFront(SL* ps, SLDateType x);
// 顺序表的最前处删除
void SLPopFront(SL* ps);
// 顺序表的最后处删除
void SLPopBack(SL* ps);
// 顺序表查找数据
int SLFind(SL* ps, SLDateType x);
// 顺序表在pos位置插入x
void SLInsert(SL* ps, size_t pos, SLDateType x);
// 顺序表删除pos位置的值
void SLErase(SL* ps, size_t pos);
//顺序表修改pos位置的值
void SLModify(SL* ps, size_t pos, SLDateType x);
3.SeqList.c
#include "SeqList.h"
//检查顺序表容量
static int SLCheckCapactiy(SL* ps)
{
if (ps->size == ps->capacity)
{
size_t tmp_capacity = ps->capacity == 0 ? 4 : ps->capacity * 2;
SLDateType* ptmp_sl = (SLDateType*)realloc(ps->sl, sizeof(SLDateType) * tmp_capacity);
if (ptmp_sl)
{
ps->sl = ptmp_sl;
ps->capacity = tmp_capacity;
return 0;
}
else
{
perror("SLCheck");
return 1;
}
}
return 0;
}
// 初始化顺序表
void SLInit(SL* ps)
{
assert(ps);
ps->sl = NULL;
ps->capacity = ps->size = 0;
}
// 删除所有数据
void SLDestroy(SL* ps)
{
assert(ps);
if (ps->sl)
{
free(ps->sl);
ps->sl = NULL;
ps->capacity = ps->size = 0;
}
}
// 打印所有数据
void SLPrint(const SL* ps)
{
assert(ps);
size_t i;
for (i = 0;i < ps->size; i++)
printf("%d ", ps->sl[i]);
printf("\n");
}
// 顺序表的最后处增加
void SLPushBack(SL* ps, SLDateType x)
{
assert(ps);
if (SLCheckCapactiy(ps)) { return; }
ps->sl[ps->size] = x;
ps->size++;
}
// 顺序表的最前处增加
void SLPushFront(SL* ps, SLDateType x)
{
assert(ps);
if (SLCheckCapactiy(ps)) { return; }
size_t i = ++ps->size;
while (i)
{
ps->sl[i] = ps->sl[i - 1];
i--;
}
ps->sl[0] = x;
}
// 顺序表的最前处删除
void SLPopFront(SL* ps)
{
assert(ps);
/*assert(ps->size != 0);
if (SLCheckCapactiy(ps)) { return; }
size_t i;
for (i = 0;i < ps->size;i++)
ps->sl[i] = ps->sl[i + 1];
ps->size--;*/
SLErase(ps, 0);
}
// 顺序表的最后处删除
void SLPopBack(SL* ps)
{
assert(ps);
/*assert(ps->size != 0);
if (SLCheckCapactiy(ps)) { return; }
ps->size--;*/
SLErase(ps, ps->size - 1);
}
// 顺序表查找数据
int SLFind(SL* ps, SLDateType x)
{
size_t i;
for (i = 0;i < ps->size; i++)
if (ps->sl[i] == x)
return i;
return -1;
}
// 顺序表在pos位置插入x
void SLInsert(SL* ps, size_t pos, SLDateType x)
{
assert(ps);
assert(pos <= ps->size);
if (SLCheckCapactiy(ps)) { return; }
size_t end = ps->size++;
while (pos < end)
{
ps->sl[end] = ps->sl[end - 1];
end--;
}
ps->sl[pos] = x;
}
// 顺序表删除pos位置的值
void SLErase(SL* ps, size_t pos)
{
assert(ps);
assert(pos <= ps->size);
size_t end = --ps->size;
while (pos < end)
{
ps->sl[pos] = ps->sl[pos + 1];
pos++;
}
}
//顺序表修改pos位置的值
void SLModify(SL* ps, size_t pos, SLDateType x)
{
assert(ps);
assert(pos <= ps->size);
ps->sl[pos] = x;
}