数据结构-顺序表(动态分配存储空间)

(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;}

创作不易,喜欢的话加个关注点个赞,谢谢谢谢谢谢。

数据结构-顺序表(动态分配存储空间)相关推荐

  1. 数据结构-顺序表结构的实现C语言(全代码)

    课程设计题目 设计出顺序表结构的相关函数库,以便在程序设计中调用. 题目要求 (1)包括线性表的各种基本函数以及常用函数(自己确定函数.函数形式及理由) (2)最好能借助语言环境实现图形显示功能,以便 ...

  2. 数据结构顺序表学习小结

    一.基本概念: 数据>数据元素>数据项 数据元素是数据的基本单位 数据项是数据的最小单位 数据元素是带有结构的各项数据元素的集合 数据结构包括逻辑结构和存储结构两个层次 二.算法 一个算法 ...

  3. 数据结构——顺序表的实现

    文章目录 一.什么是线性表? 二.什么是顺序表 三.顺序表的实现 1.顺序表的接口 2.每个接口的实现 3.测试程序 3.Java版本 总结 一.什么是线性表? 线性表(linear list)是n个 ...

  4. C语言链表的转置算法,c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置.doc...

    c语言编程集 数据结构 顺序表 点链表 数制转换 矩阵转置 #include "stdio.h" #include "malloc.h" /*typedef s ...

  5. C语言/C++常见习题问答集锦[八十三]之数据结构顺序表(operand types are error: no match for “operator==“)

    C语言/C++常见习题问答集锦[八十三]之数据结构顺序表{operand types are error: no match for "operator=="} 程序之美 前言 主 ...

  6. 数据结构--顺序表的使用

    数据结构--顺序表的使 #include<iostream> #include<cstdio> #include<cstring> using namespace ...

  7. Educoder头歌数据结构顺序表及其应用

    头歌实践平台答案educoder 数据结构-顺序表及其应用 第1关:顺序表的实现之查找功能 /***************************************************** ...

  8. 数据结构——顺序表的合并

    数据结构--顺序表的合并 具体要求:写一个函数,其函数的功能是将非递增顺序表LA和LB合并到非递增顺序表LC中 数据结构-顺序表的操作之合并顺序表 一.顺序表的结构 首先要定义的是顺序表的结构体,只有 ...

  9. 数据结构顺序表的查找_数据结构1|顺序表+链表

    数据结构学习笔记1 进度:静态分配顺序表+单链表 参考资料:b站 王道考研+小甲鱼 < 判断一个算法的效率时,函数中的常数和其他次要项常常可以忽略,而更应该关注最高项目.的阶数. 推导大O阶方法 ...

最新文章

  1. 上传功能(前后端代码)
  2. generate报错 make_如何安装opencv_contrib及解决其安装编译问题
  3. java 非递归求二叉树高度_非递归算法实现二叉树高度
  4. 基于 Blazor 开发五子棋小游戏
  5. 如何通过图片识别用的什么字体?
  6. 拓端tecdat|【视频】R语言中的隐马尔可夫HMM模型实例
  7. Blender快捷键设置
  8. java导出繁体字word_利用简繁体字转换功能实现简体字文档转换为繁体字文档的方法...
  9. 东北大学计算机学院领导,计算机学院召开新一届全体干部大会
  10. python 语音交互_Python调用WIN10语音交互+识别+控制+自定义对话
  11. python画学习曲线_Python在同一个figu上用scikitlearn绘制几个学习曲线
  12. 为什么ASIC的频率可以达到GHz,而FPGA只能达到几百MHz?
  13. 2014cad运行要计算机内,win7系统2014cad出现致命错误的解决方法
  14. 不需要手机号就能注册的免费邮箱,这5个就够啦!
  15. MSN多开,MSN多帐号登陆
  16. RabbitMQ:什么是消息队列MQ?为什么使用消息队列MQ?入门MQ先学哪种?(一)
  17. lr0文法分析表示例_一个简单实例的LR分析过程
  18. 切图iOS和android区别,用sketch也要画iOS和android两套吗|Sketch如何用一套设计稿做iOS和Android两个版本 - PS下...
  19. 操作系统 | 关于进程、线程、用户线程、内核线程
  20. hadoop数仓建设之离线数据开发

热门文章

  1. 【Latex】在图片标题中加入脚注
  2. 爱创课堂每日一题第五十六天-对前端界面工程师这个职位是怎么样理解的?它的前景会怎么样?...
  3. 安装Ubuntu16.04视频播放器smplayer
  4. 数组的reduce的妙用之处
  5. dijkstra标号法表格_Dijkstra算法详细讲解
  6. 关于Spark的部署yarn模式
  7. Superset系列8- 制作饼图
  8. [OpenHarmony RK3568](四)WIFI芯片适配
  9. 二阶边值问题的数值解matlab,《二阶常微分方程边值问题的数值解法》-毕业论文.doc...
  10. 2020-09-04 CD40193十六进制加减Multisim仿真