C语言线性表的实现(详解)

数据结构之线性表

线性表的基本概念:线性表是由0个或者多个数据元素的有限序列
特性是:
​ 1:数据元素之间都是有顺序的
​ 2:数据元素的个数是有限的,
​ 3:数据元素的类型是相同的
​ 性质是:
a0是线性表的第一个元素,只有一个后继,an为线性表的最后一个元素,只有一个前驱
​ 除去a0和an外的其他元素ai,既有前驱也有后继线性表可以逐项访问的顺序存取

线性表的顺序存储结构:指的是用一组地址连续的存储单元依次存储线性表中的数据元素
1: 当插入一个新的元素时,发现内存空间不足申请一块更大的内存空间
2: 将原空间的数据拷贝到新的内存空间
3: 释放旧的内存空间
4: 把元素放入新的空间

1: 动态的内存增加,将存放数据的内存放到堆上(堆的内存空间比较大,不容易发生溢出)
2: 动态数组,如果是5个元素,申请内存,拷贝数据,释放内存,插入第7个数据?
3: capacity容量表示在这一块的内存空间中可以存放多少元素
4: size的概念记录当前数组中具体的内存个数

在这里插入图片描述
程序的头部文件
在这里插入图片描述具体头文件的代码如下所示

 #ifndef DYNAMIC_ARRAY_H
#define DYNAMIC_ARRAY_H
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <string.h>
#include <iostream>/*线性表的基本概念:线性表是由0个或者多个数据元素的有限序列特性是:1:数据元素之间都是有顺序的,2:数据元素的个数是有限的,3:数据元素的类型是相同的性质:a0是线性表的第一个元素,只有一个后继,an为线性表的最后一个元素,只有一个前驱除去a0和an外的其他元素ai,既有前驱也有后继线性表可以逐项访问的顺序存取线性表的顺序存储结构:指的是用一组地址连续的存储单元依次存储线性表中的数据元素1: 当插入一个新的元素时,发现内存空间不足申请一块更大的内存空间2: 将原空间的数据拷贝到新的内存空间3: 释放旧的内存空间4: 把元素放入新的空间// 动态的内存增加,将存放数据的内存放到堆上// 动态数组,如果是5个元素,申请内存,拷贝数据,释放内存,插入第7个数据?// capacity容量表示在这一块的内存空间中可以存放多少元素// size的概念记录当前数组中具体的内存个数*/typedef struct DYNAMICARRAY {int* pAddr; // 具体存放数据的地址int size;  // 当前有多少个元素int capacity;  //当前容器最大容纳多少个元素}Dynamic_Array;// 初始化数组
Dynamic_Array* Init_Array();
// 插入
void Push_Back_Array(Dynamic_Array* arr, int value);
// 删除,根据位置对相应的数据进行删除
void Remove_Array(Dynamic_Array* arr, int pos);
// 根据值进行删除
void RemoveByValue_Array(Dynamic_Array* arr, int value);
//查找
int Find_Array(Dynamic_Array* arr, int value);
// 打印输出动态数组当中的值
void Print_Array(Dynamic_Array* arr);
//清空数组
void Clear_Array(Dynamic_Array* arr);
// 获得动态数组容量
int Capacity_Array(Dynamic_Array* arr);
//获得动态数组当前的元素个数
int Size_Array(Dynamic_Array* arr);
int At_Array(Dynamic_Array* arr, int pos);
//释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr);#endif

程序的主文件main
在这里插入图片描述主要文件代码如下所示:

#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <iostream>
#include <string.h>
#include "DynamicArray.h"// 初始化数组
Dynamic_Array* Init_Array() {// 申请内存Dynamic_Array* myArray =(Dynamic_Array*) malloc(sizeof(Dynamic_Array));// 初始化myArray->size = 0;myArray->capacity = 20;myArray->pAddr = (int *)malloc(sizeof(int) * myArray->capacity);return myArray;};
// 插入
void Push_Back_Array(Dynamic_Array* arr, int value) {if (arr == NULL) {return;}// 判断空间是否足够if (arr->size == arr->capacity) {// 第一步,申请一块更大的内存空间,新的空间默认就旧空间的2倍int* newSpace = (int*)malloc(sizeof(int) * arr->capacity * 2);// 第二步,拷贝数据到新的内存空间memcpy(newSpace, arr->pAddr, arr->capacity * sizeof(int));// 释放旧空间的内存free(arr->pAddr);// 更新容量arr->capacity = arr->capacity * 2;arr->pAddr = newSpace;}//插入新的元素,从尾部插入arr->pAddr[arr->size] = value;arr->size++;
};// 删除,根据位置对相应的数据进行删除
void Remove_Array(Dynamic_Array* arr, int pos) {if (arr == NULL) {return;}// 判断位置是否有效if (pos < 0 || pos >= arr->size) {return;}// 删除元素for (int i = pos; i < arr->size - 1; i++) {arr->pAddr[i] = arr->pAddr[i + 1];}arr->size--;};// 根据值进行删除
void RemoveByValue_Array(Dynamic_Array* arr, int value) {if (arr == NULL) {return;}// 找到值的位置int pos = Find_Array(arr,value);for (int i = 0; i < arr->size; i++) {if (arr->pAddr[i] == value) {pos = i;break;}}// 根据位置删除Remove_Array(arr, pos);};
//查找
int Find_Array(Dynamic_Array* arr, int value) {if (arr == NULL) {return -1;}int pos = -1;for (int i = 0; i < arr->size; i++) {if (arr->pAddr[i] == value) {pos = i;break;}}return pos;
};
// 打印
void Print_Array(Dynamic_Array* arr) {if (arr == NULL) {return;}// 使用for循环打印输出相关的数据for (int i = 0; i < arr->size; i++) {printf("%d ", arr->pAddr[i]);}printf("\n");};//清空数组
void Clear_Array(Dynamic_Array* arr) {if (arr == NULL) {return;}// pAddr - > 空间arr->size = 0;
};
// 获得动态数组容量
int Capacity_Array(Dynamic_Array* arr) {if (arr == NULL) {return -1;}return arr->capacity;
};
//获得动态数组当前的元素个数
int Size_Array(Dynamic_Array* arr) {if (arr == NULL) {return -1;}return arr->size;
};
int At_Array(Dynamic_Array* arr, int pos) {if (arr == NULL) {return -1;}return arr->pAddr[pos];
};
//释放动态数组的内存
void FreeSpace_Array(Dynamic_Array* arr) {if (arr == NULL) {return;}// 先释放动态数组内存中里面那块的内存if (arr->pAddr != NULL) {free(arr->pAddr);}free(arr);};int main(void) {Dynamic_Array* myArray = Init_Array();// 打印输出数组容量printf("数组容量:%d\n", Capacity_Array(myArray));printf("数组大小:%d\n", Size_Array(myArray));// 插入元素for (int i = 0; i < 30; i++) {Push_Back_Array(myArray, i);}printf("数组容量:%d\n", Capacity_Array(myArray));printf("数组大小:%d\n", Size_Array(myArray));// 删除里面的数据RemoveByValue_Array(myArray,0);RemoveByValue_Array(myArray, 27);printf("数组容量:%d\n", Capacity_Array(myArray));printf("数组大小:%d\n", Size_Array(myArray));// 查找第五个位置int pos = Find_Array(myArray, 5);printf("查找5的位置pos:%d  %d\n",pos, At_Array(myArray,pos));// 打印Print_Array(myArray);//销毁FreeSpace_Array(myArray);system("pause");return 0;}

使用代码模拟线性表实现数据的增,删,改,查(程序的运行结果如下所示)

在这里插入图片描述

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

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

相关文章

一维数组传参的本质

一维数组传参的本质 数组我们之前学过了&#xff0c;之前也讲了&#xff0c;数组是可以传递给函数的&#xff0c;这个小节我们讨论一下数组传参的本质。 首先&#xff0c;我们从一个问题开始&#xff0c;我们之前都是在函数外部计算数组的元素个数&#xff0c;那我们可以把函…

Git安装

简单粗暴&#xff0c;跟着步骤一步一步来 右键就会有了

Rust内存布局

题图忘了来自哪里.. 整型,浮点型,struct,vec!,enum 本文是对 Rust内存布局 的学习与记录 struct A { a: i64, b: u64,}struct B { a: i32, b: u64,}struct C { a: i64, b: u64, c: i32,}struct D { a: i32, b: u64, c: i32, d: u64,}fn main(…

优思学院|如何在企业中实施降本增效策略,实现财务突破

在当今竞争激烈的商业环境中&#xff0c;企业降低成本并提高效益变得至关重要。本文将深入探讨如何降本增效&#xff0c;以及实施这些策略的方法。 提到降本增效或提升生产效率&#xff0c;第一个被提出来检讨的一定是直接部门。但是如果无视于日渐臃肿的间接部门&#xff0c;…

TS 函数及多态

TS 能推导出函数体中的类型&#xff0c;但多数情况下无法推导出参数的类型&#xff0c;只有少数特殊情况下能根据上下文推导参数的类型。返回类型能推导出&#xff0c;不过也可以显式注解。 1 声明和调用函数 一般来说&#xff0c;在方法中的this值为调用该方法时位于点号左侧…

大模型下交互式数据挖掘的探索与发现

在这个数据驱动的时代&#xff0c;数据挖掘已成为解锁信息宝库的关键。过去&#xff0c;我们依赖传统的拖拉拽方式来建模&#xff0c;这种方式在早期的数据探索中起到了作用&#xff0c;但随着数据量的激增和需求的多样化&#xff0c;它的局限性逐渐显露。 >>>> 首…

App备案与iOS云管理式证书 ,公钥及证书SHA-1指纹的获取方法

​ 引言 在iOS应用程序开发过程中&#xff0c;进行App备案并获取公钥及证书SHA-1指纹是至关重要的步骤。本文将介绍如何通过appuploader工具获取iOS云管理式证书 Distribution Managed 公钥及证书SHA-1指纹&#xff0c;帮助开发者更好地理解和应用该过程。 正文 iOS应用程序…

【从删库到跑路 | MySQL总结篇】表的增删查改(进阶上)

个人主页&#xff1a;兜里有颗棉花糖 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 兜里有颗棉花糖 原创 收录于专栏【MySQL学习专栏】&#x1f388; 本专栏旨在分享学习MySQL的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 目录 一、数据…

Node.js入门指南(五)

目录 MongoDB 介绍 下载与启动 命令行交互 Mongoose 代码模块化 图形化管理工具 hello&#xff0c;大家好&#xff01;上一篇文章我们介绍了express框架&#xff0c;这一篇文字主要介绍MongoDB。来对数据进行存储以及操作。 MongoDB 介绍 各位小伙伴应该多多少少都有接…

uniapp基础-教程之HBuilderX基础常识篇03

该内容为了大家更好的理解&#xff0c;将每个页面进行分离&#xff0c;单独创建项目&#xff0c;如在index中之写只写了一个搜索框&#xff0c;将其他页面分别放在HBuilderX目录中的components中&#xff0c;没有的可自行创建。 然后在components中创建轮播图新建一个swiper.v…

正则化与正则剪枝

写在前面&#xff1a;本博客仅作记录学习之用&#xff0c;部分图片来自网络&#xff0c;如需引用请注明出处&#xff0c;同时如有侵犯您的权益&#xff0c;请联系删除&#xff01; 文章目录 引言正则化为什么会过拟合拉格朗日与正则化梯度衰减与正则化 应用解决过拟合网络剪枝 …

Linux篇:文件管理

一、共识原理&#xff1a; 1. 文件内容属性&#xff0c;内容与属性都是数据&#xff0c;都要在磁盘中保存。 2. 文件分为打开的文件和没打开的文件。 3. 研究打开的文件&#xff1a;本质是研究进程和文件的关系&#xff0c;因为是进程负责打开文件。 4. 没打开的文件在存储介质…

红黑树(万字图文详解)

红黑树 1. 红黑树的概念2. 红黑树的性质3. 红黑树节点的定义4. 红黑树结构5. 红黑树的插入操作5.1 按照二叉搜索的树规则插入新节点5.2 检测新节点插入后&#xff0c;红黑树的性质是否造到破坏5.2.1 情况一: cur为红&#xff0c;p为红&#xff0c;g为黑&#xff0c;u存在且为红…

智能优化算法应用:基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于蜻蜓算法无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.蜻蜓算法4.实验参数设定5.算法结果6.参考文献7.MATLAB…

【springboot】宝塔简单部署springboot 配置https

宝塔简单部署springboot配置https 需求步骤1. springboot通过maven组件打成jar包2. 将jar包部署到宝塔上3. 下载安装nginx并创建网站节点4. 设置域名或者IP5. 设置反向代理:代理后端服务的ip和端口7. 配置SSL/TLS 需求 宝塔部署springboot项目,用nginx反向代理后端IP端口&…

深度学习黎明时期的LeNet:揭开卷积神经网络的序幕

在深度学习的历史长河中&#xff0c;Yann LeCun 的 LeNet 是一个里程碑式的研究成果&#xff0c;它为后来的卷积神经网络&#xff08;Convolutional Neural Networks&#xff0c;CNN&#xff09;的发展奠定了基础。LeNet 的诞生标志着深度学习黎明时期的到来&#xff0c;为人工…

【已解决】在windows下,gitlab修改了密码导致remote: HTTP Basic: Access denied

背景 网上好多答案遇到此问题都是修改凭证,故写此文。 在控制面板》用户账户》凭据管理器》管理windows凭据》普通凭据 --找到对应的git地址&#xff0c;编辑用户名和密码 本文解决方案适用于windows下没有凭证的情况&#xff0c;因修改密码导致下拉代码出错的情况。 Git是常…

Scrapy框架内置管道之图片视频和文件(一篇文章齐全)

1、Scrapy框架初识&#xff08;点击前往查阅&#xff09; 2、Scrapy框架持久化存储&#xff08;点击前往查阅&#xff09; 3、Scrapy框架内置管道 4、Scrapy框架中间件&#xff08;点击前往查阅&#xff09; Scrapy 是一个开源的、基于Python的爬虫框架&#xff0c;它提供了…

JAVA配置jdk17 Graa1VM

按照网上内容下载好对应的jdk17版本的Graa1VM&#xff0c; 解压后&#xff0c;修改环境变量中的JAVA_HOME为当前的目录&#xff0c;例如 D:\ruanjian\jdk\gra_jdk17\graalvm-ce-java17-22.3.0 。 然后在命令行中输入java -version的时候&#xff0c; 返回的并不是 Graa1VM 相关…

文件权限中 chmod、u+x、u、r、w、x分别代表什么

Linux系统中的每个文件和目录都有访问许可权限&#xff0c;如下面所示&#xff1a; 要说清楚问题&#xff0c;我们截取一些内容&#xff1a; ypyubuntu:~$ ls -l drwxr-xr-- 2 ypy ypy 4096 Nov 30 18:33 Desktop/ drwxr-xr-- 2 ypy ypy 4096 Nov 30 18:33 Documen…