线性表

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #define TRUE 1
  4. #define FALSE 0
  5. #define OK 1
  6. #define ERROR 0
  7. #define INFEASIBLE -1
  8. #define OVERFLOW -2
  9. #define LIST_INIT_SIZE 100 // 线性表存储空间的初始分配量
  10. #define LISTINCREMENT 10 // 线性表存储空间的分配增量
  11. typedef int Status;
  12. typedef int ElemType;
  13. typedef struct
  14. {
  15. ElemType *elem; // 存储空间基址
  16. int length; // 当前长度
  17. int listsize; // 当前分配的存储容量(以sizeof(ElemType)为单位)
  18. }SqList;
  19. Status InitList_Sq(SqList *L);
  20. Status ListInsert_Sq(SqList *L, int i, ElemType *e);
  21. int main()
  22. {
  23. SqList sl;
  24. if(InitList_Sq(&sl) == 1)
  25. {
  26. printf("创建成功!");
  27. int i = 0;
  28. int newElem1 = 33;
  29. int newElem2 = 25;
  30. int newElem3 = 11;
  31. int newElem4 = 43;
  32. i = ListInsert_Sq(&sl, 1, &newElem1);
  33. if(i == 1)
  34. {
  35. printf("%d ", *(sl.elem));
  36. printf("插入成功!");
  37. }
  38. else
  39. {
  40. printf("插入失败!");
  41. }
  42. i = ListInsert_Sq(&sl, 2, &newElem2);
  43. if(i == 1)
  44. {
  45. printf("%d ", *(sl.elem + 1));
  46. printf("插入成功!");
  47. }
  48. else
  49. {
  50. printf("插入失败!");
  51. }
  52. i = ListInsert_Sq(&sl, 1, &newElem3);
  53. if(i == 1)
  54. {
  55. printf("%d ", *(sl.elem));
  56. printf("插入成功!");
  57. }
  58. else
  59. {
  60. printf("插入失败!");
  61. }
  62. i = ListInsert_Sq(&sl, 2, &newElem4);
  63. if(i == 1)
  64. {
  65. printf("%d ", *(sl.elem + 1));
  66. printf("插入成功!");
  67. }
  68. else
  69. {
  70. printf("插入失败!");
  71. }
  72. }
  73. else
  74. {
  75. printf("创建失败!");
  76. }
  77. return 0;
  78. }
  79. Status InitList_Sq(SqList *L)
  80. {
  81. L->elem = (ElemType *)malloc(LIST_INIT_SIZE * sizeof(ElemType));
  82. if(!L->elem) exit(OVERFLOW); // 存储分配失败
  83. L->length = 0; // 空表长度为0
  84. L->listsize = LIST_INIT_SIZE; // 初始存储容量
  85. return OK;
  86. }// InitList_Sq
  87. Status ListInsert_Sq(SqList *L, int i, ElemType *e)
  88. {
  89. // 在顺序线性表L中第i个位置之前插入新的元素e,
  90. // i的合法值为 1 <= i <= ListLength_Sq(L) + 1
  91. ElemType *q = NULL, *p = NULL;
  92. if(i < 1 || i > L->length + 1) return ERROR; // i值不合法
  93. if(L->length == 0) // 如果是第一个插入元素,则在首地址插入
  94. {
  95. *(L->elem) = *e; // 插入e
  96. ++L->length; // 表长增1
  97. return OK;
  98. }
  99. else
  100. {
  101. if(L->length >= L->listsize) // 当前存储空间已满,增加分配
  102. {
  103. ElemType *newbase = (ElemType *)realloc(L->elem, (L->listsize + LISTINCREMENT) * sizeof(ElemType));
  104. if(!newbase) exit(OVERFLOW); // 存储分配失败
  105. L->elem = newbase; // 新基址
  106. L->listsize += LISTINCREMENT; // 增加存储容量
  107. }
  108. //*q = &(L->elem[i-1]); // q为插入位置
  109. q = L->elem + (i - 1); // q为插入位置
  110. for(p = L->elem + (L->length - 1); p >= q; --p) // 插入位置及之后的元素右移
  111. {
  112. *(p + 1) = *p;
  113. }
  114. *q = *e; // 插入e
  115. ++L->length; // 表长增1
  116. return OK;
  117. }
  118. }// ListInsert_Sq





附件列表

    原文地址:https://www.cnblogs.com/sober-reflection/p/48002483e118c6b58bef4bce9d650601.html