【手撕数据结构】(三)顺序表和链表

news2024/11/15 9:06:06

在这里插入图片描述

文章目录

  • 一、线性表
  • 二、顺序表
    • 1.概念及结构
    • 2.关于数组
    • 3.顺序表分类
      • 🎗️静态顺序表
      • 🎗️动态顺序表
    • 4.接口实现
      • (1)思路
      • (2)SeqList.h文件代码
        • 功能1:顺序表初始化
        • 功能2:销毁顺序表
        • 功能3:尾插
        • 功能4:头插
        • 功能5:尾删
        • 功能6:头删
        • 功能7:打印
        • 功能8:在pos位置处插入数据
        • 功能9:在pos位置处删除数据
        • 功能10:查找,找到返回下标,没有找到返回-1
        • 功能11:修改pos位置处的值
        • 完整代码展示
      • (3)SeqList.c文件代码
        • 实现功能1:顺序表初始化
        • 实现功能2:销毁顺序表
        • 实现功能3:尾插
        • 辅助功能:检查容量
        • 实现功能4:头插
        • 实现功能5:尾删
        • 实现功能6:头删
        • 实现功能7:打印
        • 实现功能8:在pos位置处插入数据
          • 复写功能:复用SLInsert重写头插、尾插
        • 实现功能9:在pos位置处删除数据
          • 复写功能:复用SLErase覆写头删、尾删![在这里插入图片描述](https://img-blog.csdnimg.cn/bffdab83cc2443019728ed16801b0578.png)
        • 实现功能10:查找
        • 实现功能11:修改pos位置处的值
        • 完整代码
      • (4)test.c文件代码
        • 测试1:尾插
        • 测试2:头插
        • 测试3:尾删
        • 测试4:头删
        • 测试5:pos位置处插入
        • 测试6:pos位置处删除
        • 测试7:查找
        • 测试8:如果有人传进来空指针怎么办?
  • 总结

一、线性表

🎗️线性表是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表、链表、栈、队列、字符串…
🎗️线性表在逻辑上是线性结构,也就说是一条连续的直线。但是在物理结构上并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储。
在这里插入图片描述

二、顺序表

1.概念及结构

顺序表是一段物理地址连续的存储单元依次存储数据元素的线性结构。一般情况下,采用数组存储。在数组上完成数据的增删查改。

顺序表的本质是一个数组;要求数据必须从前往后连续存储。

2.关于数组

(1)数组怎么管理?

指针指向数组开始的位置,就能找到后面的位置。

(2)数组的缺陷

数组删除数据时,不能把数据所在的这块空间释放掉,只能把这一片数组空间都释放掉。数组删除元素的方式是挪动覆盖。

(3)数组的优势

下标的随机访问(原因是数组的物理空间连续)
a[i]等价于*(a+i)

(4)怎样弥补数组的缺陷

用链表。链表是一块一块的小空间,不是一个完整的连续空间。
如果有一个指针指向链表的第一个位置,不能找到后面的位置。因为他们是一块一块独立的空间,是多次malloc出来的,它们之间在地址上是没有关联的。
要想找到下一个位置,就得在上一个位置处存一个指针,指针指向下一个地址。
在这里插入图片描述
(二分查找不能在链表中使用,能在数组中使用;
排序不能在链表中使用,能在数组中使用)

3.顺序表分类

🎗️静态顺序表

使用定长数组存储元素。

#define N 7
typedef int SLDataType;
typedef struct SeqList {
	SLDataType array[N];  //定长数组
	int size;     //有效数据的个数
}SeqList;

在这里插入图片描述
总结:
静态顺序表缺点:空间是固定的,给小了不够用,给多了浪费

🎗️动态顺序表

使用动态开辟的数组存储。

typedef int SLDataType;
typedef struct SeqList {
	SLDataType* array;  //指向动态开辟的数组
	int size;  //存储的有效数据个数(知道什么时候扩容)
	int capacity;  //容量空间的大小
};

在这里插入图片描述

4.接口实现

静态顺序表只适用于确定知道需要存多少数据的场景。静态顺序表的定长数组导致N定大了,空间开多了浪费,开少了不够用。所以现实中基本上都是使用动态顺序表,根据需要动态的分配空间大小,所以我们下面实现动态顺序表。

(1)思路

建立三个文件
SeqList.c写接口的实现
SeqList.h写接口的声明
test.c写调用测试接口

(2)SeqList.h文件代码

首先,在里面定义动态顺序表的结构体
在这里插入图片描述

功能1:顺序表初始化

在这里插入图片描述

🎗️注意:在形参部分不要写成下面这样:
在这里插入图片描述
如果写成这样,就会出现经典的传值传参问题。此时,传过去的是值,实参传给形参,是一种拷贝。把s传给形参sl,形参sl变量的改变不会影响实参s,因为他们是在两个栈帧里面。
所以不要传结构体的值,而要传结构体的地址。

功能2:销毁顺序表

在这里插入图片描述

功能3:尾插

在这里插入图片描述

功能4:头插

在这里插入图片描述

功能5:尾删

在这里插入图片描述

功能6:头删

在这里插入图片描述

功能7:打印

在这里插入图片描述

功能8:在pos位置处插入数据

在这里插入图片描述

功能9:在pos位置处删除数据

在这里插入图片描述

功能10:查找,找到返回下标,没有找到返回-1

在这里插入图片描述

功能11:修改pos位置处的值

在这里插入图片描述

完整代码展示
#define _CRT_SECURE_NO_WARNINGS 1

#pragma once
#include<stdio.h>
#include<assert.h>
#include<stdlib.h>


typedef int SLDataType;
typedef struct SeqList {
	SLDataType* a;
	int size;
	int capacity;
}SL;

void SLInit(SL* psl);//顺序表初始化
void SlDestroy(SL* psl);//销毁顺序表
void SLPushBack(SL* psl, SLDataType x);//尾插
void SLPushFront(SL* psl, SLDataType x);//头插
void SLPopBack(SL* psl);//尾删
void SLPopFront(SL* psl);//头删
void SLPrint(SL* psl);//打印
void SLInsert(SL* psl, int pos, SLDataType x); //在pos位置处插入数据
void SLErase(SL* psl, int pos);  //在pos位置处删除数据(也经常写作SLRemove)
int SLFind(SL* psl, SLDataType x);  //查找,找到返回下标,没有找到返回-1
void SLModify(SL* psl, int pos, SLDataType x); //修改pos下标位置的值


(3)SeqList.c文件代码

实现功能1:顺序表初始化

在这里插入图片描述

实现功能2:销毁顺序表

在这里插入图片描述

实现功能3:尾插

在这里插入图片描述

辅助功能:检查容量

在这里插入图片描述

实现功能4:头插

在这里插入图片描述

实现功能5:尾删

在这里插入图片描述

实现功能6:头删

在这里插入图片描述
在这里插入图片描述

实现功能7:打印

在这里插入图片描述

实现功能8:在pos位置处插入数据

在这里插入图片描述
在这里插入图片描述

复写功能:复用SLInsert重写头插、尾插

在这里插入图片描述

实现功能9:在pos位置处删除数据

在这里插入图片描述
在这里插入图片描述

复写功能:复用SLErase覆写头删、尾删在这里插入图片描述
实现功能10:查找

在这里插入图片描述

实现功能11:修改pos位置处的值

在这里插入图片描述

完整代码
#define _CRT_SECURE_NO_WARNINGS 1
#include "SeqList.h"

//顺序表初始化
void SLInit(SL* psl) {
	assert(psl);//断言,判断传进来的指针不是空指针,避免后续对空指针解引用出错
	psl->a = (SLDataType*)malloc(sizeof(SLDataType) * 4);//在初始化的时候,最好的写法是一开始就开辟一点空间,开四个(不长也不短,是一个合适的数字)
	if (psl->a == NULL) {                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
		perror("malloc fail"); 
		return;
	}
	psl->size = 0;
	psl->capacity = 4;
}

//销毁顺序表---意思是把空间还给操作系统,像退房一样
void SLDestroy(SL* psl) {
	assert(psl);
	free(psl->a);
	psl->a = NULL;
	
	psl->size = 0;
	psl->capacity = 0;
}

//尾插
void SLPushBack(SL* psl, SLDataType x) {
	assert(psl);
	psl->a[psl->size] = x;
	psl->size++;
}

//检查容量
void SLCheckCapacity(SL* psl) {
	assert(psl);
	if (psl->size == psl->capacity) {
		SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType) * psl->capacity * 2);
		if (tmp == NULL) {
			perror("realloc fail");
			return;
		}
		psl->a = tmp;
		psl->capacity *= 2;
	}
}

//打印
void SLPrint(SL* psl) {
	assert(psl);
	for (int i = 0; i < psl->size; i++) {
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}

//头插
void SLPushFront(SL* psl, SLDataType x) {
	assert(psl);
	SLCheckCapacity(psl);

	//挪动数据
	int end = psl->size - 1;
	while (end >= 0) {
		psl->a[end + 1] = psl->a[end];
		--end;
	}
	psl->a[0] = x;
	psl->size++;
}

//由在pos位置插入数据的功能函数重写头插、尾插,复用SLInsert
//void SLPushFront(SL* psl, SLDataType x) {
//	SLInsert(psl, 0, x);
//}
//void SLPushBack(SL* psl, SLDataType x) {
//	SLInsert(psl, psl->size, x);
//}

//尾删
void SLPopBack(SL* psl) {
	assert(psl);
	/*
	顺序表为空时,就不要再删了
	温柔的检查
	if (psl->size == 0) {
		return 0;
	}
	暴力检查(推荐):断言,如果psl->size>0为真就通过了,如果为假就会报错
	assert(psl->size > 0);
	*/
	
	//暴力检查(推荐)
	assert(psl->size > 0);


	//psl->a[psl->size-1]=0;
	//注意这样写不好,万一最后一个位置是0,这样做没意义,如果在数组中的元素类型是double,如今改为0不好,最好改为0.0
	//所以最好的做法是不管尾部数据是多少,只修改顺序表的长度size(有效数据个数)

	psl->size--;
}

//头删
void SLPopFront(SL* psl) {
	assert(psl);
	//暴力检查顺序表是不是为空
	assert(psl->size);

	//把下标start+1的元素挪给下标start处
	int start = 0; 
	while (start < psl->size - 1) {
		psl->a[start] = psl->a[start + 1];
		start++;
	}
	

	/*
	start为1时,将下标start的元素挪给下标start-1处
	int start = 1;
	while (start < psl->size) {
		psl->a[start - 1] = psl->a[start];
		start++;
	}
	*/

	psl->size--;
	
}

//在pos位置处插入数据
void SLInsert(SL* psl,int pos, SLDataType x) {
	assert(psl);
	assert(0 <= pos && pos <= psl->size); //断言pos,不要让插入的位置下标越界

	SLCheckCapacity(psl);  //只要是插入数据,都要关注容量
	int end = psl->size - 1;
	while (end >= pos) {
		psl->a[end + 1] = psl->a[end];
		--end;
	}
	psl->a[pos] = x;
	psl->size++;
}


//在pos位置处删除数据
void SLErase(SL* psl, int pos){
	assert(psl);
	assert(0 <= pos && pos < psl->size); //注意这里的pos不能等于psl->size
	//assert(psl->size>0);  这句代码是用来断言有效数据个数为不为空,为空时不用删,但是这句代码加不加都行,因为上一句已经间接检查了

	int start = pos + 1;
	while (start < psl->size) {
		psl->a[start - 1] = psl->a[start];
		++start;
	}
	psl->size--;
}

//复用SLErase覆写头删、尾删
//void SLPopFront(SL* psl) {
//	SLErase(psl, 0);
//}
//void SLPopBack(SL* psl) {
//	SLErase(psl, psl->size - 1);
//}


//查找
int SLFind(SL* psl, SLDataType x) {
	assert(psl);
	for (int i = 0; i < psl->size; i++) {
		if (psl->a[i] == x) {
			return i;
		}
	}
	return -1;
}

//修改
void SLModify(SL* psl, int pos,SLDataType x) {
	assert(psl);
	assert(0 <= pos && pos < psl->size);

	psl->a[pos] = x;
}

(4)test.c文件代码

测试1:尾插

在这里插入图片描述
在这里插入图片描述

测试2:头插

在这里插入图片描述
在这里插入图片描述

测试3:尾删

在这里插入图片描述
在这里插入图片描述

测试4:头删

在这里插入图片描述
在这里插入图片描述

测试5:pos位置处插入

在这里插入图片描述
在这里插入图片描述

测试6:pos位置处删除

在这里插入图片描述
在这里插入图片描述

测试7:查找

在这里插入图片描述
在这里插入图片描述

测试8:如果有人传进来空指针怎么办?

在这里插入图片描述
在这里插入图片描述
所以说怎么办?

在每个函数内部做一下断言,暴力检查一下。暴力检查的好处是不用调试,出错时会出现错误提示。如下图:
在这里插入图片描述

为什么不在main函数中做断言?

写的函数才是给我们用的,不要在调用函数时去检查(也就是说让调用的人去检查,如果他会检查,就不会传空进来了)


总结

顺序表的内容就到这里啦~欢迎大家关注后续内容
👻

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

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

相关文章

硬盘Write Cache设置效果差异之谜!

Write Cache这个概念对于大家应该不陌生&#xff0c;主要是机械HDD中会有很明显的效果。 Write Cache Enable&#xff0c;WCE&#xff1a;数据不会直接落盘&#xff0c;而是写入DRAM缓存后就直接返回了&#xff0c;对于随机写和顺序写的性能都会有所改善。这个场景&#xff0c;…

el-table 对循环产生的空白列赋默认值

1. el-table 空白列赋值 对el-table中未传数据存在空白的列赋默认值0。使用el-table 提供的插槽 slot-scope&#xff1a;{{ row || ‘0’ }} 原数据&#xff1a; <el-table-column label"集镇" :propcity ><template slot-scope"{row}">{{…

机器学习-笔记

绪论 参考期刊 ICCV 偏向视觉CVPR 偏向MLIAAA AI原理ICML 参考链接 CSDN 机器学习知识点全面总结 课堂内容学习-0912-N1 对于特征提取&#xff0c;简而言之就是同类聚得紧&#xff0c;异类分得开&#xff1b;   detection研究的是样本二分类问题&#xff0c;即分为正样本…

【ArcGIS Pro微课1000例】0033:ArcGIS Pro处理cad数据(格式转换、投影变换)

文章目录 一、cad dwg转shp1. 导出为shp2. cad至地理数据库3. data interoperability tools二、shp投影变换一、cad dwg转shp 1. 导出为shp 加载cad数据,显示如下: 选择需要导出的数据,如面状,右键→数据→导出要素: 导出要素参数如下,点击确定。 导出的要素不带空间参…

“非旺玖原装的PL2303,.........“解决办法

"非旺玖原装的PL2303&#xff0c;…"解决办法 windows安装PL2303串口驱动提示“非旺玖原装的PL2303&#xff0c;请联系您的供货商”的解决办法&#xff1a; 主要原因&#xff1a;驱动版本无法兼容&#xff0c;需要降低使用版本 解决办法&#xff1a; 1.插好串口线&…

某60区块链安全之不安全的随机数实战二学习记录

区块链安全 文章目录 区块链安全不安全的随机数实战二实验目的实验环境实验工具实验原理实验内容EXP利用 不安全的随机数实战二 实验目的 学会使用python3的web3模块 学会以太坊不安全的随机数漏洞分析及利用 实验环境 Ubuntu18.04操作机 实验工具 python3 实验原理 由…

Vue - Router

一、概述 路由 所谓路由&#xff0c;就是决定起点到终点的路径的进程。而在前端工程中&#xff0c;路由指的是根据不同的访问路径&#xff0c;展示不同组件的内容 Vue官方提供的路由功能叫 Vue-Router 二、如何使用 步骤 1、安装vue-router npm install router4 4是指第四个…

网络安全涉及哪些方面?

1.系统安全&#xff1a;运行系统安全即保证信息处理和传输系统的安全。它侧重于保证系统正常运行&#xff0c;避免因为系统的损坏而对系统存储、处理和传输的消息造成破坏和损失&#xff0c;避免由于电磁泄露&#xff0c;产生信息泄露&#xff0c;干扰他人或受他人干扰。 2. 网…

表内容的操作(增删查改)【MySQL】

文章目录 表的 CRUDCreate&#xff08;增加&#xff09;插入记录插入冲突则更新记录替换记录 Retrieve&#xff08;查找&#xff09;查找记录指定表达式的别名为结果去重WHERE 子句运算符条件查询区间查询模糊查询空值查询 对结果排序筛选分页结果 Update&#xff08;修改&…

golang学习笔记——日志记录

文章目录 日志与错误log包记录到文件记录框架Contextual LoggingLeveled LoggingSetting Global Log Level Error Logging 日志与错误 通常&#xff0c;发生错误时&#xff0c;最终用户只会看到一条消息&#xff0c;指示程序出现问题。日志是简单错误消息以外的更多信息。 lo…

助力制造企业降本增效,生成式AI技术大有可为

对于2023年的科技领域来说&#xff0c;生成式AI&#xff08;Artificial Intelligence Generated Content&#xff0c;也称AIGC&#xff09;绝对是最热门的焦点话题&#xff0c;没有之一。 那么对于制造行业来说&#xff0c;他们应该怎样从生成式AI这项新兴技术中获益&#xff1…

python爬虫SHA案例:某直播大数据分析平台

声明&#xff1a; 该文章为学习使用&#xff0c;严禁用于商业用途和非法用途&#xff0c;违者后果自负&#xff0c;由此产生的一切后果均与作者无关 一、找出需要加密的参数 js运行 atob(‘aHR0cDovL3d3dy5oaDEwMjQuY29tLyMvc2VhcmNoL3NlYXJjaA’) 拿到网址&#xff0c;F12打…

VS2019编译安装GDAL(C++)程序库

一、GDAL简介 GDAL&#xff0c;全称Geospatial Data Abstraction Library&#xff0c;即地理空间数据抽象库&#xff0c;是一个在X/MIT许可协议下读写空间数据的开源库&#xff0c;可以通过命令行工具来进行数据的转换和处理。而在调用中我们常用的OGR&#xff08;OpenGIS Simp…

11.20 知识总结(choices参数、MVC和MTV的模式、Django与Ajax技术)

一、 choices参数的使用 1.1 作用 针对某个可以列举完全的可能性字段&#xff0c;我们应该如何存储 .只要某个字段的可能性是可以列举完全的&#xff0c;那么一般情况下都会采用choices参数 1.2 应用场景 应用场景&#xff1a; 学历&#xff1a; 小学 初中 高中 本科 硕士…

【旅游行业】Axure旅游社交平台APP端原型图,攻略门票酒店民宿实战模板

作品概况 页面数量&#xff1a;共 110 页 兼容软件&#xff1a;Axure RP 9/10&#xff0c;不支持低版本 应用领域&#xff1a;旅游平台&#xff0c;酒店住宿 作品申明&#xff1a;页面内容仅用于功能演示&#xff0c;无实际功能 作品特色 本作品为「旅游社交平台」移动端…

什么是希尔伯特空间?

照片由 丹克里斯蒂安佩杜雷什 on Unsplash 一、说明 在本文中&#xff0c;我们将探讨希尔伯特空间这个非常重要的主题。希尔伯特空间由于其特性而经常出现在物理和工程中。为了理解希尔伯特空间&#xff0c;我们从度量空间的定义开始。 二、基础概念 集合是定义明确的元素的集合…

【MySQL】聚合函数、group by、update、delete

聚合函数、group by、update、delete 前言正式开始update将孙悟空同学的数学成绩变更为 80 分将曹孟德同学的数学成绩变更为 60 分&#xff0c;语文成绩变更为 70 分将总成绩倒数前三的 3 位同学的数学成绩加上 30 分将所有同学的语文成绩更新为原来的 2 倍 delete删除孙悟空同…

【miniQMT实盘量化4】获取实时行情数据

前言 上篇&#xff0c;我们介绍了如何获取历史数据&#xff0c;有了历史数据&#xff0c;我们可以进行分析和回测。但&#xff0c;下一步&#xff0c;我们更需要的是实时数据&#xff0c;只有能有效的监控实时行情数据&#xff0c;才能让我们变成市场上的“千里眼&#xff0c;…

手机照片误删解决方法分享

几个要点 1.检查回收站&#xff1a;一些情况下&#xff0c;我们会在删除文件时将它们移动到回收站中&#xff0c;查看回收站中是否有被删除的照片&#xff0c;这样可以直接恢复文件。 2.使用手机自带的恢复功能&#xff1a;一些手机自带照片恢复功能&#xff0c;可尝试在相册…

Sentinel 热点规则 (ParamFlowRule)

Sentinel 是面向分布式、多语言异构化服务架构的流量治理组件&#xff0c;主要以流量为切入点&#xff0c;从流量路由、流量控制、流量整形、熔断降级、系统自适应过载保护、热点流量防护等多个维度来帮助开发者保障微服务的稳定性。 SpringbootDubboNacos 集成 Sentinel&…