线性表之顺序表(数据结构)(VS)(C语言)(SeqList)

207 阅读3分钟

前言

  这是我由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;
}

效果

在这里插入图片描述


看完给个关注,多谢了!!!

在这里插入图片描述