数据结构-顺序表(动态分配存储空间)
数据结构-顺序表(动态分配存储空间)
(1)顺序表的结构定义:
结构型定义:(动态分配存储空间)
/*** 动态分配存储空间*/
#define InitSize 100 //动态分配存储空间时,不限制最大,只给定一个初始值
#define ListIncrement 10 //分配增量
typedef struct
{int* data; //指向所分配的存储空间的基地址int length; //当前的长度,已经存储元素后占用的长度int listsize; //当前分配的存储空间的大小,若不足,可再进行分配
}SeqList;
初始化顺序表
/*** 初始化顺序表,动态分配存储空间* @param L 顺序表L,引用型*/
void Init_SeqList(SeqList& L) {L.data = (int*)malloc(sizeof(int) * InitSize);L.length = 0;L.listsize = InitSize;
}
创建顺序表
/*** 创建顺序表时,动态分配存储空间,当需要插入的元素个数大于初始的空间大小时,可继续申请空间* @param L 顺序表L,引用型* @param n 需要插入的元素个数* @return 0表示失败,1表示成功*/
int Create_SeqList(SeqList& L, int n) {if (n > L.listsize){/*指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小),在原有的空间上增加空间*/int* newbase = (int*)realloc(L.data, sizeof(int) * (L.listsize + ListIncrement));if (newbase){L.data = newbase; //新基址L.listsize += ListIncrement; //增加存储容量}else {return 0;}}/*存入数据*/for (int i = 0; i < n; ++i){scanf_s("%d", &L.data[i]);}L.length = n;return 1;
}
注意:动态分配存储空间时,如果原先分配的存储空间不足时可以继续申请空间。按照之前设置的增量来增加存储容量。
输出顺序表
/*** 输出顺序表* @param L 顺序表*/
void Print_SeqList(SeqList L) {for (int i = 0; i < L.length; i++)printf("%d ", L.data[i]);printf("\n");
}
在顺序表中插入元素
/*** 在动态分配存储空间的顺序表中插入一个元素* @param L 顺序表,引用型,动态分配存储空间* @param location 需要插入在第location个位置* @param elem 插入的元素值* @return 1表示插入成功,0表示插入失败*/
int InsertElem_SeqList(SeqList& L, int location, int elem) {if (location<1 || location>L.length + 1){return 0;}if (L.length >= L.listsize) //当前存储空间已满,增加分配{int* newbase = (int*)realloc(L.data, sizeof(int) * (L.listsize + ListIncrement));if (newbase){L.data = newbase;L.listsize += ListIncrement;}}for (int i = L.length; i >= location; --i){L.data[i] = L.data[i - 1];}L.data[location - 1] = elem;L.length++;return 1;
}
在顺序表中删除元素
/*** 删除指定位置的元素,同时将删除的数据带出* @param L 顺序表L,引用类型* @param location 删除第location个位置的元素* @param elem 引用型,用于带出删除的元素值* @return 返回1表示插入成功,返回0表示插入失败*/
int DeleteElem_SeqList(SeqList& L, int location, int& elem) {if (location<1 || location>L.length) //判断删除的位置是否有效return 0;elem = L.data[location - 1];for (int i = location; i < L.length; ++i) //将元素从前往后一次向前移一个位置L.data[i - 1] = L.data[i];L.length--;return 1;
}
完整测试函数
#include <stdio.h>
#include <malloc.h>
#include <stdlib.h>
/*** 动态分配存储空间*/
#define InitSize 100 //动态分配存储空间时,不限制最大,只给定一个初始值
#define ListIncrement 10 //分配增量
typedef struct
{int* data; //指向所分配的存储空间的基地址int length; //当前的长度,已经存储元素后占用的长度int listsize; //当前分配的存储空间的大小,若不足,可再进行分配
}SeqList;/*** 初始化顺序表,动态分配存储空间* @param L 顺序表L,引用型*/
void Init_SeqList(SeqList& L) {L.data = (int*)malloc(sizeof(int) * InitSize);L.length = 0;L.listsize = InitSize;
}/*** 创建顺序表时,动态分配存储空间,当需要插入的元素个数大于初始的空间大小时,可继续申请空间* @param L 顺序表L,引用型* @param n 需要插入的元素个数* @return 0表示失败,1表示成功*/
int Create_SeqList(SeqList& L, int n) {if (n > L.listsize){/*指针名=(数据类型*)realloc(要改变内存大小的指针名,新的大小),在原有的空间上增加空间*/int* newbase = (int*)realloc(L.data, sizeof(int) * (L.listsize + ListIncrement));if (newbase){L.data = newbase; //新基址L.listsize += ListIncrement; //增加存储容量}else {return 0;}}/*存入数据*/for (int i = 0; i < n; ++i){scanf_s("%d", &L.data[i]);}L.length = n;return 1;
}/*** 输出顺序表* @param L 顺序表*/
void Print_SeqList(SeqList L) {for (int i = 0; i < L.length; i++)printf("%d ", L.data[i]);printf("\n");
}/*** 在动态分配存储空间的顺序表中插入一个元素* @param L 顺序表,引用型,动态分配存储空间* @param location 需要插入在第location个位置* @param elem 插入的元素值* @return 1表示插入成功,0表示插入失败*/
int InsertElem_SeqList(SeqList& L, int location, int elem) {if (location<1 || location>L.length + 1){return 0;}if (L.length >= L.listsize) //当前存储空间已满,增加分配{int* newbase = (int*)realloc(L.data, sizeof(int) * (L.listsize + ListIncrement));if (newbase){L.data = newbase;L.listsize += ListIncrement;}}for (int i = L.length; i >= location; --i){L.data[i] = L.data[i - 1];}L.data[location - 1] = elem;L.length++;return 1;
}/*** 删除指定位置的元素,同时将删除的数据带出* @param L 顺序表L,引用类型* @param location 删除第location个位置的元素* @param elem 引用型,用于带出删除的元素值* @return 返回1表示插入成功,返回0表示插入失败*/
int DeleteElem_SeqList(SeqList& L, int location, int& elem) {if (location<1 || location>L.length) //判断删除的位置是否有效return 0;elem = L.data[location - 1];for (int i = location; i < L.length; ++i) //将元素从前往后一次向前移一个位置L.data[i - 1] = L.data[i];L.length--;return 1;
}/*** 主函数* @return 结束*/
int main() {/*** 创建动态分配存储空间的L时*/SeqList L;Init_SeqList(L);/*创建顺序表――输入数据*/int n;printf("输入需要创建的表的长度:\n");scanf_s("%d", &n);printf("输入表中的元素:\n");Create_SeqList(L, n);printf("创建顺序表完成:\n");Print_SeqList(L);/*插入元素――指定插入位置和值*/int elemLoc;int elem;printf("输入需要插入的位置和元素的值:\n");scanf_s("%d %d", &elemLoc, &elem);InsertElem_SeqList(L, elemLoc, elem);printf("插入数据完成:\n");Print_SeqList(L);/*删除元素――指定删除位置*/printf("输入需要删除的位置:\n");scanf_s("%d", &elemLoc);DeleteElem_SeqList(L, elemLoc, elem);printf("删除数据完成:\n");Print_SeqList(L);printf("删除的元素为:%d\n", elem);return 0;}
创作不易,喜欢的话加个关注点个赞,谢谢谢谢谢谢。
数据结构-顺序表(动态分配存储空间)相关推荐
- 数据结构-顺序表结构的实现C语言(全代码)
课程设计题目 设计出顺序表结构的相关函数库,以便在程序设计中调用. 题目要求 (1)包括线性表的各种基本函数以及常用函数(自己确定函数.函数形式及理由) (2)最好能借助语言环境实现图形显示功能,以便 ...
- 数据结构顺序表学习小结
一.基本概念: 数据>数据元素>数据项 数据元素是数据的基本单位 数据项是数据的最小单位 数据元素是带有结构的各项数据元素的集合 数据结构包括逻辑结构和存储结构两个层次 二.算法 一个算法 ...
- 数据结构——顺序表的实现
文章目录 一.什么是线性表? 二.什么是顺序表 三.顺序表的实现 1.顺序表的接口 2.每个接口的实现 3.测试程序 3.Java版本 总结 一.什么是线性表? 线性表(linear list)是n个 ...
- C语言链表的转置算法,c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置.doc...
c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置 #include "stdio.h" #include "malloc.h" /*typedef s ...
- C语言/C++常见习题问答集锦[八十三]之数据结构顺序表(operand types are error: no match for “operator==“)
C语言/C++常见习题问答集锦[八十三]之数据结构顺序表{operand types are error: no match for "operator=="} 程序之美 前言 主 ...
- 数据结构--顺序表的使用
数据结构--顺序表的使 #include<iostream> #include<cstdio> #include<cstring> using namespace ...
- Educoder头歌数据结构顺序表及其应用
头歌实践平台答案educoder 数据结构-顺序表及其应用 第1关:顺序表的实现之查找功能 /***************************************************** ...
- 数据结构——顺序表的合并
数据结构--顺序表的合并 具体要求:写一个函数,其函数的功能是将非递增顺序表LA和LB合并到非递增顺序表LC中 数据结构-顺序表的操作之合并顺序表 一.顺序表的结构 首先要定义的是顺序表的结构体,只有 ...
- 数据结构顺序表的查找_数据结构1|顺序表+链表
数据结构学习笔记1 进度:静态分配顺序表+单链表 参考资料:b站 王道考研+小甲鱼 < 判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注最高项目.的阶数. 推导大O阶方法 ...
最新文章
- 上传功能(前后端代码)
- generate报错 make_如何安装opencv_contrib及解决其安装编译问题
- java 非递归求二叉树高度_非递归算法实现二叉树高度
- 基于 Blazor 开发五子棋小游戏
- 如何通过图片识别用的什么字体?
- 拓端tecdat|【视频】R语言中的隐马尔可夫HMM模型实例
- Blender快捷键设置
- java导出繁体字word_利用简繁体字转换功能实现简体字文档转换为繁体字文档的方法...
- 东北大学计算机学院领导,计算机学院召开新一届全体干部大会
- python 语音交互_Python调用WIN10语音交互+识别+控制+自定义对话
- python画学习曲线_Python在同一个figu上用scikitlearn绘制几个学习曲线
- 为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz?
- 2014cad运行要计算机内,win7系统2014cad出现致命错误的解决方法
- 不需要手机号就能注册的免费邮箱,这5个就够啦!
- MSN多开,MSN多帐号登陆
- RabbitMQ:什么是消息队列MQ?为什么使用消息队列MQ?入门MQ先学哪种?(一)
- lr0文法分析表示例_一个简单实例的LR分析过程
- 切图iOS和android区别,用sketch也要画iOS和android两套吗|Sketch如何用一套设计稿做iOS和Android两个版本 - PS下...
- 操作系统 | 关于进程、线程、用户线程、内核线程
- hadoop数仓建设之离线数据开发
热门文章
- 【Latex】在图片标题中加入脚注
- 爱创课堂每日一题第五十六天-对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?...
- 安装Ubuntu16.04视频播放器smplayer
- 数组的reduce的妙用之处
- dijkstra标号法表格_Dijkstra算法详细讲解
- 关于Spark的部署yarn模式
- Superset系列8- 制作饼图
- [OpenHarmony RK3568](四)WIFI芯片适配
- 二阶边值问题的数值解matlab,《二阶常微分方程边值问题的数值解法》-毕业论文.doc...
- 2020-09-04 CD40193十六进制加减Multisim仿真