关于数据结构链表问题(C语言实现)—— 线性表顺序存储设计与实现
这是我的第一篇博客(内容为废话)
现在马上面临毕业的我,发现整理总结问题真的非常重要,刚刚开始学习数据结构,并且非科班出身的我,感觉得到压力非常大,所以开始学习完后在这进行回忆,复习学习。在这里要感谢传智播客的讲师传智扫地僧的课程。刚开始,肯定会有很多不好的地方,慢慢改变积少成多。特别喜欢一句话叫,十年饮冰,难凉热血。
什么是线性表?
首先说一说我理解的线性表,顾名思义,线性表就是用线串起来的表格呗,其实差不多一个意思,线性表就是零个或多个数据元素的有限序列,首先它是一个序列,也就是说,元素之间是有顺序的,必须是一个连着一个,不可能是一个连着好几个,其次他应该是有限个数的。其实计算机处理中所有的都是有限个数的,我们所说的无限的只存在与数学中。
数据结构之线性表顺序存储
线性表的顺序存储结构,指的就是用一段地址连续的存储单元依次储存线性表的数据元素。
废话不多说,直接上代码吧:
#ifndef __MY_SEQLIST_H__
#define __MY_SEQLIST_H__typedef void SeqList;
typedef void SeqListNode;SeqList* SeqList_Create(int capacity);void SeqList_Destroy(SeqList* list);void SeqList_Clear(SeqList* list);int SeqList_Length(SeqList* list);int SeqList_Capacity(SeqList* list);int SeqList_Insert(SeqList* list, SeqListNode* node, int pos);SeqListNode* SeqList_Get(SeqList* list, int pos);SeqListNode* SeqList_Delete(SeqList* list, int pos);#endif //__MY_SEQLIST_H__
上面代码为seqlist.h的头文件,需要完成的就对函数声明的实现,线性表顺序存储相当于一个在数组中存储数据,并且在内存中的顺序是连在一起的。要实现的功能为建立链表,摧毁链表,初始化链表(清空链表),求链表长度,求链表容量,在任意位置插入元素,得到任意位置元素,在任意位置删除元素。
功能实现
在功能实现之前因为存储到链表的数据类型不一样,所以要进行转换,要建立一个中间过程,我们用结构体来做,在结构体中嵌套一个一级指针。
typedef struct _tag_SeqList
{int length;int capacity;unsigned int** node;
}TSeqList;
1、建立链表
SeqList* SeqList_Create(int capacity)
{int ret = 0;TSeqList* tmp = NULL;tmp = (TSeqList*)malloc(sizeof(TSeqList));//进行错误检查,如果没有成功分配内存,则建立链表失败if(tmp == NULL){ret = -1;printf("func SeqList_Create err:%d\n",ret);return NULL;}memset(tmp,0,siezeof(TSeqList));//根据capacity分配空间tmp->node = (unsigned int **)malloc(sizeof(unsigned int*)*capacity);if(tmp->node == NULL){ret = -1;printf("func SeqList_Create err:malloc %d\n",ret);return NULL;}tmp->length = 0;tmp->capacity = capacity;return tmp;
}
2、摧毁链表
void SeqList_Destroy(SeqList* list)
{//摧毁链表,及将分配的内存回收TSeqList* tlist = NULL;if(tlist == NULL){return;}tlist = (TSeqList*)list;if(tlist->node != NULL){free(tlist->node);}free(tlist);}
3、清空链表
void SeqList_Clear(Seqlist* list)
{//清空链表,相当于初始化链表,将所有参数初始化为开始值TSeqList* tlsit = NULL;if(tlist == NULL){return;}tlist = (TSeqList*)list;tlist->length = 0;
}
4、返回链表长度
int SeqList_Length(SeqList* list)
{TSeqList* tlsit = NULL;if(tlist == NULL){return;}tlist = (TSeqList*)list;return tlist->length;
}
5、返回链表实际容量
在这里要特别说明,链表的长度和容量不是一个东西,链表长度表示链表的实际存储的长度,capacity表示链表的容量。
int SeqList_Capacity(SeqList* list)
{TSeqList* tlsit = NULL;if(tlist == NULL){return;}tlist = (TSeqList*)list;return tlist->capacity;
}
6、在链表任意位置插入元素
int SeqList_Insert(SeqList* list,SeqListNode* node,int pos)
{int ret = 0,i = 0;TSeqList* tlist = NULL;if(list == NULL || node == NUll ||pos<0){ret = -1;printf("func SeqList_Insert() err:%d \n",ret);return ret;}tlist = (TSeqList*)list;//判断插入元素后,链表是否会溢出if(tlist->length >= tlist->capacity){ret = -2;printf("func SeqList_Insert() err:%d \n",ret);return ret;}//容错修正,及插入的位置大于链表中数据的长度,在末尾插入元素if(pos >= tlist->length){pos = tlist->length;}//后移,插入新元素后,在插入位置后的元素要后移if(i = tlist->length;i>pos;i--){tlist->node[i] = tlist->node[i-1];}//插入元素tlist->node[pos] = node;tlist->length++;return 0;}
7、在链表任意位置得到元素
SeqListNode* SeqList_Get(SeqList* list,int pos)
{int i = 0,ret = 0;SeqListNode* tmp = 0;TSeqList* tlist = NULL;if(list == NULL || pos < 0){ret = -1;printf("func SeqList_Get() err:%d \n",ret);return NULL;}tlist = (SeqList*)list;tmp = (void*)tlist->node[pos];return tmp;}
8、在链表任意位置删除元素并返回删除的值
SeqListNode* SeqList_Del(SeqList* list,int pos)
{int i = 0,ret = 0;SeqListNode* tmp = 0;TSeqList* tlist = NULL;if(list == NULL || pos < 0){ret = -1;printf("func SeqList_Del() err:%d \n",ret);return NULL;}tlist = (SeqLisst*)list;tmp = (SeqListNode*)tlist->node[pos];for(i = pos+1;i < tlist->length;i++){tlist->node[i-1] = tlist->node[i];}tlist->length--;return tmp;
}
至此所有的功能全部实现。
线性表顺序存储的优缺点
优点:
1、无需为表示表中元素之间的逻辑关系而增加额外的存储空间
2、可以快速的存取表中任意位置的元素
缺点:
1、插入和删除操作需要移动大量元素
2、当线性表长度变化较大时,难以确定存储空间的容量
3、造成存储空间的“碎片”
关于数据结构链表问题(C语言实现)—— 线性表顺序存储设计与实现相关推荐
- 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码
数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...
- 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...
1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...
- c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解
<数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...
- C语言丨线性表(二):线性链表(单链表)
线性表是由数据类型相同的个数据元素组成的有限序列,通常记为: 其中n为表长,n=0时称为空表:下标i表示数据元素的位序. 线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素"一个接 ...
- 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表
文章目录 零.读前说明 一.循环链表的概述 二.循环链表的模型 2.1.包含头节点模型 2.2.不包含头节点模型 三.工程结构及简单测试案例 3.1.测试工程的目录结构 3.2.循环链表示例源码 3. ...
- 数据结构(C语言)——线性表(定义,基本操作)
数据结构(C语言)--线性表(定义,基本操作) 一. 线性表的定义 二.线性表的基本操作 什么时候要传入引用"==&=="----对参数的修改结果需要"==带回来 ...
- C语言丨线性表(四):循环链表
线性表是由数据类型相同的个数据元素组成的有限序列,通常记为: 其中n为表长,n=0时称为空表:下标i表示数据元素的位序. 线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素"一个接 ...
- 数据结构与算法基础02:线性表
目录 1. 线性表抽象数据类型 1.1 概述 1.2 抽象数据类型 2. 线性表的顺序表示和实现 2.1 概述 2.1.1 存储方式 2.1.2 逻辑关系表示 2.1.3 操作特性 2.2 实现 2. ...
- c语言建立线性表(顺序储存,链式储存,循环,双向)全
c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...
最新文章
- NUnit在VS2008中的安装使用
- 前Citrix CTO认为虚拟化将解决现有的安全问题
- python 多态 知乎_Python函数接口的一些设计心得
- MATLAB实用知识,如何对函数的输入进行检查和解析?
- C语言中的位域的使用
- 【HDU - 1968】【UVA - 12096】The SetStack Computer (模拟,集合求交集并集操作,STL实现)
- python stdin和stdout_无法使用Python写入和读取stdin / stdout
- vue项目本地服务器调用豆瓣接口,vue调用豆瓣API加载图片403问题
- 系统指定的路径不存在,怎么办
- 动态规划之挖金矿(背包问题)
- 苹果手机无线网显示无网络连接到服务器,iPhone提示:“无线局域网似乎未接入互联网”,咋回事?...
- java网络编程--IP与InetAddress
- iOS 扫描二维码/条形码
- 这下,大学生日子难过了!
- OSChina 周日乱弹 ——你除了顺从,还有别的办法么?
- 关于FPGA极速交易的一点小总结(安湖科技版本)
- 【数学】复数的物理意义是什么?
- JAVA抽象求圆、矩形、正方形周长及面积
- hdu-2201 熊猫阿波的故事
- 【数学】张宇概率论九讲笔记
热门文章
- mock数据(自己写的数据)
- frpc启动失败总结
- 使用glup启动nodejs项目
- fail to load driver class oracle.jdbc.driver.OracleDriver in eitherofHIkariConfig class loader
- WiFi常见业务下的大小包情况分析
- 深入学习jquery源码之ajaxSetup()
- Golang pprof 性能分析与火焰图
- html在线encode,HttpServerUtility
- 【lrzsz】Linux上lrzsz的安装和使用
- 慧数汽车纵览:“一口价”新零售购车成趋势