当前位置:   article > 正文

华清数据结构day5 24-7-22

华清数据结构day5 24-7-22

1>使用栈,完成进制转换输入:一个整数,进制数输出:该数的对应的进制数

seqstack.h

  1. #ifndef SEQSTACK_H
  2. #define SEQSTACK_H
  3. #define MAX 10
  4. #include"myhead.h"
  5. typedef int datatype;
  6. typedef struct
  7. {
  8. datatype *data;
  9. int top;
  10. }Stack,*StackPtr;
  11. //创建栈
  12. StackPtr stack_create();
  13. //判空
  14. int stack_empty(StackPtr S);
  15. //判满
  16. int stack_full(StackPtr S);
  17. //入栈
  18. void stack_push(StackPtr S, datatype e);
  19. //出栈
  20. void stack_pop(StackPtr S);
  21. //遍历栈
  22. void stack_show(StackPtr S);
  23. //获取栈顶元素
  24. datatype* stack_get_top(StackPtr S);
  25. //求栈的大小
  26. int stack_size(StackPtr S);
  27. //销毁栈
  28. void stack_destroy(StackPtr S);
  29. //进制转换
  30. void base_conversion(StackPtr S);
  31. #endif

seqstack.c

  1. #include"seqstack.h"
  2. StackPtr stack_create()
  3. {
  4. StackPtr S = (StackPtr)malloc(sizeof(Stack));
  5. if(NULL == S)
  6. {
  7. printf("创建失败\n");
  8. return NULL;
  9. }
  10. S->data = (datatype *)malloc(sizeof(datatype)*MAX);
  11. if(NULL == S->data)
  12. {
  13. printf("创建失败\n");
  14. return NULL;
  15. }
  16. memset(S->data,0,sizeof(datatype)*MAX);
  17. S->top = -1;
  18. return S;
  19. }
  20. int stack_empty(StackPtr S)
  21. {
  22. return S->top == -1;
  23. }
  24. int stack_full(StackPtr S)
  25. {
  26. return S->top == MAX-1;
  27. }
  28. void stack_push(StackPtr S,datatype e)
  29. {
  30. if(NULL == S||stack_full(S))
  31. {
  32. printf("入栈失败\n");
  33. return;
  34. }
  35. S->top++;
  36. S->data[S->top] = e;
  37. }
  38. void stack_pop(StackPtr S)
  39. {
  40. if(NULL == S||stack_empty(S))
  41. {
  42. printf("出栈失败\n");
  43. return;
  44. }
  45. S->top--;
  46. }
  47. void stack_show(StackPtr S)
  48. {
  49. if(NULL == S|| stack_empty(S))
  50. {
  51. printf("遍历失败\n");
  52. return;
  53. }
  54. for(int i = S->top;i>=0;i--)
  55. {
  56. printf("%c\t",S->data[i]+48);
  57. }
  58. printf("\n");
  59. }
  60. datatype* stack_get_top(StackPtr S)
  61. {
  62. if(NULL == S||stack_empty(S))
  63. {
  64. printf("操作失败\n");
  65. return NULL;
  66. }
  67. return &S->data[S->top];
  68. }
  69. int stack_size(StackPtr S)
  70. {
  71. if(NULL == S)
  72. {
  73. printf("操作失败\n");
  74. }
  75. return S->top+1;
  76. }
  77. void stack_destroy(StackPtr S)
  78. {
  79. if(S!=NULL)
  80. {
  81. free(S->data);
  82. free(S);
  83. S=NULL;
  84. }
  85. }
  86. void base_conversion(StackPtr S)
  87. {
  88. int num = 0,base = 0;
  89. printf("请输入一个数(10进制):");
  90. scanf("%d",&num);
  91. printf("请输入你想要将他转换成为的进制:");
  92. scanf("%d",&base);
  93. while(num)
  94. {
  95. if (num%base >9)
  96. {
  97. stack_push(S,num%base+7);
  98. }
  99. else
  100. {
  101. stack_push(S,num%base);
  102. }
  103. num=num/base;
  104. }
  105. stack_show(S);
  106. }

main.c

  1. #include"seqstack.h"
  2. #include<myhead.h>
  3. int main(int argc, const char *argv[])
  4. {
  5. StackPtr S = stack_create();
  6. if(NULL == S)
  7. {
  8. return -1;
  9. }
  10. base_conversion(S);
  11. //调用销毁函数
  12. stack_destroy(S);
  13. S = NULL;
  14. return 0;
  15. }

2> 将双向链表和循环链表自己实现一遍,至少要实现创建、增、删、改、查、销毁工作

双向链表

doublelinklist.h

  1. #ifndef DOUBLELINKLIST_H
  2. #define DOUBLELINKLIST_H
  3. #include"myhead.h"
  4. typedef char datatype;
  5. typedef struct Node
  6. {
  7. union
  8. {
  9. int len;
  10. datatype data;
  11. };
  12. struct Node *prio;
  13. struct Node *next;
  14. }Node,*NodePtr;
  15. NodePtr list_create();
  16. int list_empty(NodePtr L);
  17. NodePtr apply_node(datatype e);
  18. int list_insert_head(NodePtr L,datatype e);
  19. int list_show(NodePtr L);
  20. NodePtr list_search_pos(NodePtr L ,int pos);
  21. int list_delete_pos(NodePtr L,int pos);
  22. void list_destroy(NodePtr L);
  23. int list_update_pos(NodePtr L, int pos, datatype e);
  24. #endif

doublellinklist.c

  1. #include"doublelinklist.h"
  2. NodePtr list_create()
  3. {
  4. NodePtr L = (NodePtr)malloc(sizeof(Node));
  5. if(L == NULL)
  6. {
  7. printf("申请失败\n");
  8. return NULL;
  9. }
  10. L->len = 0;
  11. L->prio = NULL;
  12. L->next = NULL;
  13. printf("创建成功\n");
  14. return L;
  15. }
  16. int list_empty(NodePtr L)
  17. {
  18. return L->next == NULL;
  19. }
  20. NodePtr apply_node(datatype e)
  21. {
  22. NodePtr p = (NodePtr)malloc(sizeof(Node));
  23. if(NULL == p)
  24. {
  25. printf("节点申请失败\n");
  26. return NULL;
  27. }
  28. p->data = e;
  29. p->prio == NULL;
  30. p->next == NULL;
  31. return p;
  32. }
  33. int list_insert_head(NodePtr L,datatype e)
  34. {
  35. if(NULL == L)
  36. {
  37. printf("插入失败\n");
  38. }
  39. NodePtr p = apply_node(e);
  40. if(NULL == p)
  41. {
  42. return -1;
  43. }
  44. if(list_empty(L))
  45. {
  46. p->prio = L;
  47. L->next = p;
  48. }
  49. else
  50. {
  51. p->prio = L;
  52. p->next = L->next;
  53. L->next->prio = p;
  54. L->next = p;
  55. }
  56. L->len++;
  57. printf("插入成功\n");
  58. return 0;
  59. }
  60. int list_show(NodePtr L)
  61. {
  62. if(NULL == L||list_empty(L))
  63. {
  64. printf("遍历失败\n");
  65. return -1;
  66. }
  67. NodePtr q = L->next;
  68. while(q)
  69. {
  70. printf("%c\t",q->data);
  71. q=q->next;
  72. }
  73. printf("\n");
  74. return 0;
  75. }
  76. NodePtr list_search_pos(NodePtr L ,int pos)
  77. {
  78. if(NULL == L|| list_empty(L) ||pos<0 || pos>L->len)
  79. {
  80. printf("查找失败\n");
  81. return NULL;
  82. }
  83. NodePtr q = L;
  84. for(int i=0;i<pos;i++)
  85. {
  86. q=q->next;
  87. }
  88. return q;
  89. }
  90. int list_update_pos(NodePtr L, int pos, datatype e)
  91. {
  92. if (NULL == L || list_empty(L)|| pos<0||pos>L->len)
  93. {
  94. printf("修改失败\n");
  95. return -1;
  96. }
  97. NodePtr p = list_search_pos(L,pos);
  98. p->data = e;
  99. printf("修改成功\n");
  100. return 0;
  101. }
  102. int list_delete_pos(NodePtr L,int pos)
  103. {
  104. if(NULL == L|| list_empty(L) || pos<0||pos>L->len)
  105. {
  106. printf("删除失败\n");
  107. return -1;
  108. }
  109. NodePtr p = list_search_pos(L,pos);
  110. if(NULL == p->next)
  111. {
  112. p->prio->next = NULL;
  113. free(p);
  114. }
  115. else
  116. {
  117. p->prio->next = p->next;
  118. p->next->prio = p->prio;
  119. free(p);
  120. }
  121. L->len--;
  122. printf("删除成功\n");
  123. return 0;
  124. }
  125. void list_destroy(NodePtr L)
  126. {
  127. if(NULL == L)
  128. {
  129. printf("删除失败\n");
  130. return;
  131. }
  132. while(!list_empty(L))
  133. {
  134. list_delete_pos(L,1);
  135. }
  136. free(L);
  137. L=NULL;
  138. printf("链表释放成功\n");
  139. return;
  140. }

main.c

  1. #include"doublelinklist.h"
  2. int main(int argc, const char *argv[])
  3. {
  4. NodePtr L = list_create();
  5. if(NULL == L)
  6. {
  7. return -1;
  8. }
  9. list_insert_head(L,'Q');
  10. list_insert_head(L,'W');
  11. list_insert_head(L,'E');
  12. list_insert_head(L,'R');
  13. list_show(L);
  14. list_update_pos(L,2,'F');
  15. list_show(L);
  16. list_delete_pos(L,4);
  17. list_show(L);
  18. list_destroy(L);
  19. return 0;
  20. }

循环链表

looplinklist.h

  1. #ifndef LOOPLINKLIST_H
  2. #define LOOPLINKLIST_H
  3. #include"myhead.h"
  4. typedef char datatype;
  5. typedef struct Node
  6. {
  7. union
  8. {
  9. int len;
  10. datatype data;
  11. };
  12. struct Node *prio;
  13. struct Node *next;
  14. }Node,*NodePtr;
  15. //链表创建
  16. NodePtr list_create();
  17. //链表判空
  18. int list_empty(NodePtr L);
  19. //链表申请空间封装节点
  20. NodePtr apply_node(datatype e);
  21. //按位置查找
  22. NodePtr list_search_pos(NodePtr L ,int pos);
  23. //链表尾插
  24. int list_insert_tail(NodePtr L,datatype e);
  25. //链表输出
  26. int list_show(NodePtr L);
  27. //链表头删
  28. int list_delete_head(NodePtr L);
  29. //链表任意位置删除
  30. int list_delete_pos(NodePtr L, int pos);
  31. //链表按位置进行修改
  32. int list_update_pos(NodePtr L, int pos, datatype e);
  33. //链表销毁
  34. void list_destory(NodePtr L);
  35. #endif

looplinklist.c

  1. #include"looplinklist.h"
  2. //链表创建
  3. NodePtr list_create()
  4. {
  5. NodePtr L = (NodePtr)malloc(sizeof(Node));
  6. if(NULL == L)
  7. {
  8. printf("创建失败\n");
  9. return NULL;
  10. }
  11. L->len=0;
  12. L->next = L;
  13. printf("创建成功\n");
  14. return L;
  15. }
  16. //链表判空
  17. int list_empty(NodePtr L)
  18. {
  19. return L->next==L;
  20. }
  21. //链表申请空间封装节点
  22. NodePtr apply_node(datatype e)
  23. {
  24. NodePtr p = (NodePtr)malloc(sizeof(Node));
  25. if(NULL == p)
  26. {
  27. printf("创建失败\n");
  28. return NULL;
  29. }
  30. p->data = e;
  31. p->next = NULL;
  32. return p;
  33. }
  34. //按位置查找
  35. NodePtr list_search_pos(NodePtr L ,int pos)
  36. {
  37. if(NULL == L|| pos<0 ||pos>L->len)
  38. {
  39. printf("查找失败\n");
  40. return NULL;
  41. }
  42. NodePtr q = L;
  43. for(int i= 0;i<pos;i++)
  44. {
  45. q=q->next;
  46. }
  47. return q;
  48. }
  49. //链表尾插
  50. int list_insert_tail(NodePtr L,datatype e)
  51. {
  52. if(NULL == L)
  53. {
  54. printf("插入失败\n");
  55. return -1;
  56. }
  57. NodePtr q = list_search_pos(L,L->len);
  58. NodePtr p = apply_node(e);
  59. if(NULL == L)
  60. {
  61. return -1;
  62. }
  63. p->next = q->next;
  64. q->next = p;
  65. L->len++;
  66. printf("插入成功\n");
  67. return 0;
  68. }
  69. //链表输出
  70. int list_show(NodePtr L)
  71. {
  72. if(NULL== L||list_empty(L))
  73. {
  74. printf("遍历失败\n");
  75. return -1;
  76. }
  77. NodePtr q = L->next;
  78. while(q!=L)
  79. {
  80. printf("%c\t",q->data);
  81. q=q->next;
  82. }
  83. printf("\n");
  84. }
  85. //链表头删
  86. int list_delete_head(NodePtr L)
  87. {
  88. if(NULL==L || list_empty(L))
  89. {
  90. printf("删除失败\n");
  91. return -1;
  92. }
  93. NodePtr q = L->next;
  94. L->next = q->next;
  95. free(q);
  96. q=NULL;
  97. L->len--;
  98. printf("删除成功\n");
  99. }
  100. //链表销毁
  101. void list_destory(NodePtr L)
  102. {
  103. if(NULL == L)
  104. {
  105. printf("释放失败\n");
  106. return;
  107. }
  108. while(!list_empty(L))
  109. {
  110. list_delete_head(L);
  111. }
  112. free(L);
  113. L = NULL;
  114. printf("销毁成功\n");
  115. }
  116. //链表任意位置删除
  117. int list_delete_pos(NodePtr L, int pos)
  118. {
  119. if (NULL == L||pos<0 ||pos>L->len||list_empty(L))
  120. {
  121. printf("删除失败\n");
  122. return -1;
  123. }
  124. NodePtr p = list_search_pos(L,pos-1);
  125. NodePtr q = p->next;
  126. p->next = q->next;
  127. free(q);
  128. q=NULL;
  129. printf("删除成功\n");
  130. L->len--;
  131. return 0;
  132. }
  133. //链表按位置进行修改
  134. int list_update_pos(NodePtr L, int pos, datatype e)
  135. {
  136. if (NULL == L||pos<0 ||pos>L->len||list_empty(L))
  137. {
  138. printf("修改失败\n");
  139. return -1;
  140. }
  141. NodePtr p = list_search_pos(L,pos);
  142. p->data = e;
  143. printf("修改成功\n");
  144. return 0;
  145. }

main.c

  1. #include"looplinklist.h"
  2. #include<myhead.h>
  3. int main(int argc, const char *argv[])
  4. {
  5. NodePtr L = list_create();
  6. if(NULL == L)
  7. {
  8. return -1;
  9. }
  10. list_insert_tail(L,'Q');
  11. list_insert_tail(L,'W');
  12. list_insert_tail(L,'E');
  13. list_insert_tail(L,'R');
  14. list_insert_tail(L,'T');
  15. list_show(L);
  16. list_update_pos(L,2,'P');
  17. list_show(L);
  18. list_delete_pos(L,3);
  19. list_show(L);
  20. list_destory(L);
  21. L=NULL;
  22. return 0;
  23. }

3> 使用循环链表完成约瑟夫环问题

looplinklist.h

  1. #ifndef LOOPLINKLIST_H
  2. #define LOOPLINKLIST_H
  3. #include"myhead.h"
  4. typedef char datatype;
  5. typedef struct Node
  6. {
  7. union
  8. {
  9. int len;
  10. datatype data;
  11. };
  12. struct Node *prio;
  13. struct Node *next;
  14. }Node,*NodePtr;
  15. //链表创建
  16. NodePtr list_create();
  17. //链表判空
  18. int list_empty(NodePtr L);
  19. //链表申请空间封装节点
  20. NodePtr apply_node(datatype e);
  21. //按位置查找
  22. NodePtr list_search_pos(NodePtr L ,int pos);
  23. //链表尾插
  24. int list_insert_tail(NodePtr L,datatype e);
  25. //链表输出
  26. int list_show(NodePtr L);
  27. //链表头删
  28. int list_delete_head(NodePtr L);
  29. //链表任意位置删除
  30. int list_delete_pos(NodePtr L, int pos);
  31. //链表按位置进行修改
  32. int list_update_pos(NodePtr L, int pos, datatype e);
  33. //链表销毁
  34. void list_destory(NodePtr L);
  35. //约瑟夫
  36. void Josephus_problem(NodePtr L);
  37. #endif

looplinklist.c

  1. #include"looplinklist.h"
  2. //链表创建
  3. NodePtr list_create()
  4. {
  5. NodePtr L = (NodePtr)malloc(sizeof(Node));
  6. if(NULL == L)
  7. {
  8. printf("创建失败\n");
  9. return NULL;
  10. }
  11. L->len=0;
  12. L->next = L;
  13. printf("创建成功\n");
  14. return L;
  15. }
  16. //链表判空
  17. int list_empty(NodePtr L)
  18. {
  19. return L->next==L;
  20. }
  21. //链表申请空间封装节点
  22. NodePtr apply_node(datatype e)
  23. {
  24. NodePtr p = (NodePtr)malloc(sizeof(Node));
  25. if(NULL == p)
  26. {
  27. printf("创建失败\n");
  28. return NULL;
  29. }
  30. p->data = e;
  31. p->next = NULL;
  32. return p;
  33. }
  34. //按位置查找
  35. NodePtr list_search_pos(NodePtr L ,int pos)
  36. {
  37. if(NULL == L|| pos<0 ||pos>L->len)
  38. {
  39. printf("查找失败\n");
  40. return NULL;
  41. }
  42. NodePtr q = L;
  43. for(int i= 0;i<pos;i++)
  44. {
  45. q=q->next;
  46. }
  47. return q;
  48. }
  49. //链表尾插
  50. int list_insert_tail(NodePtr L,datatype e)
  51. {
  52. if(NULL == L)
  53. {
  54. printf("插入失败\n");
  55. return -1;
  56. }
  57. NodePtr q = list_search_pos(L,L->len);
  58. NodePtr p = apply_node(e);
  59. if(NULL == L)
  60. {
  61. return -1;
  62. }
  63. p->next = q->next;
  64. q->next = p;
  65. L->len++;
  66. printf("插入成功\n");
  67. return 0;
  68. }
  69. //链表输出
  70. int list_show(NodePtr L)
  71. {
  72. if(NULL== L||list_empty(L))
  73. {
  74. printf("遍历失败\n");
  75. return -1;
  76. }
  77. NodePtr q = L->next;
  78. while(q!=L)
  79. {
  80. printf("%c\t",q->data);
  81. q=q->next;
  82. }
  83. printf("\n");
  84. }
  85. //链表头删
  86. int list_delete_head(NodePtr L)
  87. {
  88. if(NULL==L || list_empty(L))
  89. {
  90. printf("删除失败\n");
  91. return -1;
  92. }
  93. NodePtr q = L->next;
  94. L->next = q->next;
  95. free(q);
  96. q=NULL;
  97. L->len--;
  98. }
  99. //链表销毁
  100. void list_destory(NodePtr L)
  101. {
  102. if(NULL == L)
  103. {
  104. printf("释放失败\n");
  105. return;
  106. }
  107. while(!list_empty(L))
  108. {
  109. list_delete_head(L);
  110. }
  111. free(L);
  112. L = NULL;
  113. printf("销毁成功\n");
  114. }
  115. //链表任意位置删除
  116. int list_delete_pos(NodePtr L, int pos)
  117. {
  118. if (NULL == L||pos<0 ||pos>L->len||list_empty(L))
  119. {
  120. printf("删除失败\n");
  121. return -1;
  122. }
  123. NodePtr p = list_search_pos(L,pos-1);
  124. NodePtr q = p->next;
  125. p->next = q->next;
  126. free(q);
  127. q=NULL;
  128. printf("删除成功\n");
  129. L->len--;
  130. return 0;
  131. }
  132. //链表按位置进行修改
  133. int list_update_pos(NodePtr L, int pos, datatype e)
  134. {
  135. if (NULL == L||pos<0 ||pos>L->len||list_empty(L))
  136. {
  137. printf("修改失败\n");
  138. return -1;
  139. }
  140. NodePtr p = list_search_pos(L,pos);
  141. p->data = e;
  142. printf("修改成功\n");
  143. return 0;
  144. }
  145. void Josephus_problem(NodePtr L)
  146. {
  147. int count = 0,num = 0;
  148. printf("请输入数到几退出:");
  149. scanf("%d",&num);
  150. NodePtr p = L;
  151. while (!list_empty(L))
  152. {
  153. if (p->next == L)
  154. {
  155. p = p->next;
  156. }
  157. if (num ==1)
  158. {
  159. printf("%c\t",list_search_pos(L,1)->data);
  160. list_delete_head(L);
  161. }
  162. else if(count == num-1)
  163. {
  164. printf("%c\t",p->next->data);
  165. NodePtr q = p->next;
  166. p->next = q->next;
  167. free(q);
  168. q=NULL;
  169. L->len--;
  170. count = 0;
  171. }
  172. count++;
  173. p = p->next;
  174. }
  175. printf("\n");
  176. }

main.c

  1. #include"looplinklist.h"
  2. #include<myhead.h>
  3. int main(int argc, const char *argv[])
  4. {
  5. NodePtr L = list_create();
  6. if(NULL == L)
  7. {
  8. return -1;
  9. }
  10. list_insert_tail(L,'Q');
  11. list_insert_tail(L,'W');
  12. list_insert_tail(L,'E');
  13. list_insert_tail(L,'R');
  14. list_insert_tail(L,'T');
  15. // list_show(L);
  16. // list_update_pos(L,2,'P');
  17. // list_show(L);
  18. // list_delete_pos(L,3);
  19. // list_show(L);
  20. Josephus_problem(L);
  21. list_destory(L);
  22. L=NULL;
  23. return 0;
  24. }

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

闽ICP备14008679号