当前位置:   article > 正文

数据结构一:顺序表(C/C++实现)_数据结构顺序表的插入c++

数据结构顺序表的插入c++

目录

代码实现(C):

代码实现(C++):

结果展示:

总结:


顺序表是线性表的一种

分为静态顺序表和动态顺序表

代码实现(C):

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define MAXSIZE 20
  4. typedef int ElemType;
  5. typedef struct { //静态顺序表
  6. ElemType data[MAXSIZE];
  7. int lenth;
  8. }SqList;
  9. //初始化静态顺序表,长度不可变
  10. void InitSqList(SqList* L)
  11. {
  12. L->lenth = 6;//设定初始顺序表有6个数据
  13. for (int i = 0; i < L->lenth; i++) {
  14. L->data[i] = i + 1;
  15. }
  16. }
  17. //输出顺序表
  18. void PrintList(SqList L)
  19. {
  20. for (int i = 0; i < L.lenth; i++) {
  21. printf("data[%d]:%d ", i, L.data[i]);
  22. }
  23. printf("\n");
  24. }
  25. //顺序表第i个位置插入元素e
  26. int SqListInsert(SqList* L, int i, ElemType e)
  27. {
  28. if (i < 1 || i > L->lenth + 1) return 0; //超出范围不能插入
  29. if (L->lenth >= MAXSIZE) return 0; //表满不能插入
  30. for (int j = L->lenth; j >= i; j--) {
  31. L->data[j] = L->data[j - 1]; //第i个位置之后的元素后移
  32. }
  33. L->data[i - 1] = e;
  34. L->lenth++;
  35. return 1;
  36. }
  37. //删除第i个元素,并返回删除的元素e
  38. int SqListDelete(SqList* L, int i, ElemType* e)
  39. {
  40. if (i < 1 || i > L->lenth) return 0; //超出范围不能删除
  41. if (L->lenth == 0) return 0; //表空不能删除
  42. *e = L->data[i - 1];
  43. for (int j = i; j < L->lenth; j++) {
  44. L->data[j - 1] = L->data[j];//第i个位置之后的元素前移
  45. }
  46. L->lenth--;
  47. return 1;
  48. }
  49. //按值查找元素,并返回位序
  50. int SqListLocateItem(SqList L, ElemType e)
  51. {
  52. for (int i = 0; i < L.lenth; i++) {
  53. if (L.data[i] == e)
  54. return i + 1;
  55. }
  56. return -1; //查找失败
  57. }
  58. int main()
  59. {
  60. SqList L1, L2;
  61. int e, temp;
  62. /*******************************插入、删除、查找成功***************************/
  63. printf("插入、删除、查找成功测试:\n");
  64. InitSqList(&L1);
  65. printf("初始化顺序表成功!原顺序表为:\n");
  66. PrintList(L1);
  67. if (SqListInsert(&L1, 3, 100)) {//第3个位置插入100
  68. printf("在第3个位置插入100成功!新顺序表为:\n");
  69. PrintList(L1);
  70. }
  71. else {
  72. printf("在第3个位置插入100失败!\n");
  73. }
  74. if (SqListDelete(&L1, 5, &e)) {//删除第5个位置的数据,并输出删除数据
  75. printf("删除第5个位置的元素成功!删除的元素为:%d,新顺序表为:\n",e);
  76. PrintList(L1);
  77. }
  78. else {
  79. printf("删除第5个位置的元素失败!\n");
  80. }
  81. temp = SqListLocateItem(L1, 6);
  82. if (temp != -1) {//查找6,并返回位序
  83. printf("查找元素“6”成功!位序为:%d\n", temp);
  84. }
  85. else {
  86. printf("查找失败!\n");
  87. }
  88. /****************************************************************************/
  89. /*******************************插入、删除、查找失败***************************/
  90. printf("\n插入、删除、查找失败测试:\n");
  91. InitSqList(&L2);
  92. printf("初始化顺序表成功!原顺序表为:\n");
  93. PrintList(L2);
  94. if (SqListInsert(&L2, 9, 999)) {//第9个位置插入999
  95. printf("在第9个位置插入999成功!新顺序表为:\n");
  96. PrintList(L2);
  97. }
  98. else {
  99. printf("在第9个位置插入999失败!\n");
  100. }
  101. if (SqListDelete(&L2, 8, &e)) {//删除第8个位置的数据,并输出删除数据
  102. printf("删除第8个位置的元素成功!删除的元素为:%d,新顺序表为:\n", e);
  103. PrintList(L2);
  104. }
  105. else {
  106. printf("删除第8个位置的元素失败!\n");
  107. }
  108. temp = SqListLocateItem(L2, 123);
  109. if (temp != -1) {//查找123,并返回位序
  110. printf("查找元素“123”成功!位序为:%d", temp);
  111. }
  112. else {
  113. printf("查找元素“123”失败!\n");
  114. }
  115. /****************************************************************************/
  116. system("pause");
  117. return 0;
  118. }
  119. /*
  120. typedef struct { //动态顺序表
  121. ElemType* data;
  122. int lenth;
  123. int data_maxsize;
  124. }D_SqList;
  125. //初始化动态顺序表,长度可变
  126. int InitDynamicSqList(D_SqList* L)
  127. {
  128. L->data_maxsize = 20; //设定表长为20
  129. L->data = (ElemType*)malloc(sizeof(ElemType) * L->data_maxsize); //分配内存空间
  130. if (L->data == NULL) return 0;
  131. for (int i = 0; i < 6; i++) {
  132. L->data[i] = i + 1; //设定初始顺序表有6个数据
  133. L->lenth++;
  134. }
  135. return 1;
  136. }
  137. int IncreaseSize(D_SqList* L, int len) //增加动态顺序表长度
  138. {
  139. ElemType* p = L->data; //保存原数据指针
  140. L->data = (ElemType*)malloc(sizeof(ElemType) * (L->data_maxsize + len));//新的内存数据空间
  141. if (L->data == NULL) return 0;
  142. for (int i = 0; i < L->lenth; i++) {
  143. L->data[i] = p[i]; //复制原数据
  144. }
  145. L->data_maxsize = L->data_maxsize + len; //增加表长
  146. free(p); //释放原数据空间
  147. p = NULL;
  148. return 1;
  149. }
  150. //动态顺序表与静态顺序表只有内存分配上的区别,增删查改操作基本一致
  151. */

代码实现(C++):

  1. #include <iostream>
  2. #define MAXSIZE 20
  3. typedef int ElemType;
  4. typedef struct { //静态顺序表
  5. ElemType data[MAXSIZE];
  6. int lenth;
  7. }SqList;
  8. //初始化静态顺序表,长度不可变
  9. void InitSqList(SqList& L)
  10. {
  11. L.lenth = 6; //设定初始顺序表有6个数据
  12. for (int i = 0; i < L.lenth; i++) {
  13. L.data[i] = i + 1;
  14. }
  15. }
  16. //输出顺序表
  17. void PrintList(SqList L)
  18. {
  19. for (int i = 0; i < L.lenth; i++) {
  20. std::cout << "data[" << i << "]:" << L.data[i] << " ";
  21. }
  22. std::cout << std::endl;
  23. }
  24. //顺序表第i个位置插入元素e
  25. bool SqListInsert(SqList& L, int i, ElemType e)
  26. {
  27. if (i < 1 || i > L.lenth + 1) return false; //超出范围不能插入
  28. if (L.lenth >= MAXSIZE) return false; //表满不能插入
  29. for (int j = L.lenth; j >= i; j--) {
  30. L.data[j] = L.data[j - 1]; //第i个位置之后的元素后移
  31. }
  32. L.data[i - 1] = e;
  33. L.lenth++;
  34. return true;
  35. }
  36. //删除第i个元素,并返回删除的元素e
  37. bool SqListDelete(SqList& L, int i, ElemType& e)
  38. {
  39. if (i < 1 || i > L.lenth) return false; //超出范围不能删除
  40. if (L.lenth == 0) return false; //表空不能删除
  41. e = L.data[i - 1];
  42. for (int j = i; j < L.lenth; j++) {
  43. L.data[j - 1] = L.data[j];//第i个位置之后的元素前移
  44. }
  45. L.lenth--;
  46. return true;
  47. }
  48. //按值查找元素,并返回位序
  49. int SqListLocateItem(SqList L, ElemType e)
  50. {
  51. for (int i = 0; i < L.lenth; i++) {
  52. if (L.data[i] == e)
  53. return i + 1;
  54. }
  55. return -1; //查找失败
  56. }
  57. int main()
  58. {
  59. SqList L1, L2;
  60. int e, temp;
  61. /*******************************插入、删除、查找成功***************************/
  62. printf("插入、删除、查找成功测试:\n");
  63. InitSqList(L1);
  64. printf("初始化顺序表成功!原顺序表为:\n");
  65. PrintList(L1);
  66. if (SqListInsert(L1, 3, 100)) {//第3个位置插入100
  67. printf("在第3个位置插入100成功!新顺序表为:\n");
  68. PrintList(L1);
  69. }
  70. else {
  71. printf("在第3个位置插入100失败!\n");
  72. }
  73. if (SqListDelete(L1, 5, e)) {//删除第5个位置的数据,并输出删除数据
  74. printf("删除第5个位置的元素成功!删除的元素为:%d,新顺序表为:\n",e);
  75. PrintList(L1);
  76. }
  77. else {
  78. printf("删除第5个位置的元素失败!\n");
  79. }
  80. temp = SqListLocateItem(L1, 6);
  81. if (temp != -1) {//查找6,并返回位序
  82. printf("查找元素“6”成功!位序为:%d\n", temp);
  83. }
  84. else {
  85. printf("查找失败!\n");
  86. }
  87. /****************************************************************************/
  88. /*******************************插入、删除、查找失败***************************/
  89. printf("\n插入、删除、查找失败测试:\n");
  90. InitSqList(L2);
  91. printf("初始化顺序表成功!原顺序表为:\n");
  92. PrintList(L2);
  93. if (SqListInsert(L2, 9, 999)) {//第9个位置插入999
  94. printf("在第9个位置插入999成功!新顺序表为:\n");
  95. PrintList(L2);
  96. }
  97. else {
  98. printf("在第9个位置插入999失败!\n");
  99. }
  100. if (SqListDelete(L2, 8, e)) {//删除第8个位置的数据,并输出删除数据
  101. printf("删除第8个位置的元素成功!删除的元素为:%d,新顺序表为:\n", e);
  102. PrintList(L2);
  103. }
  104. else {
  105. printf("删除第8个位置的元素失败!\n");
  106. }
  107. temp = SqListLocateItem(L2, 123);
  108. if (temp != -1) {//查找123,并返回位序
  109. printf("查找元素“123”成功!位序为:%d", temp);
  110. }
  111. else {
  112. printf("查找元素“123”失败!\n");
  113. }
  114. /****************************************************************************/
  115. system("pause");
  116. return 0;
  117. }
  118. /*
  119. typedef struct { //动态顺序表
  120. ElemType* data;
  121. int lenth;
  122. int data_maxsize;
  123. }D_SqList;
  124. //初始化动态顺序表,长度可变
  125. bool InitDynamicSqList(D_SqList& L)
  126. {
  127. L.data_maxsize = 20; //设定表长为20
  128. L.data = (ElemType*)malloc(sizeof(ElemType) * L.data_maxsize); //分配内存空间
  129. if (L.data == NULL) return false;
  130. for (int i = 0; i < 6; i++) {
  131. L.data[i] = i + 1; //设定初始顺序表有6个数据
  132. L.lenth++;
  133. }
  134. return true;
  135. }
  136. bool IncreaseSize(D_SqList& L, int len) //增加动态顺序表长度
  137. {
  138. ElemType* p = L.data; //保存原数据指针
  139. L.data = (ElemType*)malloc(sizeof(ElemType) * (L.data_maxsize + len));//新的内存数据空间
  140. if (L.data == NULL) return 0;
  141. for (int i = 0; i < L.lenth; i++) {
  142. L.data[i] = p[i]; //复制原数据
  143. }
  144. L.data_maxsize = L.data_maxsize + len; //增加表长
  145. free(p); //释放原数据空间
  146. p = NULL;
  147. return true;
  148. }
  149. //动态顺序表与静态顺序表只有内存分配上的区别,增删查改操作基本一致
  150. */

结果展示:

总结:

总体来说C++的引用与布尔值更好操作一些,特别是在后面链表修改指针的时候,引用更方便,也更安全;但是C的指针也不赖,在链表修改指针的时也可以使用二级指针来操作。

以上

以上均为个人学习心得,如有错误,请不吝赐教~

THE END

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家自动化/article/detail/595003
推荐阅读
相关标签
  

闽ICP备14008679号