数据结构-顺序表的实现 [王道]

news2024/12/25 0:24:06

本博客记录个人寒假学习内容。此篇博客内容为 顺序表的定义。

博客中截图来自王道数据结构公开课

目录

顺序表的定义

顺序表的特点

顺序表的实现--静态分配

顺序表的实现--动态分配


顺序表的定义--知识结构框架


顺序表的定义

>线性表是具有相同(每个数据元素所占的空间一样大)数据类型的n(n\geq 0)数据元素有限序列。

>顺序表:用顺序存储方式实现的线性表。

>顺序存储:把逻辑上相邻的元素存储在物理位置上也相邻的存储单元中。

如何知道一个数据元素的大小?

-- C语言中,使用sizeof(ElemType)


顺序表的特点

优点:
(1)随机访问,即可以在O(1)时间内找到第i个元素。因为顺序表是线性表在内存空间中连续存放的,在代码中可以通过data[i-1]来实现随机访问(静态分配、动态分配都一样)。

(2)存储密度高,每个节点只存储数据元素。若线性表采用链表存储,则每个节点还需要额外存储指针内容。

缺点:

(1)拓展容量不方便。采用静态分配方式,数组长度不可以改变;采用动态分配方式,拓展长度的时间复杂度也比较高,因为此过程需要复制原来的内容到新开辟的内存空间中)。

(2)插入、删除操作不方便,需要移动大量元素。插入操作平均需要移动n/2个元素,删除操作平均需要移动(n-1)/2个元素。


顺序表的实现--静态分配

静态分配在声明一个顺序表时,就已经为其分配了数组空间,因此初始化时只需将顺序表当前长度设为0。

#define MaxSize 10 //定义最大长度 

typedef struct{
	ElemType data[MaxSize]; //用静态的“数组”存放数据元素 
	int length;             //顺序表当前长度length 
}SqList;                    //顺序表的类型定义(静态分配方式) 
//Sq: sequence 顺序,序列 

//SqList L;                 //声明一个顺序表 
void InitList(SqList &L){  
	L.length = 0;           //顺序表初始长度为0 
}

Q:如果“数组”存满了怎么办?

A:顺序表的表长,最初确定后就无法进行更改。因为存储空间是静态的。

Q:如果在最初就声明一个很大的内存空间,会存在什么问题?

A:会浪费存储空间。比如在一段代码中只用到了长度为10的数组,但是最初却申请了10000个存储单元空间,这样会浪费空间。


顺序表的实现--动态分配

动态分配的关键点:动态申请 释放内存空间。

C语言: malloc、free函数

              malloc函数返回一个指针,需要强制转型为自己定义的数据元素的类型指针。

              malloc函数,指明需要分配多大的连续内存空间

              >L.data = (ElemType *)malloc(sizeof(ElemType) * InitSize);

C++ new、delete关键字

代码:

#include <iostream>
#include <stdlib.h> //malloc  free函数的头文件 
#define InitSize 10 // 顺序表的初始长度
 
using namespace std;

typedef struct{
	int *data;   //指示动态分配数组的指针 
	int MaxSize; // 顺序表的最大容量 
	int length;  //顺序表的当前长度 
}SeqList;        //顺序表的类型定义(动态分配方式) 

void InitList(SeqList &L){
	//使用malloc函数申请一片连续的存储空间
	//malloc函数返回的是所申请的存储空间的起始地址 
	L.data = (int *)malloc(InitSize*sizeof(int)); //分配存储空间

	L.length = 0;  //顺序表初始长度为0
	L.MaxSize = InitSize;  //初始存储数量
}

int main(){
	SeqList L; //声明一个顺序表
	InitList(L); //初始化顺序表 
	
	return 0;
}

操作实例: 增加动态数组的长度

内存分配情况  可看图右。将原始数据复制到新开辟的内存中,最终释放掉原来的内存空间。

//#include<bits/stdc++.h>

#include <iostream>
#include <stdlib.h> //malloc  free函数的头文件 
#define InitSize 10 // 默认的最大长度
 
using namespace std;

typedef struct{
	int *data; //指示动态分配数组的指针 
	int MaxSize; // 顺序表的最大容量 
	int length; //顺序表的当前长度 
}SeqList;

void InitList(SeqList &L){
	//使用malloc函数申请一片连续的存储空间
	//malloc函数返回的是所申请的存储空间的起始地址 
	L.data = (int *)malloc(InitSize*sizeof(int));
	L.length = 0;  //当前的有效长度为0 
	L.MaxSize = InitSize;  //赋值为默认最大长度 
}

//增加动态数组的长度
void IncreaseSize(SeqList &L,int len){
	int *p = L.data; //设置指针,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; //顺序表的最大长度增加len,并更新
	
	free(p); //释放掉原来的内存空间 
} 

int main(){
	SeqList L; //声明一个顺序表
	InitList(L); //初始化顺序表 
	
	//往顺序表中随便插入5个元素
	IncreaseSize(L,5);
	
	return 0;
}

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

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

相关文章

Spring Boot使用AOP

一、为什么需要面向切面编程&#xff1f; 面向对象编程&#xff08;OOP&#xff09;的好处是显而易见的&#xff0c;缺点也同样明显。当需要为多个不具有继承关系的对象添加一个公共的方法的时候&#xff0c;例如日志记录、性能监控等&#xff0c;如果采用面向对象编程的方法&…

CSS优先级内容

定义CSS样式时&#xff0c;经常出现两个或多个样式规则应用在同一元素的情况&#xff0c;这时就会出现优先级的情况&#xff0c;那么应用的元素应该显示哪一个样式呢&#xff1f; 一.下面举例对优先级进行具体讲解。 p{color:red;} .blue{color:orange;} #header{color:blu…

OpenCV-27 Canny边缘检测

一、概念 Canny边缘检测算法是John F.Canny与1986年开发出来的一个多级边缘检测算法&#xff0c;也被很多人认为是边缘检测的最优算法。最优边缘检测的三个主要评价标准是&#xff1a; 低错频率&#xff1a;表示出尽可能多的实际边缘&#xff0c;同时尽可能的减小噪声产生的误…

Spring源码分析:refresh()

refresh()中共有13个方法&#xff0c;分别为 1.prepareRefresh() 容器刷新前的准备&#xff0c;设置上下文状态&#xff0c;获取属性&#xff0c;验证必要的属性等 protected void prepareRefresh() {//spring启动时间this.startupDate System.currentTimeMillis();//spring…

01 Redis的特性+下载安装启动+Redis自动启动+客户端连接

1.1 NoSQL NoSQL&#xff08;“non-relational”&#xff0c; “Not Only SQL”&#xff09;&#xff0c;泛指非关系型的数据库。 键值存储数据库 &#xff1a; 就像 Map 一样的 key-value 对。如Redis文档数据库 &#xff1a; NoSQL 与关系型数据的结合&#xff0c;最像关系…

Python如何获取程序打包后的目录,如何获取管理员权限

文章目录 📖 介绍 📖🏡 演示环境 🏡📒 实现步骤 📒📝 获取程序打包后所在目录📝 获取管理员权限⚓️ 相关链接 ⚓️📖 介绍 📖 Python 是一种功能强大的编程语言,本篇文章将介绍Python如何获取程序打包后所在目录,以及如何获取管理员权限并执行需要管理…

【深度学习】sdxl中的 tokenizer tokenizer_2 区别

代码仓库&#xff1a; https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/tree/main 截图&#xff1a; 为什么有两个分词器 tokenizer 和 tokenizer_2&#xff1f; 在仔细阅读这些代码后&#xff0c;我们了解到 tokenizer_2 主要是用于 refiner 模型的。 #…

javax.servlet.http包

javax.servlet.http包 javax.srvlet.http包是对javax.servlet包的扩展。该包的类和接口处理使用HTTP进行通信的servlet。这些servlet也称为HTTP Servlet。您需要扩展HttpServlet类来开发HTTP Servlet。javax.servlet.http包经常使用的接口包括: HttpServletRequest接口HttpSe…

Windows10上通过MSYS2编译FFmpeg 6.1.1源码操作步骤

1.从github上clone代码&#xff0c;并切换到n6.1.1版本&#xff1a;clone到D:\DownLoad目录下 git clone https://github.com/FFmpeg/FFmpeg.git git checkout n6.1.1 2.安装MSYS2并编译FFmpeg源码: (1).从https://www.msys2.org/ 下载msys2-x86_64-20240113.exe &#…

x-cmd pkg | shtris - 命令行俄罗斯方块游戏

目录 简介首次用户技术特点竞品和相关作品进一步阅读 简介 shtris 是一个由 shell 脚本&#xff0c;参考 俄罗斯方块指南 (2009) 实现的俄罗斯方块游戏。 首次用户 使用 x shtris 即可自动下载并使用 在终端运行 eval "$(curl https://get.x-cmd.com)" 即可完成 x …

[TCP协议]基于TCP协议的字典服务器

目录 1.TCP协议简介: 2.TCP协议在Java中封装的类以及方法 3.字典服务器 3.1服务器代码: 3.2客户端代码: 1.TCP协议简介: TCP协议是一种有连接,面向字节流,全双工,可靠的网络通信协议.它相对于UDP协议来说有以下几点好处: 1.它是可靠传输,相比于UDP协议,传输的数据更加可靠…

在ubuntu上在安装Squid代理服务器

Squid 是一个代理和缓存服务器&#xff0c;它将请求转发到所需的目的地&#xff0c;同时保存请求的内容&#xff0c;当你再次请求相同内容时&#xff0c;他可以向你提供缓冲内容&#xff0c;从而提高访问速度。Squid代理服务器目前支持的协议有&#xff1a;http、SSL、DNS、FTP…

【机组】单元模块的软件简介和安装

​&#x1f308;个人主页&#xff1a;Sarapines Programmer&#x1f525; 系列专栏&#xff1a;《机组 | 模块单元实验》⏰诗赋清音&#xff1a;云生高巅梦远游&#xff0c; 星光点缀碧海愁。 山川深邃情难晤&#xff0c; 剑气凌云志自修。 目录 【软件简介和安装】 1 性能特…

JVM篇:垃圾回收算法

标记清除 通过遍历GC Root后得到不再被引用的对象&#xff0c;对没被引用的对象做一个标记处理&#xff0c;然后对其进行清除。 优点&#xff1a;速度快 缺点&#xff1a;会产生内存碎片&#xff0c;可能会导致空闲的内存足够保存对象&#xff0c;但由于不连续而保存失败。 标…

Linux操作系统运维-用户与用户组管理

Linux操作系统运维-用户与用户组管理 用户种类与标识查看 超级用户&#xff08;root&#xff09;&#xff1a;可以不受限制地执行所有操作&#xff0c;拥有系统最高权限&#xff0c;修改系统设置与管理用户均需要root权限系统用户&#xff08;system&#xff09;&#xff1a;…

S275智慧煤矿4G物联网网关:矿山开采的未来已来

随着经济发展煤矿需求不断激增&#xff0c;矿山矿井普遍处于偏远山区&#xff0c;生产管理、人员安全、生产效率是每个矿山矿井都需要考虑的问题&#xff0c;利用网关对现场终端设备连接组网&#xff0c;实现智慧煤矿远程管理。 各矿山矿井分布范围比较广泛&#xff0c;户外环…

Leetcode541反转字符串Ⅱ(java实现)

我们今天分享的题目是字符串反转的进阶版反转字符串Ⅱ。 我们首先来看题目描述&#xff1a; 乍一看题目&#xff0c;有种懵逼的感觉&#xff0c;不要慌&#xff0c;博主来带着你分析题目&#xff0c;题目要求&#xff1a; 1. 每隔2k个字符&#xff0c;就对2k字符中的前k个字符…

【mongoDB】创建用户账号和权限

使用use database_name 命令创建或切换到一个数据库 查看用户 show users 输入该命令后&#xff0c;无数据表示该数据库没有用户 创建用户 user:" freedom " 表示用户名为freedom pwd:" 123456 ” 表示密码为123456 roles:[" root "] …

pcl之滤波器(三)

pcl滤波器 pcl一共是有十二个主要模块&#xff0c;详细了解可以查看官网。https://pcl.readthedocs.io/projects/tutorials/en/latest/#basic-usage 今天学习一下pcl的滤波器模块。 滤波器模块&#xff0c;官网一共是提供了6个例程&#xff0c;今天看第五个、第六个。 从一…

CSS设置单行文字水平垂直居中的方法

<!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>单行文字水平垂直居中</title><style>div {/* 给div设置宽高 */width: 400px;height: 200px;margin: 100px auto;background-color: red;/…