数据结构与算法

1.线性表

  1. // 线性表的顺序存储结构
  2. // 静态分配
  3. #include <stdio.h>
  4. /* 存储空间初始分配量 */
  5. #define MAXSIZE 10
  6. typedef struct {
  7. int data[MAXSIZE];
  8. int length;
  9. } SqList;
  10. // 初始化
  11. void InitList(SqList &L) {
  12. for (int i=0; i<MAXSIZE; i++) {
  13. L.data[i] = 0;
  14. }
  15. L.length = MAXSIZE;
  16. }
  17. // 插入元素
  18. bool ListInsert(SqList &L, int i, int e) {
  19. if (i<1 || i>L.length+1)
  20. {
  21. return false;
  22. }
  23. if (L.length > MAXSIZE)
  24. {
  25. return false;
  26. }
  27. for (int j = L.length; j >= i; j--) {
  28. L.data[j] = L.data[j-1]; // 将第i个元素及其以后的元素后移
  29. }
  30. L.data[i-1] = e;
  31. L.length++;
  32. return true;
  33. }
  34. // 删除元素
  35. bool ListDelete(SqList &L, int i, int &e) {
  36. if (i<1 || i>L.length)
  37. {
  38. return false;
  39. }
  40. e = L.data[i-1]; // 被删除的元素赋值给e
  41. for (int j = i; j <= L.length; j++)
  42. {
  43. L.data[j-1] = L.data[j]; // 将第i个位置以及以后前移
  44. }
  45. L.length++;
  46. return true;
  47. }
  48. void printList(SqList &l) {
  49. for (int i = 0; i < l.length; i++)
  50. {
  51. printf("list:%d,%d\n", i, l.data[i]);
  52. }
  53. printf("length=%d\n", l.length);
  54. }
  55. int main(int argc, char const *argv[]) {
  56. SqList l;
  57. InitList(l);
  58. printList(l);
  59. ListInsert(l, 1, 1);
  60. printList(l);
  61. ListInsert(l, 2, 2);
  62. printList(l);
  63. int e = -1;
  64. if (ListDelete(l, 1, e)) {
  65. printf("删除第1个元素成功,值为%d\n", e);
  66. printList(l);
  67. } else {
  68. printf("删除失败\n");
  69. }
  70. return 0;
  71. }
  1. // 顺序表的动态分配
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. #define InitSize 10
  5. typedef struct {
  6. int *data; // 动态分配数组的指针
  7. int MaxSize; // 最大容量
  8. int length; // 当前长度
  9. } SqList;
  10. // 初始化
  11. void initList(SqList &l) {
  12. // 用malloc申请连续内存,data表示首地址
  13. l.data = (int *)malloc(InitSize*sizeof(int));
  14. l.length = 0;
  15. l.MaxSize = InitSize;
  16. }
  17. // 动态增加数组长度
  18. void increaseSize(SqList &l, int len) {
  19. int *p = l.data;
  20. l.data = (int *)malloc((l.MaxSize+len)*sizeof(int));
  21. for (int i = 0; i < l.length; i++) {
  22. l.data[i] = p[i]; // 将数据复制到新区域
  23. }
  24. l.MaxSize = l.MaxSize + len;
  25. free(p);
  26. }
  27. int main(int argc, char const *argv[])
  28. {
  29. SqList l;
  30. initList(l);
  31. increaseSize(l, 5);
  32. return 0;
  33. }
  1. // 带头结点的单链表
  2. #include <stdlib.h>
  3. typedef int ElemType;
  4. typedef struct LNode
  5. {
  6. ElemType data;
  7. struct LNode *next;
  8. } LNode, *LinkList;
  9. // 初始化
  10. bool InitList(LinkList &l) {
  11. l = (LNode *)malloc(sizeof(LNode)); // 分配一个头结点
  12. if (l == NULL)
  13. {
  14. return false;
  15. }
  16. l->next = NULL;
  17. return true;
  18. }
  19. bool isEmpty(LinkList &l) {
  20. if (l->next == NULL)
  21. {
  22. return true;
  23. }
  24. return false;
  25. }
  1. // 双向链表
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. typedef int ElemType;
  5. typedef struct DNode {
  6. ElemType data;
  7. struct DNode *prior, *next;
  8. } DNode, *DLinkList;
  9. // 初始化
  10. bool InitDLinkList(DLinkList &l) {
  11. l = (DNode *)malloc(sizeof(DNode)); // 分配头节点
  12. if (l == NULL)
  13. {
  14. return false;
  15. }
  16. l->prior = NULL;
  17. l->next = NULL;
  18. return true;
  19. }
  20. // 在p节点后插入s节点
  21. bool InsertNextDNode(DNode *p, DNode *s) {
  22. if (p == NULL || s == NULL)
  23. {
  24. return false;
  25. }
  26. s->next = p->next; // 将p的后继节点设置为s的后继节点
  27. if (p->next != NULL) // 如果p有后继节点
  28. {
  29. // 将p的后继节点的上一个设置为s
  30. p->next->prior = s;
  31. }
  32. s->prior = p;
  33. p->next = s;
  34. }
  35. // 删除p节点的后继节点
  36. bool DeleteNextDNode(DNode *p) {
  37. if (p == NULL) {
  38. return false;
  39. }
  40. DNode *q = p->next;
  41. if (q == NULL)
  42. {
  43. return false;
  44. }
  45. p->next = q->next;
  46. if (q->next != NULL)
  47. {
  48. q->next->prior = p;
  49. }
  50. free(q);
  51. return true;
  52. }
  53. int main(int argc, char const *argv[])
  54. {
  55. DLinkList l;
  56. bool ret = InitDLinkList(l);
  57. if (ret)
  58. {
  59. printf("初始化成功\n");
  60. } else
  61. {
  62. printf("初始化失败\n");
  63. }
  64. return 0;
  65. }

2.栈

  1. // 栈(数组实现)
  2. #include <stdio.h>
  3. #define MaxSize 10
  4. typedef struct {
  5. int data[MaxSize];
  6. int top;
  7. } SqStack;
  8. // 初始化
  9. void InitStack(SqStack &s) {
  10. s.top = -1;
  11. }
  12. bool IsEmpty(SqStack &s) {
  13. if (s.top == -1)
  14. {
  15. return true;
  16. }
  17. return false;
  18. }
  19. // 入栈
  20. bool push(SqStack &s, int &x) {
  21. // 栈已满
  22. if (s.top == MaxSize - 1)
  23. {
  24. return false;
  25. }
  26. s.top++;
  27. s.data[s.top] = x;
  28. return true;
  29. }
  30. // 出栈
  31. bool pop(SqStack &s) {
  32. if (s.top == -1)
  33. {
  34. return false;
  35. }
  36. int x = s.data[s.top];
  37. printf("pop stack, value=%d\n", x);
  38. s.top--;
  39. return true;
  40. }
  41. int main(int argc, char const *argv[])
  42. {
  43. SqStack stack;
  44. InitStack(stack);
  45. int x = 1;
  46. push(stack, x);
  47. pop(stack);
  48. return 0;
  49. }
  1. /*
  2. * 检查括号是否成对出现,且没有交叉
  3. */
  4. #include <stdio.h>
  5. #include <stdlib.h>
  6. #include <string.h>
  7. #define MaxSize 10
  8. // 定义栈
  9. typedef struct {
  10. char data[MaxSize];
  11. int top;
  12. } SqStack;
  13. // 初始化
  14. void initStack(SqStack &s) {
  15. s.top = -1;
  16. }
  17. // 是否空
  18. bool isEmpty(SqStack &s) {
  19. if (s.top == -1)
  20. {
  21. return true;
  22. }
  23. return false;
  24. }
  25. // 入栈
  26. bool push(SqStack &s, char x) {
  27. if (s.top == MaxSize-1) {
  28. return false;
  29. }
  30. s.top++;
  31. s.data[s.top] = x;
  32. return true;
  33. }
  34. // 出栈,用x返回
  35. bool pop(SqStack &s, char &x) {
  36. if (s.top == -1)
  37. {
  38. return false;
  39. }
  40. x = s.data[s.top];
  41. s.top--;
  42. return true;
  43. }
  44. bool bracketCheck(char str[]) {
  45. SqStack s;
  46. initStack(s);
  47. int length = strlen(str);
  48. printf("str length is %d\n", length);
  49. for (int i = 0; i < length; i++)
  50. {
  51. if (str[i] == '(' || str[i] == '[' || str[i] == '{') {
  52. push(s, str[i]); // 左括号则入栈
  53. } else {
  54. // 右括号检查,如果栈空,则失败
  55. if (isEmpty(s))
  56. return false;
  57. char topElem;
  58. pop(s, topElem); // 栈顶元素出栈
  59. if (str[i] == ')' && topElem != '(') {
  60. return false;
  61. }
  62. if (str[i] == ']' && topElem != '[') {
  63. return false;
  64. }
  65. if (str[i] == '}' && topElem != '{') {
  66. return false;
  67. }
  68. }
  69. }
  70. return isEmpty(s);
  71. }
  72. int main(int argc, char const *argv[])
  73. {
  74. char ss[] = "([])[";
  75. bool ret = bracketCheck(ss);
  76. if (ret) {
  77. printf("检查成功");
  78. } else {
  79. printf("检查失败");
  80. }
  81. return 0;
  82. }