83.【C语言】数据结构之顺序表的尾部插入和删除

目录

3.操作顺序表

2."伪"插入顺序表的元素

分析尾部插入函数SLPushBack

代码示例

SeqList.h

main.c

free(指针)出错的几种可能的原因

3."伪"删除顺序表元素

2.分析尾部删除函数SLPopBack

代码示例

错误检查

两种解决办法

1.判断size是否为负数

2.assert断言size的大小(直接强制终止运行)


承接82.【C语言】数据结构之顺序表的初始化和销毁的3.操作顺序表

3.操作顺序表

2."伪"插入顺序表的元素

四个"伪"插和"伪"删函数

在SeqList.h中再写入:

void SLPushBack(SL* ps,SLDataType x);//尾部插入
void SLPopBack(SL* ps);//尾部删除
void SLPushFront(SL* ps, SLDataType x);//头部插入
void SLPopFront(SL* ps);//头部删除

关于命名的问题:在汇编里,push为入栈(在这里理解为插入),pop为出栈(在这里理解为删除),front为头部,back为尾部

分析尾部插入函数SLPushBack

注意事项

1.每插入一个元素,ps->size++

2.空间不够,需要扩容(realloc)(添加一个判断size和capacity的大小的语句,判断realloc的返回值是否为空指针)

代码示例

SeqList.h

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

typedef int SLDataType;//将int重定义为SLDataType
#define INIT_CAPACITY 4
typedef struct Seqlist
{
	SLDataType* a;//动态顺序表
	int size;//有效数据的个数
	int capacity;//空间的容量
}SL;

void SLInit(SL* ps);//声明初始化顺序表的函数
void SLDestory(SL* ps);//声明销毁顺序表的函数
void SLPushBack(SL* ps, SLDataType x);//尾部插入
void SLPopBack(SL* ps);//尾部删除
void SLPushFront(SL* ps, SLDataType x);//头部插入
void SLPopFront(SL* ps);//头部删除
void SLPrint(SL* ps);//打印结构

main.c

#include "SeqList.h"
//定义测试顺序表的函数
void TestSeqList1()
{
	SL s;
	SLInit(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPrint(&s);
	SLDestory(&s);
}

int main()
{
	TestSeqList1();
	return 0;
}

SeqList.c

#include "SeqList.h"
void SLInit(SL* ps)
{
	ps->a = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);
	if (ps->a == NULL)
	{
		perror("malloc");
		return;//错误返回
	}
	ps->size = 0;
	ps->capacity = INIT_CAPACITY;
}

void SLPushBack(SL* ps, SLDataType x)
{
	if (ps->size == ps->capacity)//size>capacity会越界
	{
		//扩大2倍较为合适
		SLDataType* tmp = (SLDataType*)realloc(ps->a, ps->capacity * 2);
			if (tmp == NULL)
			{
				perror("realloc");
				return;//错误返回
			}
		ps->capacity *= 2;
		ps->a = tmp;//新扩容空间的指针赋值给ps->a
	}
	ps->a[ps->size++] = x;//写入数据
}

void SLPrint(SL* ps)
{
	for (int i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->a[i]);
	}
}

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

a4672af08a254e0d9f7330ae0ff10a1a.png

如果多添加几行则会出问题

	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);
	SLPushBack(&s, 6);

c07d68fe180c4423ae6347ff28ecc5a9.png

free(指针)出错的几种可能的原因

1.没有从头开始释放空间

2.越界访问(下标越界或空间开辟过少)

这里为第2种情况

改为

SLDataType* tmp = (SLDataType*)realloc(ps->a, sizeof(SLDataType)*ps->capacity * 2);

成功运行

b2b113af22164940891749f2dd41da61.png

3."伪"删除顺序表元素

2.分析尾部删除函数SLPopBack

代码示例

头部删除,只需要修改有效个数size的大小即可,不需要修改动态内存的数据

main.c改为

#include "SeqList.h"
//定义测试顺序表的函数
void TestSeqList1()
{
	SL s;
	SLInit(&s);
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);
	SLPushBack(&s, 6);
	SLPushBack(&s, 7);
	SLPrint(&s);
	SLPopBack(&s);
	SLPrint(&s);
	SLPopBack(&s);
	SLPrint(&s);
	SLPopBack(&s);
	SLPrint(&s);
	SLPopBack(&s);
	SLDestory(&s);
}

int main()
{
	TestSeqList1();
	return 0;
}

SeqList.c写入

void SLPopBack(SL* ps)
{
	ps->size--;
}

这样写 ps->a[ps->size--] = 0; 没有必要

错误检查

其实上方的代码写的有问题!

多次调用SLPopBack函数可能使size为负数

两种解决办法

1.判断size是否为负数

void SLPopBack(SL* ps)
{
	if (ps->size == 0)
	{
		return;//错误返回
	}
	ps->size--;
}

2.assert断言size的大小(直接强制终止运行)

void SLPopBack(SL* ps)
{
	assert(ps->size > 0);
	ps->size--;
}

运行结果:

注:有关assert的详细介绍在39.【C语言】指针(重难点)(D)

如果设计头部插入SLPushFront函数和头部删除SLPopFront函数,需要移动其他元素使其向后排,执行效率不高

以下来自《计算机科学导论 第四版》的部分内容

dd5a0391b880435f841cb43266a5e47b.png

c36eee5d4510454a9914e9a0101bed9c.png

c543b52e30594f6ca88a818dc484e4d9.png

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Linux系统】页表的存在位 与 OS的按需加载策略

一、引入 加载程序会将程序代码全部从磁盘中加载进内存吗&#xff1f; 为什么你的电脑的运存只有16GB&#xff0c;但你可以运行上百GB的游戏&#xff0c;如黑神话马喽&#xff1f; 这就涉及到 操作系统的按需加载策略 二、页表的存在位 页表的一个标志位&#xff1a;存在位 …

webpack 老项目升级记录:从 node-sass 限制的的 node v8 提升至支持 ^node v22

老项目简介 技术框架 vue 2.5.17webpack 4.16.5"webpack-cli": "3.1.0""node-sass": "^4.7.2" 几个阶段 第一步&#xff1a;vue2 升级到最新 第一步&#xff1a;升级 vue2 至最新版本&#xff0c;截止到目前&#xff08;2024-10-…

【vim】手动安装 Leader-F

LeaderF 是一个功能强大的 Vim 插件&#xff0c;主要用于快速导航和搜索。它可以帮助用户在 Vim 中高效地查找文件、缓冲区、标签、函数等各种元素&#xff0c;极大地提高了编辑效率。 LeaderF 的安装如果按照仓库中的教程来的话可以很方便的实现安装&#xff0c;这里介绍一下…

面试官:常见的网络攻击手段有哪些?解决方案了解吗?零基础入门到精通,收藏这一篇就够了

引言&#xff1a;由于互联网和信息技术的高速发展&#xff0c;网络安全变得尤为重要&#xff0c;如果不熟悉常见的网络攻击手段&#xff0c;就会造成数据泄漏、信息安全问题、乃至国家安全问题&#xff0c;本文就来介绍下常见的网络攻击手段和一些防范措施。 题目 面试官&…

深入理解值类型和引用类型的存储

目录 内存 存储 1&#xff09;栈区 2&#xff09;堆区 C#的编译过程 1&#xff09;源代码 2&#xff09;公共语言规范(Common Language Specification&#xff0c;CLS) 编译 3&#xff09;通用中间语言(Microsoft Intermediate Language&#xff0c;CIL或MSIL) 4&…

从陌生到信赖,3款AI写作助手教会了我何为真诚的表达

现在信息多得不得了&#xff0c;写作已经不是只有人才能干的事了。人工智能技术发展得特别快&#xff0c;AI写作助手也开始帮我们写东西了。一开始&#xff0c;我对这些AI助手挺好奇的&#xff0c;后来用着用着就越来越信任它们&#xff0c;甚至有点离不开了。我用的那三款AI写…

ONLYOFFICE 文档8.2版本已发布:PDF 协作编辑、改进界面、性能优化等更新

ONLYOFFICE 在线编辑器最新版本已经发布&#xff0c;其中包含30多个新功能和500多个错误修复。阅读本文了解所有更新。 关于 ONLYOFFICE 文档 ONLYOFFICE 是一个开源项目&#xff0c;专注于高级和安全的文档处理。坐拥全球超过 1500 万用户&#xff0c;ONLYOFFICE 是在线办公领…

Python日志记录库——loguru

知识星球&#xff1a;知识星球 | 深度连接铁杆粉丝&#xff0c;运营高品质社群&#xff0c;知识变现的工具知识星球是创作者连接铁杆粉丝&#xff0c;实现知识变现的工具。任何从事创作或艺术的人&#xff0c;例如艺术家、工匠、教师、学术研究、科普等&#xff0c;只要能获得一…

数学建模与优化算法:从基础理论到实际应用

数学建模和优化算法&#xff0c;它们不仅帮助我们理解和描述复杂系统的行为&#xff0c;还能找到系统性能最优化的解决方案。本文将从基础的数学理论出发&#xff0c;逐步深入到各种优化算法&#xff0c;并探讨它们在实际问题中的应用。 思维导图文件可获取&#xff1a;https:…

如何指定 Maven 的 JDK 版本?

maven 路径&#xff1a;/data/maven/ jdk 路径&#xff1a;/data/jdk_1.8 1、修改 mvn 可执行文件并指定 JDK 版本 vim /data/maven/bin/mvn # 在开头新增即可... # zhurs add JAVA_HOME PATH JAVA_HOME/data/jdk_1.8 ...保存退出即可&#xff01; 为什么在此处新增&#x…

C/C++(六)多态

本文将介绍C的另一个基于继承的重要且复杂的机制&#xff0c;多态。 一、多态的概念 多态&#xff0c;就是多种形态&#xff0c;通俗来说就是不同的对象去完成某个行为&#xff0c;会产生不同的状态。 多态严格意义上分为静态多态与动态多态&#xff0c;我们平常说的多态一般…

【博客节选】Unity角色异常抖动问题排查

本文截取自本人文章 &#xff1a;【Unity实战笔记】第二一 基于状态模式的角色控制——以UnityChan为例 发现出现角色抖动问题 尝试解决方法&#xff1a; 跳跃的loop time不要勾选&#xff1b; 相机aim添加垂直阻尼 还是不行&#xff0c;仔细查看是位移时震颤。 UnityCha…

两个mp3音频怎么合成一个?音频合成的多个好用方法教程

两个mp3音频怎么合成一个&#xff1f;在数字音频时代&#xff0c;随着各类音频内容的日益丰富&#xff0c;合并音频文件的需求也愈发突出。无论是为了制作连贯的音乐集&#xff0c;还是为了解决某些场合下音频播放的便利性&#xff0c;将两个或多个MP3音频合并在一起&#xff0…

【C++面试刷题】快排(quick_sort)和堆排(priority_queue)的细节问题

一、快排的快速选择算法两种思路&#xff08;面试会考&#xff09;O(N) 快排的三数取中思路&#xff1a; 重要的是将它三个数进行排序最左为最小&#xff0c;中间为次小&#xff0c;最右为最大的数。&#xff08;错误原因&#xff1a;我刚开始没有将这三个数进行排序&#xff…

Notepad++通过自定义语言实现日志按照不同级别高亮

借助Notepad的自定义语言可以实现日志的按照不同级别的高亮&#xff1b; 参考&#xff1a; https://blog.csdn.net/commshare/article/details/131208656 在此基础上做了一点修改效果如下&#xff1a; xml文件&#xff1a; <NotepadPlus><UserLang name"Ansibl…

洞察数据之美:用可视化探索销售与温度的关系

目录 数据可视化1.气温数据可视化图片展示将最高和最低气温合并绘制折线图&#xff1a;将最高和最低气温合并绘制散点图&#xff1a; 2.销售数据可视化几种常见的销售数据可视化方法及其适用场景&#xff1a;图片展示通过热力图和堆叠柱状图的直观展示&#xff0c;可以得出以下…

CAS简介

#1024程序员节&#xff5c;征文# CAS是什么&#xff1f; CAS&#xff08;Compare And Swap&#xff09;&#xff0c;即比较与交换&#xff0c;是一种乐观锁的实现方式&#xff0c;用于在不使用锁的情况下实现多线程之间的变量同步。 CAS操作包含三个操作数&#xff1a;内存位…

【Nginx】win10 安装Nginx

1.下载 nginx: download 2.安装 解压即可 3.启动 可以自己修改端口&#xff0c;conf/nginx.conf 确保端口不被占用cmd启动&#xff08;不要双击nginx.exe启动&#xff0c;至于原因我粘贴一下&#xff09; start nginx.exe 可以看到是后台运行&#xff0c;还不错 访问&…

易基因:Nat Commun:ATAC-seq等揭示恒河猴大脑高分辨率解剖区域的转录组和开放染色质图谱

大家好&#xff0c;这里是专注表观组学十余年&#xff0c;领跑多组学科研服务的易基因。 恒河猴是神经科学研究中常用的模型动物&#xff0c;其大脑结构和功能与人类大脑相似。大脑中复杂的遗传网络是灵长类动物行为、认知和情感的基础&#xff0c;一直是神经科学的核心。大脑…

全面了解MindSporeLite轻量化推理工具(概念版)

一、参考资料 技术干货&#xff5c;极速、极智、极简的昇思MindSpore Lite&#xff1a;助力华为Watch更加智能 二、相关概念 MCU MCU的全称是Microcontroller Unit&#xff0c;中文可以称为微控制器或者单片机。MCU既可用于汽车电子、工业控制等领域&#xff0c;也可应用于…