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

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

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

目录

顺序表的定义

顺序表的特点

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

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


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


顺序表的定义

>线性表是具有相同(每个数据元素所占的空间一样大)数据类型的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;  //顺序表初始长度为0L.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.hqwc.cn/news/435032.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#读取一个百万条数据的文件,同时批量一次性导入sqlitedb,需要花费多长时间

读取的代码&#xff1a; public void CSV2DataTableTest(string fileName){FileStream fs new FileStream(fileName, FileMode.Open, FileAccess.Read);StreamReader sr new StreamReader(fs, new UnicodeEncoding());//记录每次读取的一行记录string strLine "";…

大创项目推荐 题目:基于卷积神经网络的手写字符识别 - 深度学习

文章目录 0 前言1 简介2 LeNet-5 模型的介绍2.1 结构解析2.2 C1层2.3 S2层S2层和C3层连接 2.4 F6与C5层 3 写数字识别算法模型的构建3.1 输入层设计3.2 激活函数的选取3.3 卷积层设计3.4 降采样层3.5 输出层设计 4 网络模型的总体结构5 部分实现代码6 在线手写识别7 最后 0 前言…

Java基于 SpringBoot+Vue 的高校心理教育辅导系统的研究与实现

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

后端学习:数据库MySQL学习

数据库简介 数据库&#xff1a;英文为 DataBase&#xff0c;简称DB&#xff0c;它是存储和管理数据的仓库。   接下来&#xff0c;我们来学习Mysql的数据模型&#xff0c;数据库是如何来存储和管理数据的。在介绍 Mysql的数据模型之前&#xff0c;需要先了解一个概念&#xf…

线性代数----------学习记录

线性代数发展历程 &#xff08;1&#xff09;线性方程组&#xff1a;例如二元一次方程组&#xff1b; &#xff08;2&#xff09;行列式&#xff1a;determinant,克莱默&#xff0c;莱布尼兹&#xff1b; &#xff08;3&#xff09;矩阵&#xff1a;方程个数与未知数的个数可…

CMake简明教程 笔记

推荐B站视频&#xff1a;1.1 Cmake构建项目的流程_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1xa4y1R7vT?p1&vd_sourcea934d7fc6f47698a29dac90a922ba5a3 >>目录 1&#xff09;CMake初体验 CMake构建流程Windows下使用CMake构建项目Linux下使用CMake构…

Django实战

一、开发登录表单 def login_form(request):html = <html><body><form method="post">用户名:<input name = "username" type="text"></input></br>密码:<input name = "password" type = &q…

蓝牙----蓝牙GAP层

蓝牙协议栈----GAP GAP的角色连接过程连接参数 GAP&#xff1a;通用访问配置协议层 gap的角色发现的模式与过程连接模式与过程安全模式与过程 CC2640R2F的GAP层抽象 GAP的角色 Broadcaster 广播电台 -不可连接的广播者。Observer 观察者 -扫描广播者但无法启动连接。Periphe…

【T6】畅捷通T6软件后, 打开总账模块,提示:3343不可识别的数据库格式。

【问题描述】 登录畅捷通T6软件后&#xff0c; 打开总账模块&#xff0c;提示&#xff1a;3343不可识别的数据库格式 C: Windows\system32\UFCOMSQL\Ufformat.mdb。 【解决方法】 找到相同系统、软件版本正常的环境下&#xff0c; 将【Ufformat.mdb】文件进行覆盖。 【附件文…

python222网站实战(SpringBoot+SpringSecurity+MybatisPlus+thymeleaf+layui)-友情链接管理实现

锋哥原创的SpringbootLayui python222网站实战&#xff1a; python222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火爆连载更新中... )_哔哩哔哩_bilibilipython222网站实战课程视频教程&#xff08;SpringBootPython爬虫实战&#xff09; ( 火…

el-upload上传文件,如何使用action、auto-upload

1点击打开自动上传 没有 :auto-upload"false"就是自动上传 2点击上传按钮上传 不自动上传:auto-upload"false" <el-dialogstyle"background: rgb(18, 67, 112); border: 1px solid #409eff":title"上传文件":model-value"…

JavaEE-自定义SSM-编写核心- my spring bean工厂(IoC、DI)

3.4 my spring bean工厂&#xff08;IoC、DI&#xff09; 加载类解析类获得类 3.4.0 分析 3.4.1 扫描指定包下的所有类 package com.czxy.bean;import java.io.File; import java.util.ArrayList; import java.util.List; import java.util.Objects;public class MyBeanFac…