C语言---顺序表(二)

文章目录


前言

上一篇,我们认识到了顺序表,以及实现顺序表操作的相关函数,下面我们来一一实现。


1.准备工作

示例:

打开vs2022,创建三个文件

其中SeqList.h头文件是用来记录的,相当于一本书的目录

SeqList.c文件是用来实现函数的,相当于各种公式

test.c是用来测试的。
记住:一个好的习惯是,写完一个函数,要测试一个函数。

2.代码的实现

2.1.顺序表的创建、销毁和打印

c 复制代码
//初始化
void SLInit(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

//销毁
void SLDestroy(SL* ps)
{
	if (ps->arr)
	{
		free(ps->arr);
	}
	ps->capacity = ps->size = 0;
}
//打印
void SLPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

这个代码较为简单。

思考:为什么向函数中传递形参时,是用指针,如果不是指针,会发生什么,大家可以试试。

2.2.顺序表的扩容、头插\删、尾插\删

2.2.1.扩容

c 复制代码
//扩容
void SLCheckCapacity(SL* ps)
{
	if (ps->capacity == ps->size)
	{
		int newCapacity = ps->capacity == 0 ? 4 : 2 * ps->capacity;
		SeqDataType* tmp = (SeqDataType*)realloc(ps->arr,sizeof(SeqDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail!");
			exit(1);
		}
		ps->capacity = newCapacity;
		ps->arr = tmp;
	}
}

2.2.2.尾插

c 复制代码
void SLPushBack(SL* ps, SeqDataType x)
{
	assert(ps);
	//要判断arr空间是否充足
	SLCheckCapacity(ps);
	ps->arr[ps->size++] = x;
	
}

2.2.3.头插

c 复制代码
void SLPushFront(SL* ps, SeqDataType x)
{
	assert(ps);
	SLCheckCapacity(ps);
	//要将原来数组的每一个数,移动到前面
	for (int i = ps->size; i>0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];//arr[1]=arr[0]
	}
	ps->arr[0] = x;
	ps->size++;
}

2.2.3.尾删

尾删可能是最简单的,但是可能第一次想象不到,只需要size--即可,在输出的结果上一看,便是少了一个,并且也是最后一个。

c 复制代码
void SLPopBack(SL* ps)
{
	assert(ps);
	assert(ps->arr);//删着删着,最后要是顺序表为空,要报警
	ps->size--;
}

2.2.4.头删

c 复制代码
void SLPopFront(SL* ps)
{
	assert(ps && ps->arr);
	//删除第一个数字后,将后面的数字,移动到前面
	for (int i=0; i<ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i+1];//arr[size-2]=arr[size-1]
	}
	ps->size--;
}

2.3.指定位置之前插入/删除数据/查找数据

2.3.1.指定位置之前插入数据

c 复制代码
void SLInsert(SL* ps, int pos, SeqDataType x)
{
	assert(ps && ps->arr);
	assert(pos >= 0 && pos < ps->size);
	SLCheckCapacity(ps);
	for (int i = ps->size; i>pos; i--)
	{
		ps->arr[i] = ps->arr[i-1];
	}
	ps->arr[pos] = x;
	ps->size++;
}

assert(pos >= 0 && pos < ps->size);为什么不是<=呢,是因为咱们得目的是让数据插入到指定位置之前,如果传入的位置是ps->size的话,最后的代码将会是在ps->size之后插入的,不符合需要的功能,所以是<

2.3.2.指定位置之前删除数据

c 复制代码
void SLErase(SL* ps, int pos)
{
	assert(ps->arr && ps);
	assert(pos > 0 && pos <= ps->size);
	for (int i = 0; i <=pos; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

2.3.3.查找特定数据

c 复制代码
int SLFind(SL* ps, SeqDataType x)
{
	for (int i = 0; i < ps->size; i++)
		if (ps->arr[i] == x)
			return i;
	return -1;
}

总结

上面便是顺序表的常见的操作,大家可以根据代码,自己理解,并掌握。

相关推荐
LuminousCPP40 分钟前
单链表专题(三)-刷题复盘篇:从快慢指针到环形链表 II 数学推导
数据结构·经验分享·笔记·学习·算法·链表
ChaoZiLL1 小时前
二叉树经典例题
数据结构·算法
不正经学生1 小时前
C语言字符串函数进阶:安全版函数 + 错误处理 + 子串查找
c语言·开发语言·c++·算法·面试
三克的油1 小时前
算法基础-1
数据结构·c++·算法
一米阳光86612 小时前
软考(中级)软件设计师核心笔记(8)数据结构——树与二叉树
数据结构·笔记·职场发展·软考·软件设计师·中级职称
依然鸣2 小时前
PTA团体程序设计天梯赛L2真题讲解L2-005-008
开发语言·数据结构·c++·算法·深度优先·pat考试·图论
imaol13 小时前
数据结构--树
数据结构
Tongzhi20263 小时前
通芝科技无感考勤一体机:软硬一体,开箱即用
数据结构·数据库·科技·算法·均值算法·数据库开发
linux-hzh4 小时前
百日算法修炼 · Day 09
数据结构·算法·排序算法
淡海水5 小时前
C#与常用数据结构源码剖析-全篇导览
开发语言·数据结构·unity·面试·职场和发展·c#