C/C++数据结构之顺序表函数实现以及详细解析

个人主页点我进入主页

专栏分类:C语言初阶      C语言程序设计————KTV       C语言小游戏     C语言进阶

C语言刷题       数据结构初阶

欢迎大家点赞,评论,收藏。

一起努力,一起奔赴大厂。

目录

1.前言

2.顺序表函数的实现

2.1顺序表定义

2.2顺序表初始化

2.3检查是否需要扩容

2.4尾插

2.5头插

2.6尾删

2.7头删

2.8指定位置插入

2.9指定位置删除      

3.总结


1.前言

        数据结构是什么,数据结构就是对数据进行存储的一种方式,主要学习的就是对数据进行增删查改的一种方式,今天我们主要讲的就是线性表中的顺序表,线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串...线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。还记得我们C语言中写的通讯录吗?我们用到大就是顺序表,顺序表可以分为静态顺序表和动态顺序表,我们主要讲的就是动态顺序表。

2.顺序表函数的实现

2.1顺序表定义

typedef struct SeqList {
	int* data;
	int size;//现有长度
	int capacity;//总长度
};

2.2顺序表初始化

void initsl(SeqList*psl)
{
	psl->data = (int *)malloc(sizeof(int) * MAXSIZE);
	psl->capacity = MAXSIZE;
	psl->size = 0;
}

2.3检查是否需要扩容

void checkcapacity(SeqList *psl)
{
	if (psl->size == psl->capacity)
	{
		int newcapacity=psl->capacity + 2;
		int* p = (int*)realloc(psl->data, sizeof(int) * newcapacity);	
		if (p == NULL)
		{
			assert("realloc");
			return;
		}
		psl->data = p;
		psl->capacity = newcapacity;
		printf("扩容成功\n");
	}
}

在这里我们主要用到了函数realloc扩容。

2.4尾插

void SLPushBack(SeqList* psl,int x)
{
	assert(psl);
	checkcapacity(psl);
	psl->data[psl->size++] = x;
}

 我们先对指针进行判断是否为空,再检查是否需要扩容, 然后对数据进行尾插。

2.5头插

void SLPushFrount(SeqList* psl,int x)
{
	assert(psl);
	checkcapacity(psl);
	int end = psl->size;
	while (end > 0)
	{
		psl->data[end] = psl->data[end - 1];
		end--;
	}
	psl->data[0] = x;
	psl->size++;
}

在这里我们先对数据进行判断是不是空指针,然后进行判断是否需要进行扩容,然后进行数据的挪动(由于是头插,需要把第一个数据的位置空出来,所以需要挪动数据)。头插和尾插我们相较一下可以看出来这俩个 尾插比较简单。

2.6尾删

void SLPopBack(SeqList* psl)
{
	assert(psl);
	psl->size--;
}

由于空间的可重复使用我们直接将现有长度进行减一就可以得到想要的操作。

2.7头删

void SLPopFrount(SeqList* psl)
{
	assert(psl);
	int frount = 0;
	while (frount < psl->size - 1)
	{
		psl->data[frount++] = psl->data[frount + 1];
	}
	psl->size--;
}

在这里我们先对指针进行检查,然后对数据进行挪动,然后让长度减一,我们和尾删相比较可以看出来尾删更简单,我们对于头插,尾插,尾删,头删可以得出顺序表对尾部的插入和删除比较容易,对头部的插入和删除比较困难。

2.8指定位置插入

void SLInsert(SeqList* psl,int pow,int x)
{
	assert(psl);
	if (pow<0 || pow>psl->size)
	{
		printf("输入位置非法\n");
		return;
	}
	int end = psl->size-1;
	while (end >= pow)
	{
		psl->data[end + 1] = psl->data[end];
		end--;
	}
	psl->data[pow] = x;
	psl->size++;
}

我们先对指针进行检验,然后对指定的位置进行判断最后对数据进行移动。         

2.9指定位置删除      

void SLErase(SeqList* psl,int pow)
{
	assert(psl);
	if (pow < 0 || pow >= psl->size)
	{
		printf("输入位置非法\n");
		return;
	}
	while (pow < psl->size-1)
	{
		psl->data[pow] = psl->data[pow + 1];
		pow++;
	}
	psl->size--;
}

先对指针进行判断,然后对数据进行挪动即可完成删除操作。 

3.总结

        今天的内容就结束了,我们主要讲解了顺序表的动态储存方式以及它的函数操作,对于静态顺序表我们可以对照前面写过的通讯录进行学习查看,通讯录包含三个版本,每个版本都是通讯录的优化,最后希望大家可以一件三连。

  • 46
    点赞
  • 42
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 74
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

steventom

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

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

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

打赏作者

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

抵扣说明:

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

余额充值