1定义:由零个或多个数据元素组成的有限序列,强调是有限的。

  1. ADT 抽象数据类型名
  2. Data
  3. 数据元素之间逻辑关系的定义
  4. Operation
  5. 操作
  6. endADT

2.线性表的抽象数据类型定义

  1. Data
  2. 线性表的数据对象集合为{a1,a2,…,an},每个元素的类型均为DataType。其中,除第一个元素a1外,
  3. 每一个元素有且只有一个直接前驱元素,除了最后一个元素an外,每一个元素有且只有一个直接后继元素。
  4. 数据元素之间的关系是一对一的关系。
  5. Operation
  6. InitList(*L): 初始化操作,建立一个空的线性表L
  7. ListEmpty(L): 判断线性表是否为空表,若线性表为空,返回true,否则返回false
  8. ClearList(*L): 将线性表清空。
  9. GetElem(L,i,*e): 将线性表L中的第i个位置元素值返回给e
  10. LocateElem(L,e): 在线性表L中查找与给定值e相等的元素,如果查找成功,返回该元素在表中序号表示成功;否则,返回0表示失败。
  11. ListInsert(*L,i,e): 在线性表L中第i个位置插入新元素e
  12. ListDelete(*L,i,*e): 删除线性表L中第i个位置元素,并用e返回其值。
  13. ListLength(L): 返回线性表L的元素个数。
  14. endADT

3代码

  1. #include<stdlib.h>
  2. #include<stdio.h>
  3. #include<iostream>
  4. using namespace std;
  5. #define InitSize 10 //定义最大长度
  6. //静态分配
  7. //typedef struct {
  8. // int data[InitList];
  9. // int length;
  10. //}SqlList;
  11. //动态分配
  12. typedef struct {
  13. int *data;
  14. int length; //当前长度
  15. int MaxSize;//最大长度
  16. }SqlList;
  17. //初始化顺序表
  18. void InitList(SqlList &L) {
  19. L.data = (int *)malloc(InitSize * sizeof(int));
  20. L.length = 0;
  21. L.MaxSize = InitSize;
  22. }
  23. //增加顺序表的长度
  24. void IncreaseSize(SqlList &L, int len) {
  25. int* p = L.data;
  26. L.data = (int*)malloc((L.MaxSize + len) * sizeof(int));
  27. for (int i = 0; i < L.length; i++) {
  28. L.data[i] = p[i];
  29. }
  30. L.MaxSize += len;
  31. free(p);
  32. }
  33. //插入元素,在位序i的位置插入元素e
  34. bool ListInsert(SqlList& L, int i, int e) {
  35. if (i<1 || i>L.length + 1) return false; //i的范围是否有效
  36. if (L.length >= L.MaxSize) return false; //当前存储空间已满,不能插入
  37. for (int j = L.length; j >= i; j--) {
  38. L.data[j] = L.data[j - 1];
  39. }
  40. L.data[i - 1] = e;
  41. L.length++;
  42. return true;
  43. }
  44. //删除操作,删除位序i个位置上的元素,e是删除的元素
  45. bool ListDelete(SqlList& L, int i, int& e) {
  46. if (i<1 || i>L.length) return false;
  47. e = L.data[i - 1];
  48. for (int j = i; j < L.length; j++) {
  49. L.data[j-1] = L.data[j];
  50. }
  51. L.length--;
  52. return true;
  53. }
  54. //按位查找 返回位序i的元素
  55. int GetElem(SqlList L, int i) {
  56. if (i<1 || i>L.length) return -1;
  57. return L.data[i - 1];
  58. }
  59. //查找第一个元素值等于e的元素,并返回其位序
  60. int LocateElem(SqlList L, int e) {
  61. for (int i = 0; i < L.length; i++) {
  62. if (L.data[i] == e) return i + 1;
  63. }
  64. return -1;
  65. }
  66. //删除值位于s和t之间的数
  67. bool Delete_s_t(SqlList& L, int s, int t) {
  68. if (L.length == 0 || s >= t) return false;
  69. int k = 0;
  70. for (int i = 0; i < L.length; i++) {
  71. if (L.data[i]<s || L.data[i]>t) {
  72. L.data[k++] = L.data[i];
  73. }
  74. }
  75. L.length = k;
  76. return true;
  77. }
  78. int main() {
  79. SqlList L;
  80. InitList(L);
  81. ListInsert(L, 1, 1);
  82. ListInsert(L, 2, 6);
  83. ListInsert(L, 3, 3);
  84. ListInsert(L, 4, 8);
  85. ListInsert(L, 5, 2);
  86. for (int i = 0; i < L.length; i++) {
  87. cout << L.data[i] << " ";
  88. }
  89. cout << endl;
  90. Delete_s_t(L, 2, 3);
  91. for (int i = 0; i < L.length; i++) {
  92. cout << L.data[i] << " ";
  93. }
  94. cout << endl;
  95. return 0;
  96. }