数据结构从入门到实战——顺序表

news2024/9/23 13:16:15

目录

前言

一、顺序表的概念及结构 

1.1 线性表 

二、顺序表分类 

三、动态顺序表的实现

3.1  顺序表结构的创建以及初始化

3.2 顺序表的销毁 

 3.3 顺序表的打印

3.4 尾插数据 ——最困难的

3.5 头插数据  

3.6 尾删数据

3.7 头部删除数据


前言

在计算机科学和数据结构的领域内,顺序表是一种基础而重要的线性结构,它不仅支持高效的元素存储,还允许灵活的数据操作。顺序表通常以数组作为其底层数据结构,但它提供了更丰富和高级的操作接口,使得顺序表在实际应用中比原始数组更加方便、高效。 

顺序表的主要功能包括: 

  • 动态大小:顺序表能够根据需要动态增长和缩减,这意味着我们可以在运行时添加或删除元素,而不需要预先知道数据的确切大小。

  • 插入和删除操作:尽管顺序表的插入和删除操作可能涉及到元素的移动,但通过优化策略(如使用空闲空间列表),这些操作的效率可以大大提高。

  • 高效的批量操作:顺序表支持对一系列连续元素的高效操作,如批量插入、删除或修改元素。

  • 随机访问:与链表等其他数据结构相比,顺序表的一个显著特点是能够快速地访问任意位置的元素,这是因为顺序表的内存是连续分配的。

顺序表和数组的区别 :

尽管顺序表在许多实现中依赖于数组,但它们之间存在一些关键的区别:

  • 动态性:数组的大小在创建时固定,不能轻易改变;而顺序表可以动态地增长或缩减,提供了更好的灵活性。

  • 抽象级别:顺序表通常被视为更高级别的抽象,它封装了数组并提供了一系列便于使用的操作方法,如插入、删除和查找。

  • 容量管理:顺序表内部通常有容量的概念,即实际分配的存储空间大小,这允许它在不重新分配整个存储区域的情况下进行动态扩展。

  • 性能特点:由于顺序表基于连续内存,因此对于随机访问操作非常高效;然而,当涉及到频繁的插入和删除操作时,数组可能需要频繁的内存复制,而顺序表可以通过调整元素位置来优化这些操作。

总结来说,顺序表是一种功能强大且灵活的数据结构,它建立在数组的基础上,通过提供动态大小、随机访问能力和高效的批量操作,为数据处理提供了极大的便利。虽然在某些操作上顺序表和数组的性能特点不同,但顺序表的设计旨在为用户提供一个易于管理和使用的高效数据存储结构。


正文开始

一、顺序表的概念及结构 

1.1 线性表 

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

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

案例:蔬菜分为绿叶类、瓜类、菌菇类。线性表指的是具有部分相同特性的⼀类数据结构的集合 如何理解逻辑结构和物理结构? 

二、顺序表分类 

顺序表和数组的区别 :

顺序表的底层结构是数组,对数组的封装,实现了常⽤的增删改查等接⼝ 

顺序表分类: 

  1. 静态顺序表 

     概念:使用定长数组存储元素 

     

    静态顺序表缺陷:空间给少了不够用,给多了造成空间浪费

  2. 动态顺序表

 

三、动态顺序表的实现

3.1  顺序表结构的创建以及初始化

代码如下

SeqList.h——主要用来存放顺序表结构、声明顺序表的方法

#pragma once
#include <stdio.h>
#include <stdlib.h>
//定义顺序表结构
typedef int SLDataType;

typedef struct SeqList
{
	SLDataType* arr; //指向那块空间的指针,因为使用的是动态顺序表
	SLDataType size; //有效数据的大小
	SLDataType capacity; //整个数组能够储存多少个数据
}SL;

//1.顺序表的声明
void SLInit(SL* ps);

SeqList.c——实现顺序表的方法         

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

void SLInit(SL* ps)
{
	ps->arr = NULL;
	ps->size = ps->capacity = 0;
}

test.c —— 测试文件

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

void SLTest01()
{
	SL s1;
	SLInit(&s1);
}


int main()
{
	SLTest01();
	return 0;
}

 

3.2 顺序表的销毁 

代码如下

SeqList.h

//2.顺序表的销毁
void SLDestroy(SL* ps);

SeqList.c 

//顺序表的销毁
void SLDestroy(SL* ps)
{
	if (ps->arr != NULL)
	{
		free(ps->arr);
		ps->arr = NULL;
	}
	ps->size = ps->capacity = 0;
}

 3.3 顺序表的打印

代码如下

SeqList.h

//3.顺序表的打印
void SLPrint(SL* ps);

SeqList.c  

//打印顺序表
void SLPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

3.4 尾插数据 ——最困难的

代码如下

SeqList.h 

//4.尾部插入数据
void SLPushBack(SL* ps, SLDataType x);

SeqList.c   

//尾部插入数据
void SLPushBack(SL* ps, SLDataType x)
{
	//首先得判断一下传入的指针是否为空指针
	assert(ps);
	//判断内存是否足够,也就是能不能把数据存进去
	if (ps->capacity == ps->size)
	{
		//判断新的空间大小,如果原来空间大小为0,则新空间大小为4,不为0,则为原来空间的两倍
		SLDataType new_capacity = (ps->capacity == 0 ? 4 : 2 * ps->capacity);
		//给新空间分配内存
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, new_capacity * sizeof(SLDataType));
		//判断空间是否开辟成功
		if (tmp == NULL)
		{
			perror("realloc fail");
			exit(1);
		}
		ps->arr = tmp;
		ps->capacity = new_capacity;
	}
	ps->arr[ps->size] = x;
	ps->size++;
}

 test.c —— 这里会将上面没有演示的销毁和打印一同演示

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

void SLTest01()
{
	//顺序表的初始化
	SL s1;
	SLInit(&s1);

	//尾插数据
	SLPushBack(&s1, 1);
	SLPrint(&s1);

	SLPushBack(&s1, 2);
	SLPrint(&s1);

	SLPushBack(&s1, 3);
	SLPrint(&s1);

	SLPushBack(&s1, 4);
	SLPrint(&s1);

	SLPushBack(&s1, 4);
	SLPrint(&s1);

	//顺序表的销毁
	SLDestroy(&s1);
}



int main()
{
	SLTest01();
	return 0;
}

 

 

3.5 头插数据  

代码如下

SeqList.h  

//5.头插数据
void SLPushFront(SL* ps, SLDataType x);

SeqList.c    


//头部插入数据
void SLPushFront(SL* ps, SLDataType x)
{
	//判断传入的数据是否为空指针
	assert(ps);
	//判断空间是否足够,此时我们发小在尾插的时候也使用到了空间大小的判断,所以它是否可以封装成一个函数呢?
	SLCheckCapacity(ps);

	//首先得腾出位置给头部插入数据,所以整体需要往后移一位
	for (int i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[0] = x;
	ps->size++;

}

test.c  

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

void SLTest01()
{
	//顺序表的初始化
	SL s1;
	SLInit(&s1);

	//尾插数据
	SLPushBack(&s1, 1);
	SLPrint(&s1);

	SLPushBack(&s1, 2);
	SLPrint(&s1);

	SLPushBack(&s1, 3);
	SLPrint(&s1);

	SLPushBack(&s1, 4);
	SLPrint(&s1);

	SLPushBack(&s1, 4);
	SLPrint(&s1);

    //头部插入数据
	SLPushFront(&s1, 3);
	SLPrint(&s1);

	//顺序表的销毁
	SLDestroy(&s1);
}



int main()
{
	SLTest01();
	return 0;
}

 

3.6 尾删数据

代码如下

SeqList.h  

//6.尾部删除数据
void SLPopBack(SL* ps)

SeqList.c    

//尾部删除数据
void SLPopBack(SL* ps)
{
	assert(ps);
	ps->size--;
}

 

 test.c  

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

void SLTest01()
{
	//顺序表的初始化
	SL s1;
	SLInit(&s1);

	//尾插数据
	SLPushBack(&s1, 1);
	SLPrint(&s1);

	SLPushBack(&s1, 2);
	SLPrint(&s1);

	SLPushBack(&s1, 3);
	SLPrint(&s1);

	SLPushBack(&s1, 4);
	SLPrint(&s1);

	SLPushBack(&s1, 5);
	SLPrint(&s1);

	//头部插入数据
	SLPushFront(&s1, 3);
	SLPrint(&s1);

	//尾部删除数据
	SLPopBack(&s1);
	SLPrint(&s1);

	//顺序表的销毁
	SLDestroy(&s1);
}

int main()
{
	SLTest01();
	return 0;
}

3.7 头部删除数据

代码如下

SeqList.h   

//7.头部删除数据
void SLPopFront(SL* ps);

SeqList.c    

//头部删除数据
void SLPopFront(SL* ps)
{
	assert(ps);
	//从第二个数据依次挨个往前走
	for (int i = 0; i < ps->size; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

 test.c   

#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

void SLTest01()
{
	//顺序表的初始化
	SL s1;
	SLInit(&s1);

	//尾插数据
	SLPushBack(&s1, 1);
	SLPrint(&s1);

	SLPushBack(&s1, 2);
	SLPrint(&s1);

	SLPushBack(&s1, 3);
	SLPrint(&s1);

	SLPushBack(&s1, 4);
	SLPrint(&s1);

	SLPushBack(&s1, 5);
	SLPrint(&s1);

	//头部插入数据
	SLPushFront(&s1, 3);
	SLPrint(&s1);

	//尾部删除数据
	SLPopBack(&s1);
	SLPrint(&s1);

	//头部删除数据
	SLPopFront(&s1);
	SLPrint(&s1);

	//顺序表的销毁
	SLDestroy(&s1);
}

int main()
{
	SLTest01();
	return 0;
}

 


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1596385.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

强大的系统监测工具 iStat Menus for mac最新中文激活版

iStat Menus for Mac是一款功能强大的系统监控工具&#xff0c;专为Mac用户设计&#xff0c;旨在帮助用户全面了解电脑的运行状态&#xff0c;提高电脑的性能和稳定性。 iStat Menus for mac最新中文激活版下载 该软件可以实时监测CPU使用率、内存占用、网络速度、硬盘活动等各…

第九届少儿模特明星盛典 全球赛推广大使『费菲』精彩回顾

2024年1月30日-2月1日&#xff0c;魔都上海迎来了龙年第一场“少儿形体行业美育春晚”&#xff01;由IPA模特委员会主办的第九届少儿模特明星盛典全球总决赛圆满收官&#xff01;近2000名少儿模特选手从五湖四海而来&#xff0c;决战寒假这场高水准&#xff0c;高人气&#xff…

Harmony与Android项目结构对比

主要文件对应 Android文件HarmonyOS文件清单文件AndroidManifest.xmlmodule.json5Activity/Fragmententryability下的ts文件XML布局pages下的ets文件resresourcesModule下的build.gradleModule下的build-profile.json5gradlehvigor根目录下的build.gradle根目录下的build-profi…

pnpm 报错: ERR_PNPM_META_FETCH_FAIL

今天突然遇到一个报错&#xff0c;pnpm 报错&#xff1a; ERR_PNPM_META_FETCH_FAIL  GET https://registry.npm.taobao.org/vue%2Fcli-service: request to https://registry.npm.taobao.org/vue%2Fcli-service failed, reason: certificate has expired问题原因&#xff1a;…

国外EDM邮件群发多少钱?哪个软件好?

在当今全球化市场环境下&#xff0c;电子邮件营销作为最有效的数字营销渠道之一&#xff0c;其影响力不容忽视。而高效精准的EDM&#xff08;Electronic Direct Mail&#xff09;邮件营销策略更是企业拓展海外市场、提升品牌知名度的关键手段。云衔科技以其创新的智能EDM邮件营…

316_C++_xml文件解析成map,可以放到QT表格上, 且 xml、xlsx文件可以互相解析

xml文件例如&#xff1a; <?xml version"1.0" encoding"UTF-8" standalone"yes"?> <TrTable> <tr id"0" label"TR_PB_CH" text"CH%2"/> <tr id"4" label"TR_PB_CHN"…

新专业探路:智能视觉工程专业实验室如何建?

今日&#xff0c;“第八届全国高校电子信息类专业教学论坛”在成都圆满闭幕。整体会议聚焦人才自主培养、一流专业建设、新质课程建设&#xff0c;来自全国多所高校和企业的参会代表齐聚一堂&#xff0c;分享教育与教学成果为推动电子信息类专业建设及课程建设&#xff0c;探讨…

指针的深入理解(七)

指针的深入理解&#xff08;七&#xff09; 个人主页&#xff1a;大白的编程日记 个人专栏&#xff1a;C语言学习之路 感谢遇见&#xff0c;我们一起学习进步&#xff01; 文章目录 指针的深入理解&#xff08;七&#xff09;前言一.常量字符串指针1.1常量字符串的理解1.2常量…

UDTF函数 explode

场景&#xff1a; 原hive数据形式 split 处理到一个Array 形式 使用explode炸开后的效果是 explode结合侧面视图达到targeType 目标形式&#xff1a; 一进多出 explode 将hive 中复杂的 array 炸成多行 因为炸开后&#xff0c; movie 列值少于categoryname 列所以这里为了达到…

如何使用Python曲线拟合

在Python中进行曲线拟合通常涉及使用科学计算库&#xff08;如NumPy、SciPy&#xff09;和绘图库&#xff08;如Matplotlib&#xff09;。下面是一个简单的例子&#xff0c;演示如何使用多项式进行曲线拟合&#xff0c;在做项目前首先&#xff0c;确保你已经安装了所需的库。 1…

宝宝洗衣机怎么选?四款畅销卓越婴儿洗衣机深度剖析!

近几年科技高速发展&#xff0c;我们的生活也因此变得更加便捷、健康高效。尤其是在家庭生活中&#xff0c;各种新兴家电的出现让我们的生活变得更加健康卫生。婴儿洗衣机也为现代家庭提供了极大的便捷。由于婴儿刚出生免疫力比较弱&#xff0c;所以建议婴儿的衣物尽量和大人的…

10分钟1000台虚机 云安全效能双升 亚信安全新信舱无代理云平台快速适配版正式发布

新信舱 亚信安全新信舱无代理云平台快速适配版正式发布。在云平台依赖性、无代理部署速度、宿主机无代理AV防护和虚拟机缓存扫描性能等方面&#xff0c;新信舱无代理版本提供了无缝的可扩展性、低资源消耗并降低管理复杂性&#xff0c;让安全防护真正做到了 多快好省&#xff…

Spring Boot 整合 Mockito:提升Java单元测试的高效实践

引言 在Java开发领域&#xff0c;Spring Boot因其便捷的配置和强大的功能而受到广泛欢迎&#xff0c;而Mockito作为一款成熟的单元测试模拟框架&#xff0c;则在提高测试质量、确保代码模块间解耦方面扮演着至关重要的角色。本文将详细介绍如何在Spring Boot项目中整合Mockito&…

天府锋巢运营方树莓集团——全国园区赋能,助力企业开源节流

树莓集团&#xff0c;作为天府锋巢直播产业基地的运营方&#xff0c;一直在数字产业生态链的建设中走在行业前列。不同于传统的园区或商管公司&#xff0c;树莓集团不仅为企业提供物理入驻空间&#xff0c;更是创造了高效、多维度、多渠道的无边界产业办公体验。这种独特的运营…

第四百五十四回

文章目录 1. 问题描述2. 优化方法2.1 缩小范围2.2 替代方法 3. 示例代码4. 内容总结 我们在上一章回中介绍了"如何获取AppBar的高度"相关的内容&#xff0c;本章回中将介绍关于MediaQuery的优化.闲话休提&#xff0c;让我们一起Talk Flutter吧。 1. 问题描述 我们在…

package.java文件的作用

你查看springboot的源码&#xff0c;有很多类都有这个文件&#xff0c;在idea不能创建&#xff0c;因为不支持这种命名&#xff0c;只能用记事本创建后复制都项目中。 主要应用是给类添加正常&#xff0c;或者把公用的注解都放到这里&#xff0c;常量不合适&#xff0c;作用范…

爬虫机试题-爬取新闻网站

之前投简历时遇到了这样的一个笔试。本以为会是数据结构算法之类的没想到直接发了一个word直接提需求&#xff0c;感觉挺有意思就写了这篇文章&#xff0c;感兴趣的朋友可以看看。 拿到urllist 通过分析页面结构我们得以知道&#xff0c;这个页面本身没有新闻信息&#xff0c;是…

夜月一帘幽梦,春风十里“三指针法“ (链表面试题篇2)

本篇会加入个人的所谓鱼式疯言 ❤️❤️❤️鱼式疯言:❤️❤️❤️此疯言非彼疯言 而是理解过并总结出来通俗易懂的大白话, 小编会尽可能的在每个概念后插入鱼式疯言,帮助大家理解的. &#x1f92d;&#x1f92d;&#x1f92d;可能说的不是那么严谨.但小编初心是能让更多人能接…

Gemini国内怎么使用

GPT、Claude、Gemini全系列模型国内使用方法来了&#xff01; 一直以来很多人问我能不能有个稳定&#xff0c;不折腾的全球AI大模型测试网站&#xff0c;既能够保证真实靠谱&#xff0c;又能够保证稳定、快速&#xff0c;不要老动不动就挂了、出错或者漫长的响应。 到目前为止…

深度学习入门(3)

一、感知机 感知机接收多个输入信号&#xff0c;输出一个信号。这里所说的“信号”可以想象成电流或河流那样具备“流动性”的东西。 但是&#xff0c;和实际的电 流不同的是&#xff0c;感知机的信号只有“流 / 不流”&#xff08; 1 / 0 &#xff09;两种取值。在本书中&…