数据结构--顺序表的定义

news2024/12/22 20:55:27

数据结构–顺序表的定义

知识总览

顺序表 \color{red}顺序表 顺序表―一用 顺序存储 \color{red}顺序存储 顺序存储的方式实现线性表
顺序存储。把 逻辑上相邻 \color{red}逻辑上相邻 逻辑上相邻的元素存储在 物理位置上也相邻 \color{red}物理位置上也相邻 物理位置上也相邻的存储单元中,元素之间的关系由存储单元的邻接关系来体现。

线性表是具有 相同 \color{red}相同 相同数据类型的n( n ≥ 0 n\ge0 n0)个 数据元素 \color{purple}数据元素 数据元素的有限序列

eg:

typedef struct
{
	int num;
	int people;
} Customer

如何知道一个数据元素大小?
在C语言中我们可以使用sizeof(ElemType)
eg:
sizeof(int) = 4B
sizeof(Customer) = 8B

静态分配

下面展示一个静态分配顺序表的C代码

#include <stdio.h>
#define MaxSize 10
typedef struct
{
	int date[MaxSize];
	int len;
}SqList;
void InitList(SqList &L) // 初始化
{
	for (int i = 0; i < MaxSize; i++)
		L.date[i] = 0;
	L.len = 0;
}
int main()
{
	SqList L;
	InitList(L);
	// ... 
	return 0;
}
L在内存中的样子:

ps:
初始化很重要
因为内存中会有遗留的藏数据 \color{purple}因为内存中会有遗留的藏数据 因为内存中会有遗留的藏数据

两个问题

如果“数组”存满了怎么办?
答:无可救药,没有办法,顺序表的表长刚开始确定后就无法更改(存储空间是静态的)。

如果刚开始就声明一个很大的内存空间呢?存在什么问题?
答:浪费空间

动态分配

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

C关于申请与释放内存空间的两个函数

malloc和free函数是C语言中动态内存分配的函数。动态内存分配是指在程序运行时,根据需要动态地分配内存空间,以便存储数据。与之相对的是静态内存分配,即在程序编译时就确定了内存空间的大小和位置。

malloc函数用于在堆上分配指定大小的内存空间,其原型为:

void *malloc(size_t size);

其中,size_t为无符号整数类型,表示要分配的内存空间大小,单位是字节。函数返回值为void类型的指针,指向分配的内存空间的首地址。如果分配失败,函数返回NULL。

下面是一个简单的示例代码:

int *p = (int *)malloc(10 * sizeof(int));
if (p == NULL) {
  printf("Memory allocation failed.\n");
} else {
  // 使用p指针指向的内存空间
  // ...
  // 释放p指向的内存空间
  free(p);
}

在上面的代码中,malloc函数分配了10个int类型的内存空间,大小为40字节。如果分配成功,p指针将指向这个内存空间的首地址。使用完这个内存空间后,需要使用free函数将其释放,以便其他程序可以使用。

free函数的原型为:

void free(void *ptr);

其中,ptr为指向要释放的内存空间的指针。调用free函数后,该内存空间将被释放,可以被其他程序使用。需要注意的是,如果ptr指向的内存空间已经被释放,或者ptr为NULL,调用free函数将会产生未定义的行为。

需要注意的是,动态内存分配需要谨慎使用,否则可能会导致内存泄漏、内存溢出等问题。在使用malloc和free函数时,应该遵循以下原则:

  • 在使用malloc函数分配内存空间后,一定要及时使用free函数释放内存空间,避免内存泄漏。
  • 在使用指向动态内存空间的指针之前,一定要检查指针是否为NULL,避免出现未定义的行为。
  • 在使用malloc函数分配内存空间时,要确保分配的内存空间大小足够,避免内存溢出。
  • 在使用free函数释放内存空间时,要确保要释放的内存空间确实是动态分配的,避免出现未定义的行为。

总之,malloc和free函数是C语言中非常重要的动态内存分配函数,需要谨慎使用,遵循相关的使用原则,以避免出现内存相关的问题。

动态分配线性表代码eg

#include <stdio.h>
#include <stdlib.h>
#define InitSize 10 //默认的最大长度

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

void InitList(SeqList &L)
{
    //用malloc函数申请一片连续的存储空间
    L.data = (int *)malloc(InitSize * sizeof(int));
    L.length = 8;
    L.MaxSize = InitSize;
}

//增加动态数组的长度
// realloc函数也可实现
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; //顺序表最大长度增加len
    free(p); //释放原来的内存空间
}

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

}
内存图示:

扩展 − − r e a l l o c 函数: \color{green}扩展 -- realloc函数: 扩展realloc函数:
realloc函数是C语言标准库中用于重新分配内存空间的函数。其原型为:

void *realloc(void *ptr, size_t size);

其中,ptr为指向要重新分配内存空间的指针,size为要分配的新内存空间的大小,单位是字节。函数返回值为void类型的指针,指向新分配的内存空间的首地址。如果分配失败,函数返回NULL。

realloc函数在以下情况下非常有用:

  • 当需要扩大已分配内存空间的大小时,可以使用realloc函数将已分配的内存空间扩大到新的大小。
  • 当需要缩小已分配内存空间的大小时,可以使用realloc函数将已分配的内存空间缩小到新的大小。
  • 当需要使用已分配的内存空间大小时,可以使用realloc函数获取当前已分配内存空间的大小。

下面是一个简单的示例代码:

int *p = (int *)malloc(10 * sizeof(int));
if (p == NULL) {
  printf("Memory allocation failed.\n");
} else {
  // 使用p指针指向的内存空间
  // ...
  // 扩大p指向的内存空间
  int *q = (int *)realloc(p, 20 * sizeof(int));
  if (q == NULL) {
    printf("Memory reallocation failed.\n");
  } else {
    // 使用q指针指向的内存空间
    // ...
    // 缩小q指向的内存空间
    int *r = (int *)realloc(q, 5 * sizeof(int));
    if (r == NULL) {
      printf("Memory reallocation failed.\n");
    } else {
      // 使用r指针指向的内存空间
      // ...
      // 获取r指向的内存空间大小
      size_t size = malloc_usable_size(r);
      printf("Memory size: %zu bytes.\n", size);
      // 释放r指向的内存空间
      free(r);
    }
  }
}

在上面的代码中,首先使用malloc函数分配了10个int类型的内存空间,大小为40字节。然后,使用realloc函数将这个内存空间扩大到20个int类型,大小为80字节;再使用realloc函数将这个内存空间缩小到5个int类型,大小为20字节。最后,使用malloc_usable_size函数获取当前内存空间的大小,并使用printf函数输出。使用完这个内存空间后,需要使用free函数将其释放,以便其他程序可以使用。

需要注意的是,realloc函数可能会重新分配内存空间,因此使用realloc函数时,一定要注意指针的有效性,避免出现未定义的行为。

顺序表的特点

代码实现:data[i-1];
①随机访问,即可以在O(1)时间内找到第 i i i 个元素。
②存储密度高,每个节点只存储数据元素
③拓展容量不方便(即便采用动态分配的方式实现,拓展长度的时间复杂度也比较高)

知识点回顾与重要考点

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

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

相关文章

设计模式第16讲——迭代器模式(Iterator)

目录 一、什么是迭代器模式 二、角色组成 三、 优缺点 四、应用场景 4.1 生活场景 4.2 java场景 五、代码实现 5.0 代码结构 5.1 Student——学生实体类 5.2 StudentIterator——抽象迭代器&#xff08;Iterator&#xff09; 5.3 StudentListIterator——具体迭代器…

threejs官方demo学习:模型加载

前言 案例太多了&#xff0c;考虑了一下&#xff0c;实际项目中有可能用的情况一般就是加载模型&#xff0c;然后对模型进行一些操作。因此打算好好看一下关于模型加载的案例&#xff0c;其他案例就不看了。 模型加载并改变材质 <script lang"ts" setup> im…

基于 FPGA 的单脉冲技术:算法设计(附源码)

一、前言 本例显示了开发单脉冲技术的工作流程的前半部分&#xff0c;其中信号使用数字下变频&#xff08;DDC&#xff09;进行下变频。本例中的模型适合在FPGA上实现。本示例重点介绍单脉冲技术的设计&#xff0c;以估计物体的方位角和仰角。 示例的第二部分是基于FPGA的单脉冲…

【C++】hash:unordered_map和unordered_set的底层结构

hash 哈希概念哈希冲突哈希函数哈希冲突的两种解决方法之闭散列哈希冲突的两种解决方法之开散列开散列和闭散列的比较 哈希概念 在c98中还并没有提出哈希这样的结构&#xff0c;只有以红黑树为底层结构的map&#xff0c;set系列&#xff0c;这样使得查询时的效率 l o g 2 N lo…

c语言修炼第二章--分支与循环

目录 前言 2.1分支语句 2.1.1什么是语句 2.2分支语句 2.2.1if语句的语法形式 2.2.2悬空else问题 2.2.3if书写形式的对比 2.3switch语句 2.3.1switch的语法形式 2.3.2 switch与break的关系 2.3.3 switch与default的关系 前言 小伙伴们端午安康吖&#xff01;今天我们…

Mac菜单栏快捷开关 One Switch

One Switch是一款简单易用的 macOS 应用程序&#xff0c;它可以帮助用户快速地切换和管理 Mac 电脑的各种系统设置。这款应用程序提供了一个干净简洁的界面&#xff0c;让用户可以快速地启用或禁用诸如 Wi-Fi、蓝牙、Night Shift、暗色模式、Do Not Disturb 等功能。用户可以通…

建立无需build的vue单页面应用SPA框架

vue、react这种前端渲染的框架&#xff0c;比较适合做SPA&#xff08;Single Page Application&#xff09;。如果用ejs做SPA&#xff0c;js代码控制好全局变量冲突不算严重&#xff0c;但dom元素用jquery操作会遇到很多的名称上的冲突&#xff08;tag、id、name&#xff09;。…

运动蓝牙耳机怎么选、好用的运动蓝牙耳机推荐

在快节奏的现代生活中&#xff0c;运动成为了释放压力、保持健康和放松身心的重要方式。跑步、健身、骑行等各类运动成为了人们日常生活中不可或缺的一部分。然而&#xff0c;一场精彩的运动体验离不开动感的音乐伴奏。为了满足人们对高品质音乐的追求&#xff0c;一款出色的运…

nvm安装、管理多个node版本

1、官网下载nvm https://github.com/coreybutler/nvm-windows/releases 2、解压ZIP&#xff0c;双击nvm-setup.exe(假如以前安装了node.js&#xff0c;把以前的卸载了再安装nvm) 3、安装nvm 注意&#xff1a;这一步的nodejs目录需要手动创建 4、安装完毕&#xff0c;设置下载镜…

OpenCV动态人物识别代码

动态人物识别代码 int main() {// 打开视频文件或摄像头VideoCapture cap("vtest.avi");// VideoCapture cap(0); // 使用默认摄像头if (!cap.isOpened()){std::cout << "无法打开视频文件或摄像头流" << std::endl;return -1;}// 读取第一帧…

幽灵依赖是什么,pnpm出现的意义,使用pnpm创建一个vue3项目

什么是幽灵依赖&#xff08;幻影依赖&#xff09; 比如我们创建一个全新的vue3项目 然后我们正常地通过npm install来下载依赖 然后我们发现&#xff0c;node_ modules文件夹下的很多依赖&#xff0c;我们在package.json中明明没去声明却都下载下来了 那么这些没声明却下载…

SQL-游标-查询

/***DB版本&#xff1a;SQL Server 2022***/ --切换数据库 use MyDatabase--创建游标(scroll&#xff1a;滚动游标) declare mycur cursor scroll for select EmpNo from Employee--打开游标 open mycur --提取第一行 fetch first from mycur --提取最后一行 fetch last from m…

ansible自动化安装及简单操作

目录 一、运行机制 二、安装 1.下载ansible 2.配置免密 3.修改配置文件 4.创建主机清单 5.远程安装 6.远程卸载 一、运行机制 Ansible&#xff1a; ansible的核心模块 Host Inventory&#xff1a;主机清单&#xff0c;也就是被管理的主机列表 Playbooks&…

实战打靶集锦-021-glasgowsmile

提示&#xff1a;本文记录了博主的一次曲折的打靶经历。 目录 1. 主机发现2. 端口扫描3. 服务枚举4. 服务探查4.1 手工访问4.2 目录枚举4.3 手工探查4.4 搜索EXP4.5 joomlascan4.6 用户猜测与密码爆破4.7 构建反弹shell 5. 提权5.1 优化shell5.2 枚举系统信息5.3 探查/etc/pass…

虚拟机VMware+Ubuntu配置DPDK环境并运行Helloworld

虚拟机VMwareUbuntu配置DPDK环境并运行Helloworld 文章目录 虚拟机VMwareUbuntu配置DPDK环境并运行Helloworld安装虚拟机虚拟机中安装DPDK运行Helloworld 首先需要强调的是&#xff0c;版本的影响很大&#xff0c;有可能会因为版本不匹配而导致无法成功配置DPDK环境。 安装虚拟…

【Leetcode -637.二叉树的层平均值 -671.二叉树中第二小的节点】

Leetcode Leetcode -637.二叉树的层平均值Leetcode -671.二叉树中第二小的节点 Leetcode -637.二叉树的层平均值 题目&#xff1a;给定一个非空二叉树的根节点 root , 以数组的形式返回每一层节点的平均值。与实际答案相差 10^(- 5) 以内的答案可以被接受。 示例 1&#xff1…

TCP服务器的C#实现

1、TCP实现类 internal class TcpServer{public Socket ServerSocket { get; set; }public Dictionary<string,Socket> Sockets { get; set; } new Dictionary<string,Socket>();public byte[] SendBuffer { get; set; }public byte[] ReceiveBuffer { get; set; …

Qt消息对话框

一、头文件及类型 #include<QMessageBox> 二、错误、信息、提示、警告演示 错误对话框 QMessageBox::critical(this,"critical","错误"); 信息对话框 QMessageBox::information(this,"info","信息"); 提问对话框 if(QMessageBo…

发布自己的第一个抖音小程序

结构与微信小程序一样 内嵌H5网页&#xff0c;适用于任何平台&#xff0c;同样也是使用web-view组件 <web-view src"https://some-domain/some/path"></web-view> 相比起来&#xff0c;它比微信小程序更加简化&#xff0c;开发会更方便了。 API查询地…

超越Java 7,迎接Java 8时代!掌握这些新特性提升你的编程技能!

大家好&#xff0c;我是小米&#xff0c;一个热衷于技术分享的小伙伴。今天&#xff0c;我将向大家介绍Java 8中的一些新特性。Java 8作为一次重大更新&#xff0c;引入了许多令人激动的新功能&#xff0c;让我们的编码变得更加简洁高效。接下来&#xff0c;我们将详细介绍这些…