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.hqwc.cn/news/223305.html

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

相关文章

git报错:error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413

git报错&#xff1a;error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 如图&#xff1a; error: RPC failed; HTTP 413 curl 22 The requested URL returned error: 413 send-pack: unexpected disconnect while reading sideband packet fatal: th…

Python Anaconda创建虚拟环境及Pycharm使用虚拟环境

目录 前言 一、Anaconda与Pycharm 二、conda常用命令 三、Pycharm使用虚拟环境 总结 前言 我们在做开发任务时可能会创建多个项目&#xff0c;这些项目可能会依赖于不同的Python环境。比如有的用到Python3.6、有的用到Python3.7&#xff1b;有的用Pytorch开发、有的用Tens…

Leetcode—167.两数之和 II - 输入有序数组【中等】

2023每日刷题&#xff08;四十一&#xff09; Leetcode—167.两数之和 II - 输入有序数组 实现代码 /*** Note: The returned array must be malloced, assume caller calls free().*/ int* twoSum(int* numbers, int numbersSize, int target, int* returnSize) {*returnSiz…

快速搭建一个SpringCloud、SpringBoot项目 || 项目搭建要点

1. 基本结构 建立springcloud项目从表入手&#xff0c;分析好需求建立表结构后&#xff0c;使用mybatis-plux生成POJO类&#xff0c;在对应的model模块中。 2. 微服务部分架构 2.1 依赖 service 微服务模块的依赖仅包含如下&#xff0c;数据库等依赖包含在model中&#xff0c…

爬取极简壁纸

js反编译的代码需要解密之类的&#xff0c;直接给我干蒙圈了&#xff0c;借助selenium可以直接获取到调式工具中的源码&#xff0c;可以获取渲染后的链接&#xff0c;然后将链接交给下载函数&#xff08;使用异步提高效率&#xff09;即可。 后续学习完js反编译的话&#xff0…

【斗破年番】萧炎斩杀蝎山,活捉魂殿铁护法,救小医仙身中魔斑毒

Hello,小伙伴们&#xff0c;我是拾荒君。 《斗破苍穹年番》第72集的国漫已经更新了。这一集中&#xff0c;蝎毕岩靠着秘术的加成暂时压制住了小医仙。在激烈的交战中&#xff0c;小医仙不得不解开自身的厄难毒体&#xff0c;而每解开一次&#xff0c;她就离死亡更近一步。 萧炎…

Windows11安装后跳过联网登录

Windows11安装后跳过联网登录 实验设备&#xff1a; VMware17Pro虚拟机中使用Windows11镜像安装Windows11操作系统&#xff0c;并且在虚拟机中测试跳过联网登录。 步骤 说明&#xff1a;物理卸载网卡&#xff08;在虚拟机上禁用网卡&#xff09;没用 思路&#xff1a; sh…

23种经典设计模式:单例模式篇(C++)

前言&#xff1a; 博主将从此篇单例模式开始逐一分享23种经典设计模式&#xff0c;并结合C为大家展示实际应用。内容将持续更新&#xff0c;希望大家持续关注与支持。 什么是单例模式&#xff1f; 单例模式是设计模式的一种&#xff08;属于创建型模式 (Creational Pa…

innovus如何在floorplan view显示所有module

我正在「拾陆楼」和朋友们讨论有趣的话题&#xff0c;你⼀起来吧&#xff1f; 拾陆楼知识星球入口 如题&#xff0c;innovus的图形界面在floorplan view下默认只能显示instance数量超过100个的module&#xff0c;如果要显示更小的module&#xff0c;需要在VIEW-Set Perference…

关于mybatis插入返回主键id和SpringBoot事务注解自调用演示

文章目录 一. 插入返回任意规则主键ID二. SpringBoot自调用事务2.1 场景12.2 场景2 自调用结论总结 一. 插入返回任意规则主键ID 实体对象 TableName("bank") Data public class Entity {TableId("id")Integer id;TableField("money")Integer …

nodejs+vue+elementui网上家电家用电器数码商城购物网站 多商家

基于vue.js的恒捷网上家电商城系统根据实际情况分为前后台两部分&#xff0c;前台部分主要是让用户购物使用的&#xff0c;包括用户的注册登录&#xff0c;查看公告&#xff0c;查看和搜索商品信息&#xff0c;根据分类定位不同类型的商品&#xff0c;将喜欢的商品加入购物车&a…

新手用什么工具制作电子画册?新分享

随着数字化时代的到来&#xff0c;电子画册已成为企业宣传、展示产品的重要手段。对于新手来说&#xff0c;选择一款合适的工具是关键。今天&#xff0c;为大家推荐一款适合新手制作的电子画册工具&#xff0c;让你轻松制作出精美画册。 工具推荐&#xff1a;FLBOOK在线制作电子…