线性表

顺序存储

链式存储

  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef int ElemType;
  5. typedef int Position;
  6. typedef struct LNode {
  7. ElemType data;
  8. struct LNode* next;
  9. } LNode, * LinkList;
  10. void PrintList(LinkList L);
  11. LinkList CreatListHead(LinkList L); // 头插法
  12. LinkList CreatListTail(LinkList L); // 尾插法
  13. LinkList GetElem(LinkList L, Position i); // 按位置查找
  14. LinkList LocateElem(LinkList L, ElemType e);
  15. bool ListFrontInsert(LinkList L, Position i, ElemType e);
  16. bool ListDelete(LinkList L, Position i);
  17. int main()
  18. {
  19. LinkList L = NULL;
  20. L = CreatListTail(L);
  21. PrintList(L);
  22. //LNode* search;
  23. //search = GetElem(L, 100);
  24. //if (search != NULL)
  25. //{
  26. // printf("按序号查找成功!\n");
  27. // printf("%d\n", search->data);
  28. //}
  29. //search = LocateElem(L, 88);
  30. //if (search != NULL)
  31. //{
  32. // printf("按值查找成功!\n");
  33. // printf("%d\n", search->data);
  34. //}
  35. ListDelete(L, 2);
  36. PrintList(L);
  37. return 0;
  38. }
  39. // ========================函数区=========================
  40. void PrintList(LinkList L)
  41. {
  42. L = L->next; // 因为统一要求带头结点,所以此处可以放心大胆的使用L->next。
  43. while (L)
  44. {
  45. printf("%d ", L->data);
  46. L = L->next;
  47. }
  48. printf("\n");
  49. }
  50. // 头插法
  51. LinkList CreatListHead(LinkList L)
  52. {
  53. L = (LinkList)malloc(sizeof(LNode)); //
  54. L->next = NULL; // 如果是空表,确保没有安全隐患
  55. LNode* p;
  56. ElemType input;
  57. scanf("%d", &input);
  58. while (input != 9999) {
  59. p = (LNode*)malloc(sizeof(LNode));
  60. p->data = input;
  61. p->next = L->next;
  62. L->next = p;
  63. scanf("%d", &input);
  64. }
  65. return L;
  66. }
  67. // 尾插法
  68. LinkList CreatListTail(LinkList L)
  69. {
  70. L = (LinkList)malloc(sizeof(LNode));
  71. LinkList s, r = L; // r表示链表表尾结点
  72. ElemType input;
  73. scanf("%d", &input);
  74. while (input!=9999)
  75. {
  76. s = (LinkList)malloc(sizeof(LNode));
  77. s->data = input;
  78. r->next = s;
  79. r = s;
  80. scanf("%d", &input);
  81. }
  82. r->next = NULL; // 尾结点的next指针赋值为NULL
  83. return L;
  84. }
  85. LinkList GetElem(LinkList L, Position i)
  86. {
  87. if (i == 0)
  88. return L;
  89. else if (i < 1)
  90. return NULL;
  91. LinkList p = L->next;
  92. int j = 1;
  93. while (p && j < i)
  94. {
  95. p = p->next;
  96. ++j;
  97. }
  98. return p;
  99. }
  100. LinkList LocateElem(LinkList L, ElemType e)
  101. {
  102. LinkList p = L->next;
  103. while (p && p->data != e)
  104. p = p->next;
  105. return p;
  106. }
  107. bool ListFrontInsert(LinkList L, Position i, ElemType e)
  108. {
  109. LinkList p = GetElem(L, i - 1); // 拿到第i-1个元素的指针
  110. if (!p)
  111. return false;
  112. LinkList s = (LinkList)malloc(sizeof(LNode));
  113. s->data = e;
  114. s->next = p->next;
  115. p->next = s;
  116. return true;
  117. }
  118. bool ListDelete(LinkList L, Position i)
  119. {
  120. LinkList p = GetElem(L, i - 1);
  121. if (!p)
  122. return false;
  123. LinkList q = p->next;
  124. p->next = q->next;
  125. free(q);
  126. q = NULL; // 为了避免野指针
  127. return true;
  128. }

顺序栈

  1. #include <stdio.h>
  2. #define MaxSize 50
  3. typedef int ElemType;
  4. typedef struct {
  5. ElemType data[MaxSize];
  6. int top;
  7. } SqStack;
  8. void InitStack(SqStack& S);
  9. bool IsEmpty(SqStack S);
  10. bool IsFull(SqStack S);
  11. bool Push(SqStack& S, ElemType x);
  12. bool Pop(SqStack& S, ElemType& x);
  13. bool GetTop(SqStack S, ElemType& x);
  14. int main()
  15. {
  16. SqStack S;
  17. bool flag;
  18. InitStack(S);
  19. flag = IsEmpty(S);
  20. ElemType ele;
  21. if (flag) {
  22. printf("栈是空的.\n");
  23. }
  24. Push(S, 3);
  25. Push(S, 4);
  26. Push(S, 5);
  27. flag = GetTop(S, ele);
  28. if (flag)
  29. printf("栈顶元素:%d\n", ele);
  30. flag = Pop(S, ele);
  31. if (flag)
  32. printf("弹出元素:%d\n", ele);
  33. return 0;
  34. }
  35. // =========================函数区=======================
  36. void InitStack(SqStack &S)
  37. {
  38. S.top = -1;
  39. }
  40. bool IsEmpty(SqStack S)
  41. {
  42. return -1 == S.top;
  43. }
  44. bool IsFull(SqStack S)
  45. {
  46. return MaxSize - 1 == S.top;
  47. }
  48. bool Push(SqStack& S, ElemType x)
  49. {
  50. if (IsFull(S))
  51. return false;
  52. else {
  53. S.data[++S.top] = x;
  54. return true;
  55. }
  56. }
  57. bool Pop(SqStack& S, ElemType& x)
  58. {
  59. if (IsEmpty(S))
  60. return false;
  61. else {
  62. x = S.data[S.top--];
  63. return true;
  64. }
  65. }
  66. bool GetTop(SqStack S, ElemType& x)
  67. {
  68. if (IsEmpty(S))
  69. return false;
  70. else {
  71. x = S.data[S.top];
  72. return true;
  73. }
  74. }

链栈(不重要)

一句话:头部插入,头部删除

  1. typedef struct LinkNode {
  2. ElemType data;
  3. struct LinkNode* next;
  4. }* LinkStack;

队列

顺序存储:循环队列

链式存储