顺序表之线性表(难度:✨)

news2024/9/28 17:29:30

1.线性表

线性表呈现出一条线性,用指针把一块一块的内存连接起来。
其余还有树型结构,哈希结构,图结构。
线性表分为:

  • 顺序表
  • 链表
  • 队列
  • 字符串

1.2顺序表

顺序表就是数组,但在数组的基础上,从头开始存。还要求数据连续存储,不能跳跃间隔。
本质:数组(分为静态和动态)
(顺序表要求连续存储,数据挨着存)

写相对正式的代码要规范。
宏或条件编译,防止头文件被重复包含。
不仅仅有数组,还要用size标识有多少数组
凡是多个数组,都用结构体
完善:

  1. 对顺序表初始化一下
  2. 尾插,头插
    .h放声明
    .cpp放定义
//建立一个头文件SeqList.h,用静态顺序表实现
#pragma once
#define N 1000
//宏的好处让静态的数据表随时转换
//静态顺序表结构
typedef int SLDataType;//想存什么类型就改中间的字母
//想让顺序表存储管理别的东西
//为了一个地方改其他地方都改,定义一个typedef
typedef struct SeqList//结构体typedef
{
	SLDataDype a[N];
	//最简单的应该有个数组(定义成静态)
	//不推荐在这里直接写数字,因为换大小不好换
	int size;
	//表示数组中存储了多少个有效数据,从头连续存储

}SL;//简写
//向顺序表中插入数据
//对顺序表初始化
//接口函数,给别人用的,对接。--命名风格跟STL走,方便后续学习STL
void SeqListInit( SL* ps);
//尾插数据
void SeqListPushBack( SL* ps, SLDataType x);//用SLDataType做这个地方的类型
//结构体SeqList太长,可typedef一下,变成SL
//尾删
void SeqListPopBack( SL* ps);
//头插
void SeqListPushFront( SL* ps, SLDataType x);
//头删
void SeqListPopFront( SL* ps);

静态顺序表

  1. 特点:满了不让插入
  2. 缺点:给多大的空间很难确定n给小不够用,n给大了浪费。

动态顺序表

#pragma once
typedef int SLDataType;
typedef struct SeqList
{
	SLDataType* a;//定义成指针
	int size;
	//表示数组中存储了多少个有效数据,从头连续存储
	//提供动态开辟内存的方式malloc,在堆上可以动态开辟内存,不用了可以释放。
	//最后不够了把原来的空间释放,开更大的一块空间。叫做扩容。
	//现在的结构不足以方便地表示动态顺序表。有一个指针,指向动态开辟的空间。
	//增加capacity即容量。表示数组实际能存的空间容量多大。多少个数据
	int capacity;
	}SL;

SeqList.c

#include "SeqList.h"
#include <stdio.h>
#include <stdlib.h>
//初始化
void SeqListInit(SL ps)
{
	//应该用.因为a是成员
	ps.a = NULL;
	ps.size = ps.capacity = 0;
	//最开始对顺序表的初始化
}
//尾插数据
void SeqListPushBack(SL* ps, SLDataType x);//用SLDataType做这个地方的类型
//结构体SeqList太长,可typedef一下,变成SL
//尾删
void SeqListPopBack(SL* ps);
//头插
void SeqListPushFront(SL* ps, SLDataType x);
//头删
void SeqListPopFront(SL* ps);

Test.c

#include "SeqList.h"
//调用函数
void TestSeqList1()
{
	SL sl;
//sl未初始化
	SeqListInit(sl);//对结构体进行初始化
}
int main()
{
	TestSeqList1();
	return 0;
}

错误的!!!
sl:实参
ps:形参
实参传给形参。ps形参改变不影响实参
用实参的地址,应该传指针
修改:
void SeqListInit(SL* ps);
ps->a = NULL;
ps->size = ps->capacity = 0;
SeqListInit(&sl);

尾插数据


void SeqListPushBack(SL* ps, SLDataType x)//用SLDataType做这个地方的类型
{
	//整个顺序表没有空间
	//刚进来只对其进行初始化没有空间
	//如果没有空间或空间不足就扩容
	if (ps->size == ps->capacity)
		//第二种情况:capacity空间满了,扩容realloc,对已有的空间扩容
	{
		int newcapacity = ps->capacity == 0 ? 4 : ps->capacity;
		//如果=0给四。不是零增2倍
		SLDataType* tmp = (SLDataType*)realloc(ps->a, newcapacity * sizeof(SLDataType));//不应给数据个数,应给字节个数
			if (tmp == NULL)
			{
				printf("realloc fail\n");
				exit(-1);
		    }
		ps->a = tmp;
		ps->capacity = newcapacity;

	
	}
	ps->a[ps->size] = x;
	ps->size++;//空间足够
}

return -1:不可以,没有终止掉程序
exit(-1):结束掉程序,异常退出返回-1,正常返回0
动态顺序表:
//顺序表的动态存储

typedef struct SeqList
{
SLDataType* array;//指向动态开辟的数组
size_t size;//有效数据个数
size_t capacity;//容量空间的大小
}SeqList;

调试按Fn+F11
在这里插入图片描述
在这里插入图片描述

SeqList.c

void SeqListPrint(SL* ps)//把顺序表中的打印
{
	for (int i = 0; i < ps->size; ++i)
	{
		printf("%d ", ps->a[i]);
	}
	printf("\n");
}

Test.c

SeqListPrint(&sl);

在这里插入图片描述

插入数据不用以后空间需要销毁。

//销毁顺序表
void SeqListDestory(SL* ps);
//销毁顺序表
void SeqListDestory(SL* ps);
{
	free(ps->a);
	ps->a = NULL;
	ps->capacity = ps->size = 0;
}
//把空间还给系统
 SeqListDestory(&SL);

继续写尾删,想把尾上的数据删除

typedef struct SeqList
{
 SLDataType* a;
 int size;//插入了两个数据
 int capacity;//可以存几个数据
 }SL;

把尾上的数置成零,再把size–

void SeqListPopBack(SL* ps)
{
	//ps->a[ps->size - 1] = 0;//把数置成0
	ps->size--;//原来是2,后来减到1.
}

size标识存了制了多少有效数据

SeqListPopBack(&sl);
	SeqListPopBack(&sl);
	//删除两个数据后再打印
	SeqListPrint(&sl);

在这里插入图片描述
为防止删除的数据多于原本的数据个数
需加前提条件

void SeqListPopBack(SL* ps)
{
	if (ps->size > 0)
	{
		ps->a[ps->size - 1] = 0;
		ps->size--;//原来是2,后来减到1

	}
}

在这里插入图片描述
粗暴的方式

#include <assert.h>//断言
void SeqListPopBack(SL* ps)
{
	assert(ps->size > 0);
	ps->size--;
}

在这里插入图片描述
在64行断言失败。

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

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

相关文章

地下车库CO传感器报警系统

前言 在现代城市中&#xff0c;地下车库已经成为了不可或缺的交通设施。然而&#xff0c;在地下车库中&#xff0c;由于车辆尾气等因素&#xff0c;很容易出现CO中毒的风险&#xff0c;给车库内的人员带来威胁。本文将对地下车库CO传感器报警系统进行介绍和分析&#xff0c;包…

21级计科专业计算机组成原理实验考试(体验)

在使用VC6.0软件时&#xff0c;为了进入调试模式&#xff0c;需要先点击【Build】&#xff0c;再点击&#xff08; &#xff09; A. BuildExecute B. Go C. Execute D. Compile 在使用VC6.0软件进入调试模式后&#xff0c;点击【View】→【Debug Windows】后的&#xff08; &…

Shell脚本常见用法列举

前言 最近在复习shell脚本的相关知识&#xff0c;本文列举了一些在shell脚本中用得到的一些基础语法。 1&#xff1a;打印常见内部变量和环境变量值 shell中常用变量介绍 $0脚本名$n第n个参数&#xff0c;n1,2,3...$*所有参数列表&#xff08;视为一个整体&#xff0c;不包…

chatgpt赋能Python-python3人脸识别

人脸识别的python3应用&#xff1a;一步步实现高精度的面部识别 Python3作为一种高效的编程语言&#xff0c;具有广泛的应用场景。近年来&#xff0c;人脸识别技术在安防、金融、医疗等领域中逐渐普及&#xff0c;运用Python3进行人脸识别具有巨大的潜力。本文将介绍如何使用P…

React学习笔记四-state

此文章是本人在学习React的时候&#xff0c;写下的学习笔记&#xff0c;在此纪录和分享。此为第四篇&#xff0c;主要介绍react中的state。 1.state&#xff08;状态&#xff09; 1.1state简介 存在state(状态)的组件称为复杂组件&#xff0c;反之称为简单组件。 何为状态呢…

TCL表达式

目录 操作数 运算符和优先级 数学函数 操作数 TCL 表达式的操作数通常是整数或实数。整数一般是十进制的&#xff0c; 但如果整数的第一个字符是 0(zero)&#xff0c;那么 TCL 将把这个整数看作八进制的&#xff0c;如果前两个字符是 0x 则这个整数被看作是十 六进制的。TC…

I2C项目问题总结

1、项目里面用到哪些接口&#xff1f;都是怎么用的&#xff1f; 项目里面用到了rkv_i2c_if、lvc_i2c_if、lvc_apb_if。rkv_i2c_if用来将DUT内部的intr中断信号、debug信号、ic_en使能信号、i2c和apb的时钟复位信号引出&#xff0c;在接口中声明了一个大位宽信号用来表示intr中…

分布式消息中间件RocketMQ的工作原理

RocketMQ 工作原理 消息的生产 消息的生产过程 ​ Producer可以将消息写入到某Broker中的某Queue中&#xff0c;其经历了如下过程&#xff1a; Producer发送消息之前&#xff0c;会先向NameServer发出获取消息Topic的路由信息的请求NameServer返回该Topic的路由表及Broker列…

kubernetes yaml文件|--dry-run导出yaml文件

kubernetes yaml文件|--dry-run导出yaml文件 YAML 语法格式&#xff1a;二 查看 api 资源版本标签三 写一个nignx.yaml文件demo四、编写service服务的资源清单详解k8s中的port五 用–dry-run命令生成yaml资源清单六 将现有的资源生成模板导出写yaml太累怎么办&#xff1f; YAML…

关于FLAME和SMPL模型

英文参考文献&#xff1a;https://medium.com/offnote-labs/3d-face-and-body-reconstruction-95f59ada1040 一个训练好的FLAME模型的输入是一个参数向量&#xff0c;包括形状参数、姿势参数和表情参数。这些参数分别控制人脸的身份特征、头部的旋转和平移、面部的表情变化。一…

算法设计与分析:线性规划问题和单纯形算法(作业-必做)(头歌实验)

第1关&#xff1a;单纯性算法解一般线性方程组 任务描述 本关任务&#xff1a;编写一个利用两阶段单纯性算法求一般线性规划的程序。 相关知识 单纯形算法的第1步&#xff1a;选出使目标函数增加的非基本变量作为入基变量。 查看单纯形表的第 1 行&#xff08;也称之为z行…

UnityVR--Managers--对象池1

本篇中使用的API&#xff1a;gameObject.CompareTag("标签")、UnityEvent()事件管理、ObjectPool<GameObject>&#xff08;&#xff09;对象池 参照unity官方教程&#xff1a;Hi ObjectPool 目录 1. 应用场景 2. 对象池的原理 3. 查看资源消耗情况 4. 不使用…

mysql 备库延迟问题

备库延迟原因&#xff1a; log传送开销小&#xff0c;消费relay log 超时 备库性能不如主库 备库承担更多SQL分析 主库是多线程执行&#xff0c;备库是单线程执行解析relay log 处理方法&#xff1a; 主备使用相同的机器 备库关闭log实时落盘 增加从库数量&#xff0c;…

Sentinel-2数据下载及处理

数据下载网站&#xff1a;欧空局官网&#xff08;需注册并登录&#xff09; https://scihub.copernicus.eu/dhus/#/home 哨兵2 L1C数据波段信息 哨兵2 L1C数据时间&#xff1a;2015-06-23至now 由于数据量大&#xff0c;考虑服务器压力&#xff0c;哨兵2号数据直接下载的时间跨…

[web安全原理分析]-XXE漏洞入门

前言 XXE漏洞 XXE漏洞全称(XML External Entity Injection)即xml外部实体注入漏洞&#xff0c;XXE漏洞发生在应用程序解析XML输入时&#xff0c;没有禁止外部实体的加载&#xff0c;导致可加载恶意外部文件&#xff0c;造成文件读取、命令执行、内网端口扫描、攻击内网网站、…

头歌计算机组成原理实验—运算器设计(10) 第10关:补码一位乘法器设计

第10关&#xff1a;补码一位乘法器设计 实验目的 学生掌握补码一位乘法运算的基本原理&#xff0c;熟练掌握 Logisim 寄存器电路的使用&#xff0c;能在 Logisim 平台中设计实现一个8*8 位的补码 Booth一位乘法器。 视频讲解 ####实验内容 在 alu.circ 文件中的补码一位乘法…

Linux基础——权限

1. Linux下的用户 在 Linux 操作系统中&#xff0c;有两种主要类型的用户账户&#xff0c;分别是普通用户账户和超级用户账户&#xff08;也称为 root 用户账户&#xff09;。 普通用户账户&#xff08;user&#xff09;是在 Linux 系统上创建的普通账户&#xff0c;可以用于日…

图片隐写(一)

文件隐藏 binwalk binwalk -e filename foremost foremost filename steghide & stegseek Install sudo apt-get install steghidestegseek Use steghide extract -sf filename -p passwordtime stegseek secret.file aaa.txt dd 文本隐藏 二进制文件末尾 or 文…

ffmpeg rtsp解析

一、 rtsp 协议说明 rtsp的协议层级 rtsp 属于应用层&#xff0c; 使用tcp传输&#xff0c;主要是传递服务器的一些信息&#xff0c;实现流连接。播放 暂停 销毁等控制 rtp 实现音视频数据包的发送&#xff0c;通过RTSP等协议的SDP信息协商好了RTP数据包的发送目的和传输方式…

UNIX网络编程卷一 学习笔记 第十四章 高级I/O函数

有3种方式可在涉及套接字的IO操作上设置超时方法&#xff1a; 1.调用alarm&#xff0c;它在指定超时期满时产生SIGALRM信号。此方法涉及信号处理&#xff0c;而信号处理在不同的实现上存在差异&#xff0c;且此方法可能干扰进程中已经执行过的alarm调用&#xff0c;可能使之前已…