C语言数据结构-----顺序表(多功能动态顺序表的代码实现)

这篇具有很好参考价值的文章主要介绍了C语言数据结构-----顺序表(多功能动态顺序表的代码实现)。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

本篇讲述了顺序表的相关知识,以及动态顺序表的代码实现。


1.线性表

顺序表和链表一般情况下都会叫他们线性表。

线性表(linear list)是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使 用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…

线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的, 线性表在物理上存储时,通常以数组和链式结构的形式存储。

2.顺序表

顺序表简单说就是一个数组。
顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存
储。在数组上完成数据的增删查改。

C语言数据结构-----顺序表(多功能动态顺序表的代码实现),数据结构,c语言,数据结构,开发语言

顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储元素。
  2. 动态顺序表:使用动态开辟的数组存储。

2.1 静态顺序表

C语言数据结构-----顺序表(多功能动态顺序表的代码实现),数据结构,c语言,数据结构,开发语言

2.2 动态顺序表

C语言数据结构-----顺序表(多功能动态顺序表的代码实现),数据结构,c语言,数据结构,开发语言
C语言数据结构-----顺序表(多功能动态顺序表的代码实现),数据结构,c语言,数据结构,开发语言

3动态顺序表代码详解

3.1 顺序表功能(头文件)

这里的顺序表和我们之前的通讯录有些相像,我们可以结合之前的通讯录来学习。
链接: 八功能通讯录
顺序表的头文件(功能)如下:seqList.h

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

typedef int SLDataType;

// sequence list
typedef struct SeqList
{
	SLDataType* a;
	int size;      // 有效数据
	int capacity;  // 空间容量
}SL;

void SLInit(SL* psl);//初始化顺序表
void SLDestroy(SL* psl);//摧毁顺序表

void SLPrint(SL* psl);//打印顺序表
void SLCheckCapacity(SL* psl);//检测顺序表的容量

// 头尾插入删除
void SLPushBack(SL* psl, SLDataType x);//尾插
void SLPushFront(SL* psl, SLDataType x);//头插
void SLPopBack(SL* psl);//尾删
void SLPopFront(SL* psl);//头删

// 任意下标位置的插入删除
void SLInsert(SL* psl, int pos, SLDataType x);//任意下标插
void SLErase(SL* psl, int pos);//任意下标删

// 找到返回下标
// 没有找到返回-1
int SLFind(SL* psl, SLDataType x);

3.2 各功能函数

3.2.1 初始化顺序表

void SLInit(SL* psl)
{
	assert(psl);
	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}

3.2.2 摧毁顺序表

void SLDestroy(SL* psl)
{
	assert(psl);
	if (psl->a != NULL)
	{
		free(psl->a);
		psl->a = NULL;
		psl->size = 0;
		psl->capacity = 0;
	}
}

3.2.3 打印顺序表

void SLPrint(SL* psl)
{
	assert(psl);
	for (int i = 0; i < psl->size; i++)
	{
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}

3.2.4 检测顺序表的容量

void SLCheckCapacity(SL* psl)
{
	assert(psl);
	if (psl->size == psl->capacity)
	{
		int newCapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;
		SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType) * newCapacity);
		if (tmp == NULL)
		{
			perror("realloc fail");
			return;
		}
		psl->a = tmp;
		psl->capacity = newCapacity;
	}
}

3.2.5 在顺序表尾部插入元素

void SLPushBack(SL* psl, SLDataType x)
{
	assert(psl);
	SLCheckCapacity(psl);
	psl->a[psl->size] = x;
	psl->size++;
}

3.2.6 在顺序表头部插入元素

void SLPushFront(SL* psl, SLDataType x)
{
	assert(psl);
	SLCheckCapacity(psl);
	// 挪动数据
	int end = psl->size - 1;
	while (end >= 0)
	{
		psl->a[end + 1] = psl->a[end];
		--end;
	}
	psl->a[0] = x;
	psl->size++;
}

3.2.7 在顺序表尾部删除元素

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

3.2.8 在顺序表头部删除元素

void SLPopFront(SL* psl)
{
	assert(psl);
	assert(psl->size > 0);
	int begin = 1;
	while (begin < psl->size)
	{
		psl->a[begin - 1] = psl->a[begin];
		++begin;
	}
	psl->size--;
}

3.2.9 在顺序表任意处插入元素

void SLInsert(SL* psl, int pos, SLDataType x)
{
	assert(psl);
	assert(pos >= 0 && pos <= psl->size);
	SLCheckCapacity(psl);
	// 挪动数据
	int end = psl->size - 1;
	while (end >= pos)
	{
		psl->a[end + 1] = psl->a[end];
		--end;
	}
	psl->a[pos] = x;
	psl->size++;
}

3.2.10 在顺序表任意处删除元素

void SLErase(SL* psl, int pos)
{
	assert(psl);
	assert(pos >= 0 && pos < psl->size);
	// 挪动覆盖
	int begin = pos + 1;
	while (begin < psl->size)
	{
		psl->a[begin - 1] = psl->a[begin];
		++begin;
	}
	psl->size--;
}

3.2.11 查找元素

int SLFind(SL* psl, SLDataType x)
{
	assert(psl);
	for (int i = 0; i < psl->size; i++)
	{
		if (psl->a[i] == x)
		{
			return i;
		}
	}
	return -1;
}

3.2.12 主函数

主函数包括目录及各个功能的测试。完整代码见3.2.13 gitee

3.2.13 完整代码

链接: 动态顺序表完整代码:gitee

4.顺序表的缺陷

1.尾部插入效率尚可,头部或者中间插入删除,需要挪动数据,效率低下。
2.容量满了之后只能扩容。扩容是有一定的消耗,且存在一定的空间浪费。(假设空间为100,扩容到200,但只需要120个数据,会有大量空间浪费)文章来源地址https://www.toymoban.com/news/detail-730339.html

到了这里,关于C语言数据结构-----顺序表(多功能动态顺序表的代码实现)的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 数据结构-顺序表各项功能的实现

    线性表是n个具有相同属性的有限数列,常见的线性表有:= 顺序表,链表,栈,队列,字符串… 线性表在逻辑上是线性结构,也就是说连成一条直线,但是在物理结构上不一定连续,线性表在物理上存储是,通常以数组和链式结构的形式进行存储。 本章,我们将通过顺序表

    2024年02月14日
    浏览(28)
  • 消防多功能智慧灯杆

    消防多功能智慧灯杆是一种基于叁仟智慧杆并应用了智能技术和物联网技术的新一代消防基础设备。它能够实时监测消防设备的状态和消防物资的储备情况,并能够自动报警和调度消防人员。消防多功能智慧灯杆通常配备有各类消防设备,如灭火器、消防栓、AED、防护服等,

    2024年01月25日
    浏览(41)
  • 【FPGA】多功能ALU

    目录 一、实验要求 二、源代码 1. 顶层模块 2. 数据输入模块 3. ALU运算模块 4. 结果处理模块 5. 扫描数码管模块 5.1 扫描数码管顶层 5.2 分频器 5.3 数码管显示 三、仿真代码 四、结构层图 五、管脚配置 实验板卡:xc7a100tlc sg324-2L,共20个开关 通过高低位控制,实现32位数据A、

    2024年02月02日
    浏览(45)
  • 多功能隐写融合

            最近尝试了一个融合了多功能隐写的项目,参考了一些现有的资料和相关的开源库,并最终集成到了可视化UI当中。这篇文章讲述了实现的几项隐写技术的原理以及最终呈现的效果,后续会在“ 隐私保护 ”以及“ ui ”的专栏中继续更新详细的ui设计思路以及隐写代

    2024年01月19日
    浏览(45)
  • 实战项目——多功能电子时钟

    通过按键来控制状态机的状态,在将状态值传送到各个模块进行驱动,在空闲状态下,数码管显示基础时钟,基础时钟是由7个计数器组合而成,当在ADJUST状态下可以调整时间,并且基础时间会随基础时钟的改变而改变,同过位置使能来确定更改的值在按下确定来更改基础时钟

    2024年02月14日
    浏览(30)
  • 数据结构---手撕顺序表---顺序表增删查改寻找功能的实现

    顺序表作为数据结构的入门知识,整体知识较为简单,主要对动态内存开辟 结构体 指针有要求,其余难度较低 顺序表主要需要实现的有顺序表的增删查改和定向搜索销毁等,具体实现函数如下 要实现顺序表,就需要对顺序表进行定义,在c语言中通常使用结构体进行写入,

    2024年02月16日
    浏览(27)
  • 数据结构:手撕顺序表---顺序表增删查改寻找功能的实现

    顺序表作为数据结构的入门知识,整体知识较为简单,主要对动态内存开辟 结构体 指针有要求,其余难度较低 顺序表主要需要实现的有顺序表的增删查改和定向搜索销毁等,具体实现函数如下 要实现顺序表,就需要对顺序表进行定义,在c语言中通常使用结构体进行写入,

    2024年02月15日
    浏览(31)
  • VHDL实现多功能时钟设计

    题目:多功能电子时钟 VHDL语言设计 主要功能要求: 1、电子时钟。要求用24 时制显示。分屏显示“时、分”和“分、秒”,即4 个数码管不能同时显示“时、分、秒”,但可以只显示“时、分”,或只显示“分、秒”,通过按键来切换这两种显示方式。用数码管的小数点“

    2024年02月11日
    浏览(35)
  • [数据结构 - C语言] 顺序表

    目录 1、线性表 2、顺序表 2.1 顺序表的概念 2.2 接口 3、接口实现 3.1 初始化 3.2 销毁 3.3 容量检测 3.4 打印数据 3.5 顺序表的头插 3.6 顺序表的尾插 3.7 顺序表的头删、尾删 3.8 顺序表查找 3.9 指定位置插入数据 线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性

    2023年04月21日
    浏览(24)
  • 【数据结构<顺序表>】C语言

    线性表(linear list)是n个具有相同特性的数据元素的有限序列。 线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构,也就说是连续的一条直线。但是在物理结构上并不一定是连续的,线性表在物理上

    2024年02月05日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包