这是我的第一篇博客(内容为废话)

现在马上面临毕业的我,发现整理总结问题真的非常重要,刚刚开始学习数据结构,并且非科班出身的我,感觉得到压力非常大,所以开始学习完后在这进行回忆,复习学习。在这里要感谢传智播客的讲师传智扫地僧的课程。刚开始,肯定会有很多不好的地方,慢慢改变积少成多。特别喜欢一句话叫,十年饮冰,难凉热血。

什么是线性表?

首先说一说我理解的线性表,顾名思义,线性表就是用线串起来的表格呗,其实差不多一个意思,线性表就是零个或多个数据元素的有限序列,首先它是一个序列,也就是说,元素之间是有顺序的,必须是一个连着一个,不可能是一个连着好几个,其次他应该是有限个数的。其实计算机处理中所有的都是有限个数的,我们所说的无限的只存在与数学中。

数据结构之线性表顺序存储

线性表的顺序存储结构,指的就是用一段地址连续的存储单元依次储存线性表的数据元素。

废话不多说,直接上代码吧:

#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语言实现)—— 线性表顺序存储设计与实现相关推荐

  1. 数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码

    数据结构严蔚敏C语言版-线性表顺序存储结构(顺序表)C语言实现相关代码 1.运行环境 2.准备工作 1)项目构建 1>新建一个SeqList项目 2>新建两个文件Sources和Heade ...

  2. 构建线性表的c语言代码,数据结构严蔚敏C语言版—线性表顺序存储结构(顺序表)C语言实现相关代码...

    1.运行环境 这里说明一下这里所有的C语言代码都是基于code::blocks 20.03编译运行的.当然一些其他集成开发环境应该也是可以的,个人不太喜欢功能太过强大的IDE,因为那同样意味着相关设置 ...

  3. c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解

    <数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...

  4. C语言丨线性表(二):线性链表(单链表)

    线性表是由数据类型相同的个数据元素组成的有限序列,通常记为: 其中n为表长,n=0时称为空表:下标i表示数据元素的位序. 线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素"一个接 ...

  5. 数据结构(四) -- C语言版 -- 线性表的链式存储 - 循环链表

    文章目录 零.读前说明 一.循环链表的概述 二.循环链表的模型 2.1.包含头节点模型 2.2.不包含头节点模型 三.工程结构及简单测试案例 3.1.测试工程的目录结构 3.2.循环链表示例源码 3. ...

  6. 数据结构(C语言)——线性表(定义,基本操作)

    数据结构(C语言)--线性表(定义,基本操作) 一. 线性表的定义 二.线性表的基本操作 什么时候要传入引用"==&=="----对参数的修改结果需要"==带回来 ...

  7. C语言丨线性表(四):循环链表

    线性表是由数据类型相同的个数据元素组成的有限序列,通常记为: 其中n为表长,n=0时称为空表:下标i表示数据元素的位序. 线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素"一个接 ...

  8. 数据结构与算法基础02:线性表

    目录 1. 线性表抽象数据类型 1.1 概述 1.2 抽象数据类型 2. 线性表的顺序表示和实现 2.1 概述 2.1.1 存储方式 2.1.2 逻辑关系表示 2.1.3 操作特性 2.2 实现 2. ...

  9. c语言建立线性表(顺序储存,链式储存,循环,双向)全

    c语言建立线性表 顺序储存 储存结构 初始化(建立)顺序表 查找操作 一.按值查找,找到返回对应的下标 二.按照下标返回元素 插入操作 一.在线性表尾部添加元素 二.在位置i处插入元素 三.顺序表(有 ...

最新文章

  1. NUnit在VS2008中的安装使用
  2. 前Citrix CTO认为虚拟化将解决现有的安全问题
  3. python 多态 知乎_Python函数接口的一些设计心得
  4. MATLAB实用知识,如何对函数的输入进行检查和解析?
  5. C语言中的位域的使用
  6. 【HDU - 1968】【UVA - 12096】The SetStack Computer (模拟,集合求交集并集操作,STL实现)
  7. python stdin和stdout_无法使用Python写入和读取stdin / stdout
  8. vue项目本地服务器调用豆瓣接口,vue调用豆瓣API加载图片403问题
  9. 系统指定的路径不存在,怎么办
  10. 动态规划之挖金矿(背包问题)
  11. 苹果手机无线网显示无网络连接到服务器,iPhone提示:“无线局域网似乎未接入互联网”,咋回事?...
  12. java网络编程--IP与InetAddress
  13. iOS 扫描二维码/条形码
  14. 这下,大学生日子难过了!
  15. OSChina 周日乱弹 ——你除了顺从,还有别的办法么?
  16. 关于FPGA极速交易的一点小总结(安湖科技版本)
  17. 【数学】复数的物理意义是什么?
  18. JAVA抽象求圆、矩形、正方形周长及面积
  19. hdu-2201 熊猫阿波的故事
  20. 【数学】张宇概率论九讲笔记

热门文章

  1. mock数据(自己写的数据)
  2. frpc启动失败总结
  3. 使用glup启动nodejs项目
  4. fail to load driver class oracle.jdbc.driver.OracleDriver in eitherofHIkariConfig class loader
  5. WiFi常见业务下的大小包情况分析
  6. 深入学习jquery源码之ajaxSetup()
  7. Golang pprof 性能分析与火焰图
  8. html在线encode,HttpServerUtility
  9. 【lrzsz】Linux上lrzsz的安装和使用
  10. 慧数汽车纵览:“一口价”新零售购车成趋势