C语言动态顺序表结构的创建、初始化结构、尾插、尾删、头插、头删、指定位置插入、指定位置删除、找指定数值下标等的介绍

news2024/9/21 10:54:37

文章目录

  • 前言
  • 一、 结构创建
  • 二、 初始化结构
  • 三、 打印动态顺序表
  • 四、 销毁动态顺序表
  • 五、 尾插
  • 六、尾删
  • 七、 头插
  • 八、 头删
  • 九、指定位置插入
  • 十、指定位置删除
  • 十一、找指定数值下标
  • 总结

前言

C语言动态顺序表结构的创建、初始化结构、尾插、尾删、头插、头删、指定位置插入、指定位置删除、找指定数值下标等的介绍


一、 结构创建

结构的创建

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

#define INIT_CAPACITY 4


// 动态顺序表
typedef int SLDataType;

typedef struct SeqList
{
	SLDataType* arr;
	int size; // 有效数据的个数
	int capacity; // 动态空间的容量
}SL;

  • 创建动态顺序表,将int类型重命名为SLDataList。方便其他数据类型顺序表的创建。
  • 同时定义动态顺序表的初始容量 INIT_CAPACITY

二、 初始化结构

初始化结构定义

// 初始化动态顺序表
void SLInit(SL* ps)
{
	SLDataType* tmp = (SLDataType*)malloc(sizeof(SLDataType) * INIT_CAPACITY);
	if (tmp == NULL)
	{
		perror("SLInit()::malloc()");
		return;
	}

	ps->arr = tmp;

	ps->size = 0;
	ps->capacity = INIT_CAPACITY;
}
  • 动态开辟初始容量(INIT_CAPACITY)的空间。
  • 有效数据size置为0。
  • 容量置为初始容量。

三、 打印动态顺序表

打印动态顺序表定义

// 打印动态顺序表
void SLPrint(SL* ps)
{
	assert(ps);

	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		printf("%d ", ps->arr[i]);
	}
	printf("\n");
}

四、 销毁动态顺序表

销毁动态顺序表定义

// 销毁动态顺序表
void SLDestroy(SL* ps)
{
	free(ps->arr);
	ps->arr = NULL;

	ps->size = 0;
	ps->capacity = 0;
}
  • 释放ps->arr指向的空间,并将其置为空指针。
  • 将有效数据和空间置为0。

销毁动态顺序表测试

void SLTest01()
{
	SL s = { 0 };
	// 初始化动态顺序表
	SLInit(&s);
	
	// 销毁动态顺序表
	SLDestroy(&s);
	
}

效果如下:
在这里插入图片描述

五、 尾插

尾差函数定义

// 尾插
void SLPushBack(SL* ps, SLDataType x)
{
	assert(ps);

	if (ps->capacity == ps->size)
	{
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, (ps->capacity * 2)* sizeof(SLDataType) );
		if (NULL == tmp)
		{
			perror("SLPushBack()::realloc()");
			return;
		}
		ps->arr = tmp;
		tmp = NULL;
		ps->capacity *= 2;
	}

	ps->arr[ps->size] = x;
	ps->size++;
}

操作结构测试

void SLTest01()
{
	SL s = { 0 };
	// 初始化动态顺序表
	SLInit(&s);


	// 尾插
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);
	SLPushBack(&s, 6);
	SLPushBack(&s, 7);
	SLPushBack(&s, 8);
	SLPushBack(&s, 9);
	SLPrint(&s);
	
	// 销毁动态顺序表
	SLDestroy(&s);
	
}

效果如下:
在这里插入图片描述

六、尾删

尾删函数定义

//尾删
void SLPopBack(SL* ps)
{
	assert(ps->size > 0);

	ps->size--;
}

尾删函数测试

void SLTest01()
{
	SL s = { 0 };
	// 初始化动态顺序表
	SLInit(&s);


	// 尾插
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);
	SLPushBack(&s, 6);
	SLPushBack(&s, 7);
	SLPushBack(&s, 8);
	SLPushBack(&s, 9);
	SLPrint(&s);

	// 尾删
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	SLPopBack(&s);
	//SLPopBack(&s);
	SLPrint(&s);
	
	// 销毁动态顺序表
	SLDestroy(&s);
	
}

效果如下:
在这里插入图片描述

七、 头插

头插函数定义

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

	if (ps->capacity == ps->size)
	{
		SLDataType* tmp = (SLDataType*)realloc(ps->arr, (ps->capacity * 2) * sizeof(SLDataType));
		if (NULL == tmp)
		{
			perror("SLPushBack()::realloc()");
			return;
		}
		ps->arr = tmp;
		tmp = NULL;
		ps->capacity *= 2;
	}

	int i = 0;
	for (i = ps->size; i > 0; i--)
	{
		ps->arr[i] = ps->arr[i - 1]; // arr[1] = arr[0]
	}

	ps->arr[0] = x;
	ps->size++;
}

头插函数测试

void SLTest02()
{
	SL s = { 0 };
	// 初始化动态顺序表
	SLInit(&s);

	// 头插
	SLPushFront(&s, 1);
	SLPushFront(&s, 2);
	SLPushFront(&s, 3);
	SLPushFront(&s, 4);
	SLPushFront(&s, 5);
	SLPushFront(&s, 6);
	SLPushFront(&s, 7);
	SLPushFront(&s, 8);
	SLPushFront(&s, 9);
	SLPrint(&s);

	// 销毁动态顺序表
	SLDestroy(&s);

}

效果如下:
在这里插入图片描述

八、 头删

头删定义

// 头删
void SLPopFront(SL* ps)
{
	assert(ps->size > 0);

	int i = 0;
	for (i = 0; i < ps->size - 1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];// arr[size- 2] = arr[size-1]
	}

	ps->size--;
}

头插函数测试

void SLTest02()
{
	SL s = { 0 };
	// 初始化动态顺序表
	SLInit(&s);

	// 头插
	SLPushFront(&s, 1);
	SLPushFront(&s, 2);
	SLPushFront(&s, 3);
	SLPushFront(&s, 4);
	SLPushFront(&s, 5);
	SLPushFront(&s, 6);
	SLPushFront(&s, 7);
	SLPushFront(&s, 8);
	SLPushFront(&s, 9);
	SLPrint(&s);


	// 头删
	SLPopFront(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	SLPopFront(&s);
	//SLPopFront(&s);

	SLPrint(&s);

	// 销毁动态顺序表
	SLDestroy(&s);

}

效果如下:
在这里插入图片描述

九、指定位置插入

指定位置插入函数定义

// 指定位置插入
void SLInsert(SL* ps, int pos, SLDataType x)
{
	assert(ps);
	assert(pos >= 0 && pos <= ps->size);


	SLCheckCapacity(ps);

	int i = 0;
	for (i = ps->size; i > pos; i--)
	{
		ps->arr[i] = ps->arr[i - 1];
	}
	ps->arr[pos] = x;
	ps->size++;

}

指定位置插入函数测试

void SLTest03()
{
	SL s = { 0 };
	// 初始化动态顺序表
	SLInit(&s);

	// 先进行尾插
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);

	// 指定位置插入
	SLInsert(&s, 3, 66);
	SLPrint(&s);

	SLInsert(&s, 5, 100);
	SLPrint(&s);

	// 销毁动态顺序表
	SLDestroy(&s);
}

效果如下:
在这里插入图片描述

十、指定位置删除

指定位置删除函数定义

// 指定位置删除
void SLErase(SL* ps, int pos)
{
	assert(ps);
	assert(pos >= 0 && pos < ps->size);
	int i = 0;

	for (i = pos; i < ps->size-1; i++)
	{
		ps->arr[i] = ps->arr[i + 1];
	}
	ps->size--;
}

指定位置删除函数测试

void SLTest03()
{
	SL s = { 0 };
	// 初始化动态顺序表
	SLInit(&s);

	// 先进行尾插
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);
	SLPrint(&s);

	// 指定位置删除
	SLErase(&s, 3);
	SLPrint(&s);

	SLErase(&s, 2);
	SLPrint(&s);


	// 销毁动态顺序表
	SLDestroy(&s);
}

效果如下:

在这里插入图片描述

十一、找指定数值下标

找指定数值下标函数定义

// 找指定数值下标
int SLFind(SL* ps, SLDataType x)
{
	assert(ps);
	int i = 0;
	for (i = 0; i < ps->size; i++)
	{
		if (ps->arr[i] == x)
		{
			return i;
		}
	}
	return -1;
}

找指定数值下标函数测试

void SLTest03()
{
	SL s = { 0 };
	// 初始化动态顺序表
	SLInit(&s);

	// 先进行尾插
	SLPushBack(&s, 1);
	SLPushBack(&s, 2);
	SLPushBack(&s, 3);
	SLPushBack(&s, 4);
	SLPushBack(&s, 5);
	SLPrint(&s);


	 //找指定数值下标
	int find = SLFind(&s, 3);
	if (find != -1)
	{
		printf("找到了, 下标为:%d\n", find);
	}
	else
	{
		printf("没找到!!!\n");
	}

	// 销毁动态顺序表
	SLDestroy(&s);
}

效果如下:
在这里插入图片描述


总结

C语言动态顺序表结构的创建、初始化结构、尾插、尾删、头插、头删、指定位置插入、指定位置删除、找指定数值下标等的介绍

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

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

相关文章

Java 实验12 线程同步与通信

&#xff08;一&#xff09;实验目的 1、掌握JAVA中多线程的实现方法&#xff1b; 2、重点掌握多线程的同步与通信机制&#xff1b; 3、熟悉JAVA中有关多线程同步与通信的方法 &#xff1b; 4、能使用多线程机制解决实际应用中的线程同步与通信问题。 &#xff08;二&…

【社会信用体系1003】 企业违规新解:社会信用环境改善的实证分析!

今天给大家分享的是来自于国内顶级期刊金融研究2023年发表论文——《社会信用环境改善降低了企业违规吗&#xff1f;——来自“中国社会信用体系建设”的证据》所用到的重要数据集&#xff0c;该文章从企业层面探讨了社会信用系统建设对企业违规行为的影响&#xff0c;更精准地…

Srping 历史

一、History of Spring and the Spring Framework Spring came into being in 2003 as a response to the complexity of the early J2EE specifications. While some consider Java EE and its modern-day successor Jakarta EE to be in competition with Spring, they are …

小白不知道怎么投稿?记住这个好方法

作为一名单位信息宣传员,我最初踏上这条道路时,满心憧憬着通过文字传递我们单位的精彩瞬间,让社会听见我们的声音。然而,理想与现实之间的距离,却在一次次邮箱投稿的石沉大海中渐渐清晰。那时的我,像所有“小白”一样,以为只要用心撰写稿件,通过电子邮件发给各大媒体,就能收获满…

亚马逊云主管马特·加尔曼面临压力,致力于在人工智能领域赶超竞争对手

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗&#xff1f;订阅我们的简报&#xff0c;深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同&#xff0c;从行业内部的深度分析和实用指南中受益。不要错过这个机会&#xff0c;成为AI领…

Learning Deep Intensity Field for Extremely Sparse-View CBCT Reconstruction

摘要 稀疏视图锥束CT&#xff08;CBCT&#xff09;重建是降低辐射剂量和临床应用的一个重要方向&#xff0c;以往基于体素的重建方法将CT表示为离散体素&#xff0c;由于使用3D解码器&#xff0c;导致存储要求高和空间分辨率有限。我们将CT体积表示为连续强度场&#xff0c;并…

全面解析Java.lang.ClassCastException异常

全面解析Java.lang.ClassCastException异常 全面解析Java.lang.ClassCastException异常&#xff1a;解决方案与最佳实践 &#x1f680;&#x1f4da;摘要引言1. 什么是Java.lang.ClassCastException&#xff1f;代码示例 2. 报错原因2.1 类型不兼容2.2 泛型类型擦除2.3 接口和实…

【C++】STL快速入门基础

文章目录 STL&#xff08;Standard Template Library&#xff09;1、一般介绍2、STL的六大组件2.1、STL容器2.2、STL迭代器2.3、相关容器的函数vectorpairstringqueuepriority_queuestackdequeset, map, multiset, multimapunordered_set, unordered_map, unordered_multiset, …

Autodesk Flame 2025 for Mac:视觉特效制作的终极利器

在数字时代&#xff0c;视觉特效已经成为电影、电视制作中不可或缺的一部分。Autodesk Flame 2025 for Mac&#xff0c;这款专为视觉特效师打造的终极工具&#xff0c;将为您的创作提供无尽的可能。 Autodesk Flame 2025 for Mac拥有强大的三维合成环境&#xff0c;能够支持您…

stm32通过esp8266连接阿里云平台代码讲解

连接服务器 首先&#xff0c;按照一定的规则&#xff0c;获取连接阿里服务器所需要的ClientID&#xff08;客户端D&#xff09;、Username&#xff08;用户名&#xff09;、Passward(密码)&#xff0c;ServerIP&#xff08;域名&#xff09;&#xff0c;ServerPort&#xff08…

Qt | QTabBar 类(选项卡栏)

01、上节回顾 Qt | QStackedLayout 类(分组布局或栈布局)、QStackedWidget02、简介 1、QTabBar类直接继承自 QWidget。该类提供了一个选项卡栏,该类仅提供了一个选项卡, 并没有为每个选项卡提供相应的页面,因此要使选项卡栏实际可用,需要自行为每个选项卡设置需要显示的页…

冯 • 诺依曼体系结构和操作系统

目录 冯诺依曼体系结构基于冯诺依曼体系数据的高效流转数据流转示例操作系统(Operator System)操作系统(Operator System)层次结构硬件部分系统软件部分用户部分 管理——先描述&#xff0c;再组织 就一个程序而言&#xff0c;需要在计算机中运行的才能实现它的价值&#xff0c…

jmeter发送webserver请求和上传请求

有时候在项目中会遇到webserver接口和上传接口的请求&#xff0c;大致参考如下 一、发送webserver请求 先获取登录接口的token&#xff0c;再使用cookie管理器进行关联获取商品(webserver接口)&#xff0c;注意参数一般是写在消息体数据中&#xff0c;消息体有点像HTML格式 执…

调整GIF图大小的方法是什么?分享4个

调整GIF图大小的方法是什么&#xff1f;在数字化时代&#xff0c;GIF以其独特的动图魅力&#xff0c;成为了网络交流中不可或缺的一部分。无论是社交媒体、博客文章还是工作汇报&#xff0c;一个恰到好处的GIF图往往能有效吸引观众的注意&#xff0c;传递信息&#xff0c;但过大…

【typescript - tsc 编译后路径问题/路径别名问题】

这几天在写typescript&#xff0c;遇到个路径依赖问题&#xff0c;编写的.ts文件直接运行OK&#xff0c;但是编译成.js后&#xff0c;运行提示 Error: Cannot find module xxx&#xff0c;&#x1f4dd;记录分析和解决过程 。 问题描述 原始文件&#xff0c;有index.ts 其会引…

中小学校活动怎样投稿给媒体报道宣传?

身为一名学校老师,同时承担起单位活动向媒体投稿的宣传重任,我深知每一次校园活动背后的故事,都承载着师生们的辛勤汗水与教育的无限可能。起初,我满怀着对教育的热情,希望通过文字传递校园的温暖与光芒,却在投稿的道路上遇到了前所未有的挑战。 最初,我选择了最传统的路径——…

【STM32】检测SD卡是否插入

【STM32】检测SD卡是否插入 开发环境原理图确定引脚的高低电平中断方式检测插入配置引脚打开引脚的中断编写代码显示SD卡信息引脚中断回调函数 实现的效果 开发环境 软件&#xff1a;STM32CubeIDE1.14.1 硬件&#xff1a;立创天空星STM32F407VE&#xff1b;SD卡 原理图 要确…

对未知程序所创建的带有折叠书签的 PDF 文件书签层级全展开导致丢失的一种解决方法

对需要经常查阅、或连续长时间阅读的带有折叠书签的 PDF 文档展开书签层级&#xff0c;提高阅览导航快捷是非常有必要的。 下面是两种常用书签层级全展开的方法 1、 FreePic2Pdf 1 - 2 - 3 - 4 - 5 - 6&#xff0c;先提取后回挂 2、PdgCntEditor 载入后&#xff0c;直接保存…

雷军-2022.8小米创业思考-8-和用户交朋友,非粉丝经济;性价比是最大的诚意;新媒体,直播离用户更近;用真诚打动朋友,脸皮厚点!

第八章 和用户交朋友 2005年&#xff0c;为了进一步推动金山的互联网转型&#xff0c;让金山的同事更好地理解互联网的精髓&#xff0c;我推动了一场向谷歌学习的运动&#xff0c;其中一个小要求就是要能背诵“谷歌十诫”。 十诫的第一条就令人印象深刻&#xff1a;以用户为中…

开发中的常用快捷键

开发中的常用快捷键 文章目录 开发中的常用快捷键一、window11快捷键二、WebStrom 快捷键三、IDEA快捷键四、vscode快捷键五、eclipse快捷键项目备注 一、window11快捷键 快捷切屏 、来回切屏alttab 二、WebStrom 快捷键 常规快捷键和idea差不多 ttab生成vue模版 htab生成ht…