PS:在学习数据结构之前,我相信很多博友也都学习过一些语言,比如说java,c语言,c++,web等,我们之前用的一些方法大都是封装好的,就java而言,里面使用了大量的封装好的方法,一些算法也大都写好了,java还有三个特性,封装、继承、多态。当然这里不是讲Java,这里主要是说内部结构,大家都知道数据结构有些东西是分为逻辑结构和物理结构的,物理结构有分为顺序结构和链式结构,有不懂得可以百度百科,这里主要是分享线性表的顺序结构。那么什么是线性表呢,线性表是最基本、最简单、也是最常用的一种数据结构。线性表(linear list)是数据结构的一种,一个线性表是n个具有相同特性的数据元素的有限序列。

线性表

  • 顺序表
  • 链式表

1:顺序表分析

  •   结构体创建
  •   初始化顺序表
  •   插入操作
  •   删除操作
  •   查找操作
  •   修改操作

由于顺序表比较简单,这里解释都在代码中,在外就不在赘述。

1-1:结构体的创建

  1. #define ElemType int
  2. #define MAXSIZE 100 //定义变量不需要分号。
  3. //创建线性表
  4. typedef struct {
  5. ElemType elem[MAXSIZE];
  6. int length; //长度
  7. } SqList;

1-2:初始化顺序表

  1. int InitList(SqList &L) {
  2. // 初始化表,一个空表。
  3. L.length = ;
  4. return ;
  5. }

1-3:操作方法

  1. /**
  2. * @descibe 插入元素
  3. * @param L 线性表
  4. * @param pos 所在位置(并非角标)
  5. * @param data 插入元素
  6. * */
  7. int ListInsert(SqList &L, int pos, ElemType data) {
  8. if (pos < || pos > L.length + ) {
  9. printf("插入的不合法");
  10. return -;
  11. }
  12. int i;
  13. //在插入的同时,i要保证在pos以及pos后方,入1,2,3,4,5当在第3个插入时,须把原有的第三个数据以及以后数据后移一位,空出第三个位置。
  14. for (i = L.length; i >= pos; i--) {
  15. L.elem[i] = L.elem[i - ];
  16. }
  17. L.elem[pos - ] = data;
  18. L.length++;
  19. return ;//
  20. }
  21. /**
  22. * 线性表中删除操作
  23. * @param L 线性表
  24. * @param pos 所在位置(并非角标)
  25. * @param data 插入元素
  26. * */
  27. int ListDelete(SqList &L, int pos, int data) {
  28. if (pos < || pos > L.length) {
  29. printf("删除角标不合法");
  30. return -;
  31. }
  32. if (!(L.elem[pos - ] == data)) {
  33. printf("没有这个数字");
  34. return -;
  35. }
  36. int i;
  37. //在插入的同时,i要保证在pos以及pos后方,入1,2,3,4,5当在第3个插入时,须把原有的第三个数据以及以后数据后移一位,空出第三个位置。
  38. for (i = pos; i <= L.length; i++) {
  39. L.elem[i - ] = L.elem[i];
  40. }
  41. L.length--;
  42. return ;//返回0表示成功;
  43. }
  44. //查找数据
  45. int queryList(SqList L, int e) {
  46. //如果小于1证明没有数据,则直接返回。
  47. if (L.length < ) {
  48. printf("表中没有数据");
  49. return -;
  50. }
  51. for (int i = ; i < L.length; i++) {
  52. if (L.elem[i] == e) {
  53. printf("找到该数据:%d角标为:%d \n", L.elem[i], i);
  54. }
  55. }
  56. return ;
  57. }
  58.  
  59. //修改数据
  60. int xiugai(SqList &L, int pos, int e) {
  61. if (pos < || pos > L.length) {
  62. printf("修改角标不合法");
  63. return -;
  64. }
  65. L.elem[pos - ] = e;
  66. return ;
  67.  
  68. }
  69. //打印全部数据
  70. void PrintF(SqList L) {
  71. printf("打印表中所有元素\n");
  72. int i;
  73. for (i = ; i < L.length; i++) {
  74. printf("%d\n", L.elem[i]);
  75. }
  76. }

综上所述:线性表和之前的数组类似,很容易理解。在使用的过程记得声明一下方法(函数);

2:链表分析

  •   结构体创建
  •   初始化顺序表
  •   插入操作
  •   删除操作
  •   查找操作
  •   修改操作

需要注意的是这里的结构体需要一个指针,前一个结点的指针指向下一个结点,依次类推,最后一个指针指向NULL;

2-1:结构体创建

  1. /**
  2. * @describe 创建一个结构体
  3. * SLink *next指针;
  4. * *SLinkListL 创建一个结构体指针
  5. * */
  6. typedef struct SLink {
  7. int data;
  8. struct SLink *next;
  9. } SLink, *SLinkListL;

2-2:初始化链表

  1. /**
  2. * @describe 初始化链表
  3. * */
  4. SLinkListL initLinkL() {
  5. //1:分配一个空间
  6. SLinkListL sLinkListL = (SLinkListL) malloc(sizeof(SLink));
  7. //2:判断是否创建成功
  8. if (!sLinkListL) {
  9. exit(-);
  10. }
  11. sLinkListL->next = NULL;
  12. printf("初始化单链表成功\n");
  13. return sLinkListL;
  14. }

2-3:操作--增删该查

这里需要注意的是修改这个操作,找p的时候要找到要修改的p,而不是前一个结点,比如说,咱们在第二个位置插入的时候要找到第一个位置作为p,二修改的时候就要找到第二个位置,也就是说pos传值的时候不用减一。

  1. /**
  2. * @describe 插入操作
  3. *
  4. * @param L 链表类型
  5. * @param pos 插入位置
  6. * @param e 插入元素
  7. * */
  8. int insertLinkL(SLinkListL &L, int pos, int e) {
  9. SLinkListL p = L;
  10. //判断是否符合链表的长度;
  11. int i = ;
  12. //判断长度,寻找要插入的位置(前一位);
  13. while (p && i < pos-) {
  14. p = p->next;
  15. i++;
  16. }
  17. //判断长度是否超过pos
  18. if (!p || i > pos-) {
  19. return ;
  20. }
  21. //为新元素创建结点(分配空间)
  22. SLinkListL s = (SLinkListL) malloc(sizeof(SLink));
  23. s->data = e;
  24. s->next = p->next;
  25. p->next = s;
  26. return ;
  27. }
  28.  
  29. /**
  30. * @describe 删除操作
  31. * @param L 链表类型
  32. * @param pos 删除位置
  33. * @param e 删除存放元素
  34. * */
  35. int deleteLinkL(SLinkListL &L, int pos, int *e) {
  36. SLinkListL p = L;
  37. //1:判断位置
  38. int i = ;
  39. while (p && i < pos-) {
  40. p = p->next;
  41. i++;
  42. }
  43. if (!p || i > pos-) {
  44. printf("删除位置不合法\n");
  45. return -;
  46. }
  47. //定义一个空的变量,用于存放p的指针,入a1,a2,a3,如果要删除a2,则p指向a1,此时,把a1的next先交给s(暂存,此时代表a2(因为a1的指针是指向a2)),然后用s去取下一个指针(next)就是a3,
  48. SLinkListL s;//s为了释放掉删除元素的空间
  49. s = p->next;
  50. p->next = s->next;
  51. *e = s->data;//暂存
  52. free(s);
  53. printf("删除成功\n");
  54. return ;
  55. }
  56.  
  57. /**
  58. * @describe 查找操作
  59. * @param L:链表类型
  60. * @param e:e查找元素
  61. * */
  62. int queryLinkL(SLinkListL L, int e) {
  63. printf("查找元素为:%d",e);
  64. SLinkListL p = L;
  65. int i = ;
  66. while (p) {
  67. p = p->next;
  68. if (p->data == e) {
  69. printf("找到元素%d\n", i);
  70. return ;
  71. }
  72. i++;
  73. }
  74. printf("下标不合法/没有找到该数据");
  75. return -;
  76. }
  77.  
  78. /**
  79. * @describe 修改操作
  80. * @param L:链表类型
  81. * @param i:修改元素的位置
  82. * @param e:修改元素值
  83. * */
  84. int updataLinkL(SLinkListL &L, int pos, int e) {
  85. printf("修改数据为第:%d 个,值为:%d\n",pos,e);
  86. SLinkListL p = L;
  87. int i = ;
  88. while (p && i < pos) {
  89. p = p->next;
  90. i++;
  91. }
  92. if (!p || i > pos) {
  93. printf("修改失败--原因:修改的下标越界\n");
  94. return -;
  95. }
  96. p->data = e;
  97. printf("修改成功\n");
  98. return ;
  99. }
  100.  
  101. void printLL(SLinkListL L) {
  102. printf("打印全部数据\n");
  103. SLinkListL p = L->next;
  104. while (p) {
  105. printf("%d ", p->data);
  106. p = p->next;
  107. }
  108. printf("\n");
  109. }

综上所述:只多了一个指针,一开始看估计还有有看不懂的地方,按照顺序把代码粘贴到你编辑器上,运行起来慢慢看。

数据结构----线性表顺序和链式结构的使用(c)的更多相关文章

  1. [置顶] ※数据结构※→☆线性表结构(queue)☆============优先队列 链式存储结构(queue priority list)(十二)

    优先队列(priority queue) 普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有 ...

  2. C语言 线性表 双向链式结构 实现

    一个双向链式结构实现的线性表 duList (GCC编译). /** * @brief 线性表双向链表结构 * @author wid * @date 2013-10-28 * * @note 若代码 ...

  3. C# 数据结构 线性表(顺序表 链表 IList 数组)

    线性表 线性表是最简单.最基本.最常用的数据结构.数据元素 1 对 1的关系,这种关系是位置关系. 特点 (1)第一个元素和最后一个元素前后是没有数据元素,线性表中剩下的元素是近邻的,前后都有元素. ...

  4. C#实现数据结构——线性表(下)

    线性表链式存储结构 看了线性表的顺序存储,你肯定想线性表简是挺简单,但是我一开始怎么会知道有多少人排队?要分配多大的数组?而且插入和删除一个元素也太麻烦了,所有元素都要前移/后移,效率又低. 那怎么办 ...

  5. C#实现数据结构——线性表(上)

    什么是线性表 数据结构中最常用也最简单的应该就是线性表,它是一种线性结构(废话,不是线性结构怎么会叫线性表?当然不是废话,古人公孙龙就说白马非马,现代生物学家也说鲸鱼不是鱼). 那什么是线性结构? 按 ...

  6. [数据结构-线性表1.2] 链表与 LinkedList<T>(.NET 源码学习)

    [数据结构-线性表1.2] 链表与 LinkedList<T> [注:本篇文章源码内容较少,分析度较浅,请酌情选择阅读] 关键词:链表(数据结构)    C#中的链表(源码)    可空类 ...

  7. [从今天开始修炼数据结构]线性表及其实现以及实现有Itertor的ArrayList和LinkedList

    一.线性表 1,什么是线性表 线性表就是零个或多个数据元素的有限序列.线性表中的每个元素只能有零个或一个前驱元素,零个或一个后继元素.在较复杂的线性表中,一个数据元素可以由若干个数据项组成.比如牵手排 ...

  8. 线性表——顺序表的实现与讲解(C++描述)

    线性表 引言 新生安排体检,为了 便管理与统一数据,学校特地规定了排队的方式,即按照学号排队,谁在前谁在后,这都是规定好的,所以谁在谁不在,都是非常方便统计的,同学们就像被一条线(学号)联系起来了,这 ...

  9. C语言 严蔚敏数据结构 线性表之链表实现

    博主最近在考成都大学皇家计算机科学与技术专业,复习专业课数据结构,正好学习到线性结构中的线性表用链表这种存储结构来实现. 首先,数据结构包括1.数据的操作2.逻辑结构3.存储结构(数据结构三要素. 直 ...

随机推荐

  1. NOI Linux学习

    打开终端: cd (目录名)//进入该目录的终端 cd ..//退出该目录,返回上一层. 修改用户名 密码: 修改密码: passwd//直接修改root密码 passwd (用户名)//修改该用户的 ...

  2. 封装通用的xhr对象(兼容各个版本)

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  3. python - 斐波那契(Fibonacci)数列

    斐波那契数列即数列中每一项等于它前面两项的和,公式如下: f(n) = f(n-1) + f(n-2)    n>2        -----        递推公式 f(n) = 1     ...

  4. 我的Python升级打怪之路【二】:Python的基本数据类型及操作

    基本数据类型 1.数字 int(整型) 在32位机器上,整数的位数是32位,取值范围是-2**31~2--31-1 在64位系统上,整数的位数是64位,取值范围是-2**63~2**63-1 clas ...

  5. Orcale 之子查询

    子查询和连接查询一样,都提供了使用单个查询访问多个表中的数据的方法.子查询在其他查询的基础上,提供一种进一步有效的方式来访问数据. IN 关键字 使用 IN 关键字可以将原表中特定的的值与子查询中返回 ...

  6. 完美解决ExtJs6上传中文文件名乱码,后端SpringMVC

    ExtJs上传中文文件名乱码,观察请求. ExtJs6上传乱码从后台无法解决,因为文件名请求里面就已经乱码了,后台无法解码. 除非请求参数正确没有乱码,后台因为编码设置不一样,可以通过后台处理乱码 这 ...

  7. xcode配置文件中,Architectures表示的意义

    xcode配置文件中,Architectures表示的意义 ======================== Architecture : 指你想支持的指令集. Valid architectures ...

  8. OOP_由C到C++

    由C到C++ OOP第一课 C语言的局限 C++的特点 C++的程序特征 C++程序的结构特性 C++程序的编辑.编译和运行 ⭐C++对C的补充 C语言的局限 类型检查机制相对较弱,使得程序中的一些错 ...

  9. sublime text 3 3143注册码

    1.点击help->enter license: —– BEGIN LICENSE —– TwitterInc 200 User License EA7E-890007 1D77F72E 390 ...

  10. ServiceHelper

    public class ServiceHelper { private static string _baseUrl = $@"http://{Config.Instance.MesSer ...