顺序表的增删查改的代码实现(头文件 实现 测试)

本文详细介绍了如何使用C语言实现顺序表(SeqList)的数据结构,包括初始化、数据打印、动态扩容、插入(头插、尾插、指定位置)、删除(头删、尾删、指定位置)以及顺序表的销毁过程。
摘要由CSDN通过智能技术生成

 头文件:SeqList.h

#include<stdio.h>
#include<stdlib.h>
#include<assert.h>

//实现顺序表的基本单位:数组(静态顺序表 动态顺序表)
typedef int SLDataType;//数据类型
typedef struct SeqList
{
	int capacity;//顺序表的大小
	int size;//有效数据个数
	SLDataType* arr;//动态柔性数组
}SL;//定义结构体时方便


//数据初始化
SL SLInit(SL* s);

//数据打印
void Print(SL s);

//数据开辟or扩容
void SLCheckCapacity(SL* s);

//数据插入 头插/尾插
void SLPushFront(SL* s, SLDataType x);
void SLPushBack(SL* s, SLDataType x);

//数据删除 头删/尾删
void SLPopFront(SL* s);
void SLPopBack(SL* s);

//指定位置的插入or删除
//在指定位置之前插入数据
void SLInsert(SL* s, int pos, SLDataType x);
//删除指定位置的数据
void SLErase(SL* s, int pos);

//顺序表的销毁
void SLDestroy(SL* s);

实现:SeqList.c 

#include"SeqList.h"

//数据初始化
SL SLInit(SL* s)//写代码要动脑子的!传参传什么?需要改变:地址& 不用改变:数值
{
	s->capacity = s->size = 0;//结构体.指针->
	s->arr = NULL;
}

//数据打印
void Print(SL s)
{
	printf("capacity = %d\nsize=%d\n", s.capacity, s.size);
	for (int i = 0; i < s.size; i++)
	{
		printf("s.arr[%d]=%d\n", i, s.arr[i]);
	}	
}

//数据开辟or扩容
void SLCheckCapacity(SL* s)
{
	if (s->size == s->capacity)
	{
		//int NewCapacity;
		//if (s->capacity == 0)//开辟条件
		//{NewCapacity =s->capacity = 10;}	
		//else//扩容条件
		//{int NewCapacity = 2 * s->capacity;}

		int NewCapacity = s->capacity == 0 ? 2 : 2 * s->capacity;
		SLDataType* tmp = (SLDataType*)realloc(s->arr, NewCapacity * sizeof(SLDataType));//开辟or扩容//数据类型写错了
		if (tmp == NULL)
		{
			perror(realloc);
			exit(1);
		}
		//调整变量  动态开辟内存释放与否?指针调整
		s->capacity = NewCapacity;
		s->arr = tmp;//arr一定要是指针 不可以是arr[0]的数组
		tmp = NULL;
	}
}

//数据插入 头插/尾插
void SLPushBack(SL* s ,SLDataType x)
{
	//断言——粗暴的解决方式
	assert(s != NULL);
	//判断——温柔的解决方式
	if (s == NULL)
	{
		return;
	}
	//先判断够不够 不够就要扩容
	SLCheckCapacity(&s);
	//够的话直接插入
	s->arr[s->size] = x;
	s->size++;
}
void SLPushFront(SL* s, SLDataType x)
{
	//断言——粗暴的解决方式
	assert(s != NULL);
	//先判断够不够 不够就要扩容
	SLCheckCapacity(&s);
	//够的话向后移动
	for (int i = 0; i < s->size; i++)
		s->arr[s->size - i] = s->arr[s->size - i - 1];
	s->arr[0] = x;
	s->size++;
}

//数据删除 头删/尾删
void SLPopBack(SL* s)
{
	assert(s->size);
	s->size--;
	s->arr[s->size] = NULL;
}
void SLPopFront(SL* s)
{
	assert(s->size);
	s->arr[0] = NULL;
	for (int i = 0; i < s->size; i++)
		s->arr[i] = s->arr[i + 1];
	s->size--;
}

//指定位置的插入or删除
//在指定位置之前插入数据
void SLInsert(SL* s, int pos, SLDataType x)
{
	assert(pos >= 0 && pos <= s->size);
	SLCheckCapacity(&s);
	for (int i = s->size; i >= pos; i--)
	{
		s->arr[i] = s->arr[i - 1];
	}
	s->size++;
	s->arr[pos] = x;
}
//删除指定位置的数据
void SLErase(SL* s, int pos)
{
	assert(pos >= 0 && pos < s->size);
	assert(s->size);
	s->arr[pos] = NULL;
	for (int i = 0; i < s->size - pos; i++)
	{
		s->arr[pos + i] = s->arr[pos + i + 1];
	}
	s->size--;
}

//顺序表的销毁
void SLDestroy(SL* s)
{
	free(s->arr);
}

测试 test.c

#include"SeqList.h"

void test1()
{
	//定义
	SL s1;

	//初始化
	SLInit(&s1);
	Print(s1);

	//扩容
	SLCheckCapacity(&s1);
	Print(s1);

	//插入
	for (int i = 0; i < 4; i++)
		SLPushBack(&s1, i);
	for(int j=4;j>0;j--)
		SLPushFront(&s1, j);
	//SLPushBack(NULL, 10);
	Print(s1);

	//数据删除
	//for (int i = 1; i > 0; i--)
	//{
		SLPopBack(&s1);
		SLPopFront(&s1);
	//}
	Print(s1);
	//指定位置的插入or删除
	//在指定位置之前插入数据
	SLInsert(&s1, 2, 0);
	Print(s1);
	//删除指定位置的数据
	SLErase(&s1, 5);
	//打印
	Print(s1);
	//销毁
	SLDestroy(&s1);
}
int main()
{
	test1();
	return 0;
}

  • 11
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Zorita.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值