[数据结构]顺序表的增删查改

😾 博客主页: 爱吃bug的猿
😼博客专栏: 数据结构,C语言初阶进阶全流程讲解
每日激励:欲达高峰,必忍其痛;欲戴王冠,必承其重
😽😽😽如果喜欢博主的文章,可以给博主点波赞和关注加速博主更新

😾 将顺序表这个工程分为3部分

😾😾函数的声明

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SLDatatype;
typedef struct SL
{
	SLDatatype* p;
	int size;
	int capacity;
}SL;
void SLInit(SL* sl);
void SLDestory(SL* sl);
void SLcheckCapacity(SL* sl);
void SLPushBack(SL* sl, SLDatatype x);
void SLPrint(SL* sl);
void SLPopBack(SL* sl);
void SLPushFront(SL* sl, SLDatatype x);
void SLPopFront(SL* sl);
void SLIsert(SL* sl, int pos, SLDatatype x);
void SLErase(SL*sl,int pos);
int SLFind(SL* sl, SLDatatype x);
int SLModi

😾😾函数的实现(配合画图更容易理解哦)

  • 在函数的测试里边创建了一个结构体SL sl = { 0 };
  • 传入函数时,&sl传入函数,pos代表下标,x代表穿过一个整形数据

😾😾😾 顺序表的初始化

//顺序表的初始化
void SLInit(SL* sl)
{
	sl->p = (SLDatatype*)malloc(sizeof(SLDatatype) * 4);
	sl->size = 0;
	sl->capacity = 4;
}
  • 为了方便多种类型的初始化,在函数的声明中,将int重命名为SLDatatype

😾😾😾顺序表的销毁

void SLDestory(SL* sl)
{
	free(sl->p);
	sl->p = NULL;
	sl->size = 0;
	sl->capacity = 0;
}
  • 结构体中的p如果出了函数还存在的话,可能会被访问到,所以置为NULL

😾😾😾顺序表的检查容量

//顺序表的检查容量
void SLcheckCapacity(SL* sl)
{
	if (sl->size == sl->capacity)
	{
		SLDatatype* tmp = (SLDatatype*)realloc(sl->p,sizeof(SLDatatype) * sl->capacity * 2);
		if (tmp == NULL)
		{
			return;
		}
		sl->p = tmp;
		sl->capacity *= 2;
	}
}
  • 每次满了之后扩容扩2倍

😾😾😾顺序表的尾插

void SLPushBack(SL* sl, SLDatatype x)
{
	SLIsert(sl, sl->size, x);
	//SLcheckCapacity(sl);

	//sl->p[sl->size] = x;
	//sl->size++;
}
  • 这里使用了两种方式,一种是已经注释的代码的尾插,一种是利用顺序表的任意下标插入,下面会讲到
  • 此处说明顺序表的任意下标插入对顺序表的尾插可以进行复用

😾😾😾顺序表的的尾删

//顺序表的的尾删
void SLPopBack(SL* sl)
{
	/*assert(sl->size > 0);
	sl->size--;*/
	SLErase(sl, sl->size - 1);
}
  • 此处说明顺序表的任意下标删除对顺序表的尾删可以进行复用

😾😾😾顺序表的头插

void SLPushFront(SL* sl, SLDatatype x)
{
	/*SLcheckCapacity(sl);
	int end = sl->size - 1;
	while (end >= 0)
	{
		sl->p[end + 1] = sl->p[end];
		end--;
	}
	sl->p[0] = x;
	sl->size++;*/
	
  • 此处说明顺序表的任意下标插入对顺序表的头插可以进行复用

😾😾😾顺序表的头删

void SLPopFront(SL* sl)
{
	/*assert(sl->size > 0);
	int start = 0;
	while (start < sl->size - 1)
	{
		sl->p[start + 1] = sl->p[start];
		start++;
	}
	sl->size--;*/
	SLErase(sl, 0);
}
  • 此处说明顺序表的任意下标删除对顺序表的头删可以进行复用

😾😾😾顺序表的任意下标插入

void SLIsert(SL* sl, int pos, SLDatatype x)
{
	assert(0 <= pos && pos <= sl->size);
	SLcheckCapacity(sl);
	int end = sl->size - 1;
	while (end >= pos)
	{
		sl->p[end + 1] = sl->p[end];
		end--;
	}
	sl->p[pos] = x;
	sl->size++;
}

😾😾😾顺序表的任意下标删除

//顺序表的任意下标删除
void SLErase(SL* sl, int pos)
{
	assert(0 <= pos && pos < sl->size);
	while (pos < sl->size )
	{
		sl->p[pos - 1] = sl->p[pos];
		pos++;
	}
	sl->size--;
}

😾😾😾顺序表的查找

//顺序表的查找
int SLFind(SL*sl, SLDatatype x)
{
	int i = 0;
	for (i = 0; i < sl->size; i++)
	{
		if (sl->p[i] == x)
		{
			return i;
		}
	}
	return -1;
}

😾😾😾顺序表的修改

//顺序表的修改
void SLModify(SL* sl, int pos, SLDatatype x)
{
	assert(0 <= pos && pos < sl->size);
	sl->p[pos] = x;
}

😾😾 函数的测试

#define _CRT_SECURE_NO_WARNINGS 1
#include "seqlist.h"
//顺序表的增删查改
int main()
{
	SL sl = { 0 };
	//顺序表的初始化
	SLInit(&sl);
	//顺序表的尾插与尾删
	//SLPushBack(&sl, 1);
	//SLPushBack(&sl, 2);
	//SLPushBack(&sl, 3);
	//SLPushBack(&sl,4);
	//SLPushBack(&sl, 1);
	//SLPushBack(&sl, 1);
	//SLPrint(&sl);
	//SLPopBack(&sl);
	//SLPopBack(&sl);
	//SLPopBack(&sl);
	/*SLPrint(&sl);*/
	//顺序表的头插与头删
	/*SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPushFront(&sl, 1);
	SLPushFront(&sl, 2);
	SLPushFront(&sl, 3);
	SLPrint(&sl);
	SLPopFront(&sl);
	SLPopBack(&sl);
	SLPrint(&sl);*/

	//顺序表的销毁
	void SLDestory(SL * sl);
	return 0;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值