当前位置:   article > 正文

数据结构 | 顺序线性表_l->curnum-1

l->curnum-1

一、数据结构定义

  1. typedef int SqlTableType;
  2. typedef struct seqTable{
  3. int MAXNUM; // 最大元素个数
  4. int curNum; // 元素的个数
  5. SqlTableType* element; // 连续空间的起始地址
  6. }*SqlTable;

二、方法概览

  1. SqlTable CreateSqlTable(int max); // 创建空顺序表
  2. int IsSqlListFull(SqlTable L); // 判断顺序线性表是否已满
  3. int InsertSqlTable_P(SqlTable L, int p, SqlTableType x); // 在下标p插入元素x
  4. int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x); // 在下标p的前面插入元素x
  5. int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x); // 在下标p的后面插入元素x
  6. int FindElement(SqlTable L, SqlTableType x); // 查找元素x首次出现的位置
  7. SqlTableType FindPostion(SqlTable L, int pos); // 查找位置pos处的元素
  8. int DeletePostion(SqlTable L, int pos); // 删除下标pos处的元素
  9. int DeleteElement(SqlTable L, SqlTableType x); // 删除x值相同的数据元素
  10. int DestroySqlTable(SqlTable L); // 销毁线性表
  11. void PrintSqlTable(SqlTable L); // 打印线性表

三、方法详解

  1. // 创建空顺序表,能存放的最大元素个数为max
  2. SqlTable CreateSqlTable(int max){
  3. SqlTable L = (SqlTable)malloc(sizeof(struct seqTable));
  4. if (L != NULL) {
  5. L->element = (SqlTableType*)malloc(sizeof(SqlTableType) * max);
  6. if (L->element) {
  7. L->MAXNUM = max;
  8. L->curNum = 0;
  9. return L;
  10. }
  11. else free(L);
  12. }
  13. return NULL;
  14. }
  15. // 判断顺序线性表是否已满
  16. // 若已满,返回值为1,否则返回值为0
  17. int IsSqlListFull(SqlTable L){
  18. return (L->curNum == L->MAXNUM);
  19. }
  20. // 在下标p插入元素x
  21. // 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  22. int InsertSqlTable_P(SqlTable L, int p, SqlTableType x){
  23. if (L->curNum >= L->MAXNUM) {
  24. printf("线性表已满");
  25. return 0;
  26. }
  27. if (p < 0) {
  28. printf("插入位置非法");
  29. return 0;
  30. }
  31. L->element[p] = x;
  32. L->curNum = L->curNum + 1;
  33. return 1;
  34. }
  35. // 在下标p的前面插入元素x
  36. // 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  37. int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x){
  38. if (L->curNum >= L->MAXNUM) {
  39. printf("线性表已满");
  40. return 0;
  41. }
  42. if (p <= 0 || p > L->curNum) {
  43. printf("插入位置非法");
  44. return 0;
  45. }
  46. for (int i = L->curNum - 1; i >= p - 1; i--)
  47. L->element[i + 1] = L->element[i];
  48. L->element[p - 1] = x;
  49. L->curNum = L->curNum + 1;
  50. return 1;
  51. }
  52. // 在下标p的后面插入元素x
  53. // 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  54. int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x) {
  55. if (L->curNum >= L->MAXNUM) {
  56. printf("线性表已满");
  57. return 0;
  58. }
  59. if (p < 0 || p >= L->curNum) {
  60. printf("插入位置非法");
  61. return 0;
  62. }
  63. for (int i = L->curNum - 1; i >= p + 1; i--)
  64. L->element[i + 1] = L->element[i];
  65. L->element[p + 1] = x;
  66. L->curNum = L->curNum + 1;
  67. return 1;
  68. }
  69. // 打印线性表
  70. void PrintSqlTable(SqlTable L) {
  71. for (int i = 0; i < L->curNum; i++)
  72. printf("%d ", L->element[i]);
  73. printf("\n");
  74. }
  75. // 查找元素x首次出现的位置
  76. // 若待销毁的线性表不存在,则返回0
  77. int FindElement(SqlTable L, SqlTableType x){
  78. for (int i = 0; i < L->curNum; i++) {
  79. if (L->element[i] == x) return i;
  80. }
  81. return -1;
  82. }
  83. // 查找位置pos处的元素
  84. // 若不存在给定值,则返回-1
  85. SqlTableType FindPostion(SqlTable L, int pos){
  86. if (pos<0 || pos>L->curNum) return L->element[0];
  87. else return L->element[pos];
  88. }
  89. // 删除下标pos处的元素
  90. // 若pos非法,则返回-1;否则返回1
  91. int DeletePostion(SqlTable L, int pos) {
  92. if (pos<0 || pos > L->curNum - 1) return -1;
  93. for (int i = pos; i < L->curNum - 1; i++)
  94. L->element[i] = L->element[i + 1];
  95. L->curNum = L->curNum - 1;
  96. return 1;
  97. }
  98. // 删除x值相同的数据元素
  99. // 返回删除数据元素的个数
  100. int DeleteElement(SqlTable L, SqlTableType x){
  101. int num = 0;
  102. for (int i = 0; i < L->curNum; i++){
  103. if (L->element[i] == x){
  104. DeletePostion(L, i);
  105. num++;
  106. }
  107. }
  108. return num;
  109. }
  110. // 销毁线性表
  111. // 返回销毁线性表元素的个数
  112. int DestroySqlTable(SqlTable L) {
  113. int num = L->curNum;
  114. free(L->element);
  115. free(L);
  116. return num;
  117. }

四、运行结果

        main方法代码如下:

  1. int main() {
  2. int max = 10;
  3. SqlTable table = CreateSqlTable(max);
  4. for (int i = 0; i < max; i++) {
  5. InsertSqlTable_P(table, i, i + 1);
  6. }
  7. PrintSqlTable(table);
  8. DeleteElement(table, 3);
  9. PrintSqlTable(table);
  10. DeletePostion(table, 3);
  11. PrintSqlTable(table);
  12. DestroySqlTable(table);
  13. }

       运行结果如下:

  五、源代码

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef int SqlTableType;
  5. typedef struct seqTable{
  6. int MAXNUM; // 最大元素个数
  7. int curNum; // 元素的个数
  8. SqlTableType* element; // 连续空间的起始地址
  9. }*SqlTable;
  10. SqlTable CreateSqlTable(int max); // 创建空顺序表
  11. int IsSqlListFull(SqlTable L); // 判断顺序线性表是否已满
  12. int InsertSqlTable_P(SqlTable L, int p, SqlTableType x); // 在下标p插入元素x
  13. int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x); // 在下标p的前面插入元素x
  14. int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x); // 在下标p的后面插入元素x
  15. int FindElement(SqlTable L, SqlTableType x); // 查找元素x首次出现的位置
  16. SqlTableType FindPostion(SqlTable L, int pos); // 查找位置pos处的元素
  17. int DeletePostion(SqlTable L, int pos); // 删除下标pos处的元素
  18. int DeleteElement(SqlTable L, SqlTableType x); // 删除x值相同的数据元素
  19. int DestroySqlTable(SqlTable L); // 销毁线性表
  20. void PrintSqlTable(SqlTable L); // 打印线性表
  21. // 创建空顺序表,能存放的最大元素个数为max
  22. SqlTable CreateSqlTable(int max){
  23. SqlTable L = (SqlTable)malloc(sizeof(struct seqTable));
  24. if (L != NULL) {
  25. L->element = (SqlTableType*)malloc(sizeof(SqlTableType) * max);
  26. if (L->element) {
  27. L->MAXNUM = max;
  28. L->curNum = 0;
  29. return L;
  30. }
  31. else free(L);
  32. }
  33. return NULL;
  34. }
  35. // 判断顺序线性表是否已满
  36. // 若已满,返回值为1,否则返回值为0
  37. int IsSqlListFull(SqlTable L){
  38. return (L->curNum == L->MAXNUM);
  39. }
  40. // 在下标p插入元素x
  41. // 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  42. int InsertSqlTable_P(SqlTable L, int p, SqlTableType x){
  43. if (L->curNum >= L->MAXNUM) {
  44. printf("线性表已满");
  45. return 0;
  46. }
  47. if (p < 0) {
  48. printf("插入位置非法");
  49. return 0;
  50. }
  51. L->element[p] = x;
  52. L->curNum = L->curNum + 1;
  53. return 1;
  54. }
  55. // 在下标p的前面插入元素x
  56. // 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  57. int InsertSqlTable_Pre(SqlTable L, int p, SqlTableType x){
  58. if (L->curNum >= L->MAXNUM) {
  59. printf("线性表已满");
  60. return 0;
  61. }
  62. if (p <= 0 || p > L->curNum) {
  63. printf("插入位置非法");
  64. return 0;
  65. }
  66. for (int i = L->curNum - 1; i >= p - 1; i--)
  67. L->element[i + 1] = L->element[i];
  68. L->element[p - 1] = x;
  69. L->curNum = L->curNum + 1;
  70. return 1;
  71. }
  72. // 在下标p的后面插入元素x
  73. // 若下标p非法或线性表已满无法插入数据,返回0;插入成功返回值为1
  74. int InsertSqlTable_Post(SqlTable L, int p, SqlTableType x) {
  75. if (L->curNum >= L->MAXNUM) {
  76. printf("线性表已满");
  77. return 0;
  78. }
  79. if (p < 0 || p >= L->curNum) {
  80. printf("插入位置非法");
  81. return 0;
  82. }
  83. for (int i = L->curNum - 1; i >= p + 1; i--)
  84. L->element[i + 1] = L->element[i];
  85. L->element[p + 1] = x;
  86. L->curNum = L->curNum + 1;
  87. return 1;
  88. }
  89. // 打印线性表
  90. void PrintSqlTable(SqlTable L) {
  91. for (int i = 0; i < L->curNum; i++)
  92. printf("%d ", L->element[i]);
  93. printf("\n");
  94. }
  95. // 查找元素x首次出现的位置
  96. // 若待销毁的线性表不存在,则返回0
  97. int FindElement(SqlTable L, SqlTableType x){
  98. for (int i = 0; i < L->curNum; i++) {
  99. if (L->element[i] == x) return i;
  100. }
  101. return -1;
  102. }
  103. // 查找位置pos处的元素
  104. // 若不存在给定值,则返回-1
  105. SqlTableType FindPostion(SqlTable L, int pos){
  106. if (pos<0 || pos>L->curNum) return L->element[0];
  107. else return L->element[pos];
  108. }
  109. // 删除下标pos处的元素
  110. // 若pos非法,则返回-1;否则返回1
  111. int DeletePostion(SqlTable L, int pos) {
  112. if (pos<0 || pos > L->curNum - 1) return -1;
  113. for (int i = pos; i < L->curNum - 1; i++)
  114. L->element[i] = L->element[i + 1];
  115. L->curNum = L->curNum - 1;
  116. return 1;
  117. }
  118. // 删除x值相同的数据元素
  119. // 返回删除数据元素的个数
  120. int DeleteElement(SqlTable L, SqlTableType x){
  121. int num = 0;
  122. for (int i = 0; i < L->curNum; i++){
  123. if (L->element[i] == x){
  124. DeletePostion(L, i);
  125. num++;
  126. }
  127. }
  128. return num;
  129. }
  130. // 销毁线性表
  131. // 返回销毁线性表元素的个数
  132. int DestroySqlTable(SqlTable L) {
  133. int num = L->curNum;
  134. free(L->element);
  135. free(L);
  136. return num;
  137. }
  138. int main() {
  139. int max = 10;
  140. SqlTable table = CreateSqlTable(max);
  141. for (int i = 0; i < max; i++) {
  142. InsertSqlTable_P(table, i, i + 1);
  143. }
  144. PrintSqlTable(table);
  145. DeleteElement(table, 3);
  146. PrintSqlTable(table);
  147. DeletePostion(table, 3);
  148. PrintSqlTable(table);
  149. DestroySqlTable(table);
  150. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/570002
推荐阅读
相关标签
  

闽ICP备14008679号