考研数据结构线性表看这篇就够了之顺序表(一)

news2024/11/24 20:39:01

目录

一.线性表

1.1 线性表的概念

1.2线性表的种类

1.2.1 静态线性表

1.2.2 线性表的动态存储

 二动态顺序表的操作

2.1. 定义结构体与函数

2.2 初始化 

2.2.1实参和形参的区别

2.2.2 用实参改变形参

题外话 int *p和int* p的区别

2.3 销毁

2.4 尾插 

2.4.1 首先要判满,如果满了要扩容

注意这个方法有一个缺点,就是如果初始空间就是0,插入要扩容的话,0*2=0扩容不了,所以我们有两种解决办法

方法一:在结构体里将capacity和size初始化。都给一点空间

方法二:用三目运算符 

扩容:用realloc

原地扩容:

异地扩容: 

那么realloc可以对psl->a进行扩容吗?:是可以的。

具体实现步骤


一.线性表

1.1 线性表的概念

逻辑地址和物理地址相同的线性结构,一般用数组储存。

1.2线性表的种类

1.2.1 静态线性表

是定长的线性表。在实际中不是很重要,给多了会浪费,给少了会溢出。

//线性表的静态存储
#define N 7
typedef int SLDataType;
typedef struct SeqList{
    SLDataType array[N];
    size_t size;
}SeqList;

 

1.2.2 线性表的动态存储

先开辟一个空间,如果空间不够了在扩容。一般扩容是选择二倍扩容。 

 二动态顺序表的操作

2.1. 定义结构体与函数

在头文件里定义结构体

#pragma once
 typedf int SLDataType;  //定义一个数据类型
 
 typedf struct SeqList{

    SLDataType* a;
    int size;            //有效数据
    int capacity;       //空间容量
}SL;
void SLInit(SL* psl);
void SLDestory(SL* psl);

 

函数声明在头文件.h,定义函数在.c文件 

2.2 初始化 

2.2.1实参和形参的区别

形参是实参的拷贝,所以形参的改变是不会改变实参的值

我们初始化的目的是想通过形参改变实参

2.2.2 用实参改变形参

如果想让形参改变实参,所以我们应该用指针变量来指向地址 

题外话 int *p和int* p的区别

int *p:的意思是解引用操作符,通过地址找到地址所指的对象

如 *p=20;是通过p所指的地址,取改变他的值

int *p = &20; 这里指的是p指针指向20这个元素的地址

int* p;是说明 p是一个指针变量 

SeqList.c是用来实现函数,测试类Test.c是用一个例子去执行函数

测试类

2.3 销毁

void SLDestory(SL* psl) {
	if (psl->a != NULL) {
		free(psl->a);
		psl->a = 0;
		psl->size = 0;
		psl->capacity = 0;
	}
}

2.4 尾插 

2.4.1 首先要判满,如果满了要扩容

那么什么时候为满呢🤨结论是当size和capacity相等的时候为满

if(psl->size==psl->capacity)
注意这个方法有一个缺点,就是如果初始空间就是0,插入要扩容的话,0*2=0扩容不了,所以我们有两种解决办法

int newCapacity = psl->capacity*2

方法一:在结构体里将capacity和size初始化。都给一点空间
 typedf struct SeqList{

    SLDataType* a;
    int size = 4;            //有效数据
    int capacity = 8;       //空间容量
}SL;
方法二:用三目运算符 

int newcapacity = psl->capacity==0?4 : capacity*2  //如果capacity为0将空间设置为4,不为0扩2倍。

扩容:用realloc
原地扩容:

如果后面的空间没有被占用,就可以原地扩容

异地扩容: 

如果后面的空间被占用,那么就选择异地扩容。

注意😱,当你选择异地扩容时,系统会自动free掉源空间,不需要我们手动free。

 易错点:为什么要用tmp不接收的原因是:怕万一扩容失败但是用原指针会导致赔了夫人又折兵,原地址也被覆盖。所以用tmp接收,在赋值给psl->。

 当psl->a=0,capacity=0时,会现将capacity赋值为4,但是psl->任为0。

那么realloc可以对psl->a进行扩容吗?:是可以的。

具体实现步骤

第一步:先编写头文件 

头文件的用处是定义结构体和声明函数,函数的形参可以访问结构体成员,形参为指针可以改变实参的值。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
typedef int SLDataType;   //定义数据类型SLDataType来代替int,当要修改数据类型时只用修改int计即可
typedef struct SeqList {
	SLDataType* a;
	int size;
	int capacity;
}SL;            //结构体别名

void SLInit(SL* psl);        //定义函数名,定义psl指针,可用psl形参来访问结构体成员。
void SLDestory(SL* psl);
void SLPrint(SL* psl);
void SLPushBack(SL* psl, SLDataType x);

第二步,编写.c文件

.c文件的作用时:将头文件定义函数,具体实现出来。 

尾插法是用psl->a[a->size] =x插入数据

先判满,若capacity=0,则赋初值,不为0,则扩两倍

扩容,用realloc扩容(结构体类型*)realloc(数组的地址,sizeof(结构体类型)* 新容量)

定义一个新SLDataType结构体类型变量tmp接收新空间的地址,的原因是防止扩充失败,导致原地址丢失。

#define _CRT_SECURE_NO_WARNINGS
#include"SeqList.h"

void SLInit(SL* psl) {
	psl->a = NULL;
	psl->size = 0;
	psl->capacity = 0;
}
void SLDestory(SL* psl) {
	if (psl->a != NULL) {
		free(psl->a);
		psl->a = 0;
		psl->size = 0;
		psl->capacity = 0;
	}
}
void SLPushBack(SL* psl,SLDataType x){
	if (psl->size == psl->capacity) { //当空间满了,即数据个数等于容量
		int newcapacity = psl->capacity == 0 ? 4 : psl->capacity * 2;//当容量为0的时候扩容也为0,所以当capacity==0时给他赋初值4个空间,不为0扩容两倍
		SLDataType* tmp = (SLDataType*)realloc(psl->a, sizeof(SLDataType) * newcapacity);
		if (tmp == NULL) {		//如果扩容失败返回realloc fail
			perror("realloc fail");
			return 0;
		}
		psl->a = tmp; //用tmp接收的原因是,如果ralloc开辟失败,用psl->a接收会导致原始地址丢失
		psl->capacity = newcapacity;
	}
	psl->a[psl->size] = x;
	psl->size++;
}
void SLPrint(SL* psl) {
	for (int i = 0; i < psl->size; i++) {
		printf("%d ", psl->a[i]);
	}
	printf("\n");
}

第三步编写测试类Test

测试类的作用是,对函数的实现,进行数据测试。

用结构题别名SL定义sl类的作用是,SL只是一个框架,sl是具体的类,用来测试。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include"SeqList.h"


void TestL1() {
	SL sl;			//SL是结构体名,sl是创建一个类,用来测试
	SLInit(&sl);
	SLPushBack(&sl, 1);		//插入数据
	SLPushBack(&sl, 2);
	SLPushBack(&sl, 3);
	SLPushBack(&sl, 4);
	SLPushBack(&sl, 5);
	SLPushBack(&sl, 6);
	SLPushBack(&sl, 7);
	SLPushBack(&sl, 8);
	SLPushBack(&sl, 9);
	SLPrint(&sl);
}
int main() {
	TestL1();
}

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

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

相关文章

继承、菱形继承与虚拟继承

继承、菱形继承与虚拟继承 一、概念二、定义格式三、继承方式四、派生类继承基类成员访问方式的变化五、基类和派生类对象赋值转换1、概念2、示意图3、示例代码4、特点 六、继承中的作用域1、概念2、示例代码3、运行结果 七、派生类的默认成员函数1、调用方法2、示例代码3、运行…

【LeetCode刷题-排序】--147.对链表进行插入排序

147.对链表进行插入排序 /*** Definition for singly-linked list.* public class ListNode {* int val;* ListNode next;* ListNode() {}* ListNode(int val) { this.val val; }* ListNode(int val, ListNode next) { this.val val; this.next next; }…

必须收藏:IPv6核心知识梳理!!(原理+基础配置)

一、概述 由于NAT技术的应用&#xff0c;缓解了IPv4地址不足产生的问题&#xff0c;但是部署IPv6是解决IPv4地址不足的最终方案。当前世界上不同地区对部署IPv6的需求强烈程度不一&#xff0c;且当前IPv4网络仍然占主流地位&#xff0c;因此短时间内IPv6和IPv4将会共存。 IPv4网…

深入理解网络IO复用并发模型

本文主要介绍服务端对于网络并发模型以及Linux系统下常见的网络IO复用并发模型。文章内容一共分为两个部分。 第一部分主要介绍网络并发中的一些基本概念以及我们Linux下常见的原生IO复用系统调用&#xff08;epoll/select&#xff09;等。第二部分主要介绍并发场景下常见的网…

opencv dnn模块 示例(21) 目标检测 object_detection 之 yolov6

文章目录 1、YOLOv6介绍1.1、概述1.2、关键技术1.2.0、网络结构1.2.1、表征能力更强的 RepBi-PAN Neck 网络1.2.2、全新的锚点辅助训练&#xff08;Anchor-Aided Training&#xff09;策略1.2.3、无痛涨点的 DLD 解耦定位蒸馏策略 1.3、总结 2、测试2.1、官方项目测试2.2、open…

View绘制流程

在子线程中不能更新UI的前提是不触发 checkThread ,逐步委托给mParent检查线程 onCreate加载contentView 进行draw onStart onResume 可能也没有完成测量流程 setContentView: public abstract void setContentView(LayoutRes int resId); Activity 是由ActivityThread类中…

Linux友人帐之网络编程基础DNS服务器

一、DNS服务器 1.1概述 DNS&#xff08;Domain Name System&#xff09;是一种分布式系统&#xff0c;用于将域名映射到IP地址。它是互联网上的基础设施之一&#xff0c;作为一种网络协议&#xff0c;它将域名转换为对应的IP地址。DNS的主要功能是将易于记忆的域名转换为计算机…

Brave Game(博弈论巴什博弈)

Problem - 1846 #include<bits/stdc.h> using namespace std; int t,n,m; signed main(){scanf("%d",&t);while(t--){scanf("%d%d",&n,&m);if(n%(m1)0) puts("second");else puts("first");}return 0; }

【带头学C++】----- 三、指针章 ---- 3.7 数组指针

3.7 数组指针 1.数组指针的概述 数组指针是一个指向数组的指针变量&#xff0c;是用来保存数组元素的地址。在C/C中&#xff0c;数组名代表了数组的首地址&#xff0c;可以被解释为一个指向数组第一个元素的指针。因此&#xff0c;一个指向数组的指针可以通过数组名来获…

安达发|APS智能优化排产软件的优先级应用

在制造业中&#xff0c;订单排产是一个重要的环节&#xff0c;它直接影响到生产效率、交货期和客户满意度。为了提高订单排产的效率和准确性&#xff0c;许多企业开始采用APS&#xff08;高级计划与排产&#xff09;智能优化排产软件。APS软件可以根据企业的生产资源、订单需求…

人大女王大学金融硕士项目——披星戴月走过的路,一定可以繁花满地

道路是曲折的&#xff0c;前途是光明的&#xff0c;在路上多花点时间到达才更有意义&#xff0c;作为身经百炼的职场人士&#xff0c;也难免遇到瓶颈期。这个时候&#xff0c;如果不改变自己&#xff0c;就很容易陷入焦虑。而在职读研便是一个很好的方式&#xff0c;一遍学习&a…

未来架构:无服务器计算和容器的融合

文章目录 无服务器计算&#xff1a;构建和扩展应用的新方式优势&#xff1a;示例代码&#xff1a; 容器技术&#xff1a;实现跨环境一致性优势&#xff1a;示例代码&#xff1a; 无服务器与容器的融合优势&#xff1a;示例代码&#xff1a; 未来架构的挑战和展望结论 &#x1f…

全球250米年度城区范围产品数据

简介 全球250米年度城区范围产品&#xff08;MGUP&#xff09;基于现有的城区产品CCI-LC、MCD12Q1和GlobeCover产品经样本清洗自动化得到可靠的多时序城区样本。前言 – 人工智能教程 将全球划分为5格网使用随机森林分类器对2001-2018年进行全球城区范围制图。经时空后处理后&…

记一次,kettle执行JOB的一个BUG,linux下环境表输入(查询)卡住问题,windows环境下执行正常。

问题 采集数据&#xff0c;linux下执行JOB时。 发现表输入卡在&#xff0c;查询卡住&#xff0c;如图&#xff0c;11:37:19、11:37:42、 11:42:56 分别在40000、60000行的时候卡住&#xff0c;23s、5分14s。 拿出sql到pl/sql上查询&#xff0c;并查看执行计划&#xff0c;均…

盘点10月Sui生态发展,了解Sui的近期成长历程!

10月是Web3的Uptober&#xff0c;整个行业在经历了深度的低潮期后迎来了一些回暖。Sui也紧跟行业脚步&#xff0c;举办了各类生态活动&#xff0c;包括Quset 3游戏主题的奖励活动、DeFi和zklogin专题Workshop & AMA、多平台发布的线上教育内容以及持续的科普文章输出。此外…

SPSS二项分布检验

前言&#xff1a; 本专栏参考教材为《SPSS22.0从入门到精通》&#xff0c;由于软件版本原因&#xff0c;部分内容有所改变&#xff0c;为适应软件版本的变化&#xff0c;特此创作此专栏便于大家学习。本专栏使用软件为&#xff1a;SPSS25.0 本专栏所有的数据文件请点击此链接下…

多测师肖sir___app测试_001

app测试 一、app测试分为两大类 app手工测试&#xff08;讲&#xff09; app自动化测试&#xff08;讲&#xff09; &#xff08;1&#xff09;手工app测试&#xff1f; 就是通过手点击app上的应用&#xff0c;cs架构上 &#xff08;2&#xff09;app自动化测试&#xff1f; 通…

*LEEDCODE 73矩阵置零

![在这里插入代码片](https://img-blog.csdnimg.cn/ab1d7d4b9d5046d8900de430249be3bf.png)1 0 0 替换两个列表 2 记录时 0 0 已经是半改好的状态

整理10个地推拉新app接单平台,免费一手推广渠道平台干货分享

1. 聚量推客&#xff1a; “聚量推客”汇聚了众多市场上有的和没有的地推网推拉新接单项目&#xff0c;目前比较火热&#xff0c;我们做地推和网推从业者如果长期在这行业去做推广可以使用这个平台&#xff0c;价格高数据也好&#xff0c;大部分拉新项目也都是官签一手资源 一…

nodejs express uniapp 图书借阅管理系统源码

开发环境及工具&#xff1a; nodejs&#xff0c;mysql5.7&#xff0c;HBuilder X&#xff0c;vscode&#xff08;webstorm&#xff09; 技术说明&#xff1a; nodejs express vue elementui uniapp 功能介绍&#xff1a; 用户端&#xff1a; 登录注册 首页显示轮播图&am…