【数据结构】顺序表的定义和实现

news/2024/9/19 8:17:57/ 标签: 数据结构, 笔记, c语言

顺序表的定义

顺序表是指用顺序存储的方式实现线性表

顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现

【看到这是否会和我有同样的疑问:顺序表和数组是一样的吗?这个问题可以参考 顺序表和数组(易混淆) 这篇文章的解释】

顺序表的实现

静态分配

#define MaxSize 10			//定义最大长度
typedef struct{ElemType data[MaxSize];	//用静态的“数组”存放数据元素,ElemType就是顺序表中存放的数据元素类型int length;				//顺序表的当前长度
}SqList;					//顺序表的类型定义(静态分配方式)

具体的代码

#include <stdio.h>
#define MaxSize 10typedef struct{int data[MaxSize];int length;
}SqList;void InitList(SqList* L){L->length = 0;		//顺序表初始长度为0,不可省略
}int main(){SqList L;InitList(&L);//....return 0;
}

缺点:顺序表的长度刚开始确定后就无法更改(存储空间是静态的)

动态分配

#define InitSize 10			//顺序表的厨师长度
typedef struct{ElemType* data;			//指示动态分配数组的指针(指向顺序表中的第一个数据元素)int MaxSize;			//顺序表的最大容量int length;				//顺序表的当前长度
}SeqList;					//顺序表的类型定义(动态分配方式)

在 C 语言中,malloc 和 free 函数用于动态申请和释放内存空间
(对 malloc 函数还不理解的话,可以阅读 【malloc()函数详解(动态内存开辟函数)】这篇文章)

具体的代码

#include <stdio.h>
#define InitSize 10typedef struct{int* data;int MaxSize;int length;
}SeqList;void InitList(SeqList* L){L->data = (int*)malloc(InitSize*sizeof(int)); //用 malloc 函数申请一片连续的存储空间L->length = 0;L->MaxSize = InitSize;
}void IncreaseSize(SeqList* L, int len){int *p = L->data;L->data = (int*)malloc((L->MaxSize+len)*sizeof(int));for(int i = 0; i < L->length; i++){L->data[i] = p[i];			//将数据复制到新区域,时间复杂度大}L->MaxSize = L->MaxSize + len;	//顺序表最大长度增加lenfree(p);		//释放原来的内存空间
}int main(){SeqList L;		//声明一个顺序表InitList(&L);	//初始化顺序表//...往顺序表中插入元素...IncreaseSize(&L,5);return 0;
}

顺序表的特点

  • 随机访问,即可以在 O(1) 时间内找到第 i 个元素
  • 存储密度高,每个节点只存储数据元素(在链表中每个节点还需要存储指针)
  • 拓展容量不方便(即采用动态分配的方式实现,拓展长度的时间复杂度也比较高)
  • 插入删除操作不方便,需要移动大量的元素

本文主要参考《王道计算机考研 数据结构》课程视频


http://www.ppmy.cn/news/1526976.html

相关文章

Python计算机视觉编程 第三章 图像到图像的映射

目录 单应性变换直接线性变换算法仿射变换 图像扭曲图像中的图像分段仿射扭曲 创建全景图RANSAC拼接图像 单应性变换 单应性变换是将一个平面内的点映射到另一个平面内的二维投影变换。在这里&#xff0c;平面是指图像或者三维中的平面表面。单应性变换具有很强的实用性&#…

【计网】从零开始使用TCP进行socket编程 --- 客户端与服务端的通信实现

阵雨后放晴的天空中&#xff0c; 出现的彩虹很快便会消失。 而人心中的彩虹却永不会消失。 --- 太宰治 《斜阳》--- 从零开始使用TCP进行socket编程 1 TCP与UDP2 TCP服务器类2.1 TCP基础知识2.2 整体框架设计2.3 初始化接口2.4 循环接收接口与服务接口 3 服务端与客户端测试…

【HTML】HTML页面和常见标签

文章目录 什么是前端HTML 页面编写如何快速生成代码框架常见标签注释标签标题标签段落标签换行标签格式化标签 什么是前端 Web 前端&#xff0c;用来直接给以用户呈现的一个一个的网页。一个软件通常是由 后端前端 完成的 后端&#xff1a;通过 Java/C等语言&#xff0c;完成相…

TS axios封装

方式一 service/request/request.ts import axios from axios import { ElLoading } from element-plus import type { AxiosRequestConfig, AxiosInstance, AxiosResponse } from axios import type { ILoadingInstance } from element-plus/lib/el-loading/src/loading.typ…

在 Android 中,自定义 View 的绘制流程

目录 1. 测量阶段 (onMeasure()) 2. 布局阶段 (onLayout()) 3. 绘制阶段 (onDraw()) 总体绘制流程 注意事项 示例总结 参考资料 在 Android 中&#xff0c;自定义 View 的绘制流程主要包括测量、布局、绘制三个关键步骤。具体来说&#xff0c;自定义 View 的绘制涉及重写…

Effective C++笔记之二十三:非void函数不写return

一.main函数 Qt Creator查看汇编的步骤如下 上图是g编译器下的汇编 eax就是main()函数的返回值 如果删掉return 0&#xff1b; 可以发现编译器还是把eax的值设为了0&#xff0c;由此可见&#xff0c;即使在main函数中不写return 0&#xff0c;编译器还是会默认添加个return 0。…

c++结构体与json自动互转(nlohmann的使用)

说明 nlohmann实现了结构体与json自动互转。 下载 https://github.com/nlohmann/json.git 拷贝include/nlohmann/json.hpp到新建工程 例子 代码 #include <iostream> #include "json.hpp" #include <string> using nlohmann::json; using namespa…

Qt --- 信号和信号槽

前言 Linux信号Signal&#xff0c;系统内部的通知机制&#xff0c;进程间通信方式。 信号源&#xff1a;谁发的信号。 信号的类型&#xff1a;哪种类别的信号。 信号的处理方式&#xff1a;注册信号处理函数&#xff0c;在信号被触发的时候自动调用执行。 Qt中的信号和Lin…

滚雪球学SpringCloud[2.1]:服务注册中心Eureka

全文目录&#xff1a; 前言2.1 服务注册中心EurekaEureka简介与工作原理Eureka的工作原理 配置Eureka Server配置Eureka ClientEureka的自我保护机制自我保护机制的工作原理配置自我保护机制 预告 前言 在上一篇文章中&#xff0c;我们对SpringCloud的概念和微服务架构的基础进…

【matlab】生成 GIF 的函数(已封装可直接调用)

文章目录 前言一、函数输入与输出二、函数代码三、例程&#xff08;可直接运行&#xff09;参考文献 前言 生成 gif 图片时遇到的问题&#xff0c;为了后续调用方便&#xff0c;封装为函数 一、函数输入与输出 输入&#xff1a; cell_figure: cell 数组&#xff0c;数组元素是…

TextCNN:文本卷积神经网络模型

目录 什么是TextCNN定义TextCNN类初始化一个model实例输出model 什么是TextCNN TextCNN&#xff08;Text Convolutional Neural Network&#xff09;是一种用于处理文本数据的卷积神经网&#xff08;CNN&#xff09;。通过在文本数据上应用卷积操作来提取局部特征&#xff0c;…

基于Java、SpringBoot、Vue的加油站管理系统设计

摘要 本系统是一个基于Java、SpringBoot和Vue的加油站管理系统。它旨在提高加油站的运营效率&#xff0c;优化客户服务体验&#xff0c;并通过数据分析支持更精准的业务决策。该系统包括用户管理、汽油管理、站点管理等功能模块。通过这些功能&#xff0c;管理员可以方便地管理…

校园管理新篇章:Spring Boot系统实现策略

第3章 系统分析 3.1 需求分析 校园管理系统主要是为了提高用户的工作效率和更方便快捷的满足用户&#xff0c;更好存储所有数据信息及快速方便的检索功能&#xff0c;对系统的各个模块是通过许多今天的发达系统做出合理的分析来确定考虑用户的可操作性&#xff0c;遵循开发的系…

springBoot整合easyexcel实现导入、导出功能

本次使用的框架是springboot&#xff0c;使用mybatisplus操作表&#xff0c;使用easyexcel实现表格的导入与导出。 操作步骤 1、导入依赖&#xff1a;&#xff08;pom.xml&#xff09; <!-- 查看excel的maven仓库 https://mvnrepository.com/artifact/com.alibaba/easyex…

统计信息的导出导入

常用场景&#xff1a; 1.生产环境的统计信息导入到测试环境使得执行计划的产生能极大程度上等同于生产环境。 2.割接测试环境的统计信息快速导入生产&#xff0c;替代生产库统计信息的收集操作&#xff0c;减少停机时间。 两种方式&#xff1a; 1.expdp/exp STATISTICS&…

使用js保存Blob和File文件

保存两种类型的文件方式都是一样&#xff1a; 1.保存Blob文件 (blob:Blob)>{// 创建一个 URL 对象const url URL.createObjectURL(blob);// 创建一个下载链接并触发下载const a document.createElement("a");a.href url;a.download "example.png"…

阿里云社区领积分自动打卡Selenium IDE脚本

脚本 感觉打卡比较麻烦&#xff0c;要点开点按钮这种机械化的操作。 所以就自己整了个脚本&#xff1a; {"id": "f9999777-9ad6-40e0-9435-4f105919c982","version": "2.0","name": "aliyun","url": …

2021 年 6 月青少年软编等考 C 语言二级真题解析

目录 T1. 数字放大思路分析 T2. 统一文件名思路分析 T3. 内部元素之和思路分析 T4. 整数排序思路分析 T5. 计算好数思路分析 T1. 数字放大 给定一个整数序列以及放大倍数 x x x&#xff0c;将序列中每个整数放大 x x x 倍后输出。 时间限制&#xff1a;1 s 内存限制&#x…

GO 闭包

文章目录 1. **累加器&#xff08;状态保持器&#xff09;**2. **缓存&#xff08;记忆化&#xff09;**3. **工厂函数**4. **函数式编程风格**5. **创建动态行为的函数**6. **控制访问权限** 总结 高级闭包的使用在 Go 中非常灵活和强大&#xff0c;特别是在需要保存状态或对外…

PCIe进阶之TL:First/Last DW Byte Enables Rules Traffic Class Field

1 First/Last DW Byte Enables Rules & Attributes Field 1.1 First/Last DW Byte Enables Rules Byte Enable 包含在 Memory、I/O 和 Configuration Request 中。本文定义了相应的规则。Byte Enable 位于 header 的 byte 7 。对于 TH 字段值为 1 的 Memory Read Request…