当前位置:   article > 正文

day18homework

day18homework

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

1.c

  1. #include "1.h"
  2. //创建循环链表
  3. NodePtr list_create()
  4. {
  5. //在堆区申请一个头结点
  6. NodePtr L = (NodePtr)malloc(sizeof(Node));
  7. if (NULL == L)
  8. {
  9. printf("创建失败\n");
  10. return NULL;
  11. }
  12. //初始化
  13. L->len = 0;
  14. L->next = L; //头结点指针域指向自己
  15. printf("创建成功\n");
  16. return L;
  17. }
  18. //链表判空
  19. int list_empty(NodePtr L)
  20. {
  21. return L->next == L;
  22. }
  23. //链表申请空间封装节点
  24. NodePtr apply_node(datatype e)
  25. {
  26. //堆区申请一个节点的空间
  27. NodePtr p = (NodePtr)malloc(sizeof(Node));
  28. if (NULL == p)
  29. {
  30. printf("申请失败\n");
  31. return NULL;
  32. }
  33. //给节点赋值
  34. p->data = e;
  35. p->next = NULL;
  36. return p;
  37. }
  38. //按位置进行查找
  39. NodePtr list_search_pos(NodePtr L, int pos)
  40. {
  41. //判断逻辑
  42. if (NULL == L || pos < 0 || pos > L->len)
  43. {
  44. printf("查找失败\n");
  45. return NULL;
  46. }
  47. //查找逻辑
  48. NodePtr q = L;
  49. for (int i = 0; i < pos; i++)
  50. {
  51. q = q->next;
  52. }
  53. return q;
  54. }
  55. //链表尾插
  56. int list_insert_tail(NodePtr L, datatype e)
  57. {
  58. //判断逻辑
  59. if (NULL == L)
  60. {
  61. printf("插入失败\n");
  62. return -1;
  63. }
  64. //找到最后一个节点
  65. NodePtr q = list_search_pos(L, L->len);
  66. //封装节点
  67. NodePtr p = apply_node(e);
  68. if (NULL == p)
  69. {
  70. return -1;
  71. }
  72. //插入逻辑
  73. p->next = q->next;
  74. q->next = p;
  75. //表的变化
  76. L->len++;
  77. printf("插入成功\n");
  78. return 0;
  79. }
  80. //链表遍历
  81. int list_show(NodePtr L)
  82. {
  83. //判断逻辑
  84. if (NULL == L || list_empty(L))
  85. {
  86. printf("遍历失败\n");
  87. return -1;
  88. }
  89. //遍历逻辑
  90. NodePtr q = L->next;
  91. while (q != L)
  92. {
  93. printf("%d\t", q->data);
  94. q = q->next; //继续访问下一个
  95. }
  96. printf("\n");
  97. }
  98. //链表的头删
  99. int list_delete_head(NodePtr L)
  100. {
  101. //判断逻辑
  102. if (NULL == L || list_empty(L))
  103. {
  104. printf("删除失败\n");
  105. return -1;
  106. }
  107. //头删逻辑
  108. NodePtr p = L->next; //标记
  109. L->next = p->next; //孤立
  110. free(p); //删除
  111. p = NULL;
  112. //表长变化
  113. L->len--;
  114. printf("删除成功\n");
  115. return 0;
  116. }
  117. //链表销毁
  118. void list_destroy(NodePtr L)
  119. {
  120. //判断逻辑
  121. if (NULL == L)
  122. {
  123. printf("释放失败\n");
  124. return;
  125. }
  126. //删除节点
  127. while (!list_empty(L))
  128. {
  129. list_delete_head(L);
  130. }
  131. //释放头结点
  132. free(L);
  133. L = NULL;
  134. printf("销毁成功\n");
  135. }
  136. void create(NodePtr L, datatype n)
  137. {
  138. for (int i = 1; i <= n; i++)
  139. {
  140. list_insert_tail(L, i);
  141. }
  142. }
  143. // 约瑟夫环问题求解
  144. void josephus(NodePtr L, int m)
  145. {
  146. NodePtr p = L->next; // 从第一个节点开始
  147. while (p->len > 1)
  148. {
  149. for (int i = 1; i < m - 1; i++)
  150. {
  151. p = p->next;
  152. }
  153. list_delete_head(p);
  154. }
  155. printf("最后活着的是: %d\n", p->data);
  156. }

2.c

  1. #include "1.h"
  2. int main()
  3. {
  4. NodePtr L = list_create();
  5. if (NULL == L)
  6. {
  7. return -1;
  8. }
  9. int n, m;
  10. printf("请输入总人数n和报数间隔m");
  11. printf("例如(m=2,从一号开始则三号死)");
  12. scanf("%d %d", &n,&m);
  13. create(L, n);
  14. list_show(L);
  15. josephus(L, m);
  16. //调用释放函数
  17. list_destroy(L);
  18. L = NULL;
  19. return 0;
  20. }

1.h

  1. #ifndef LINKLIST_H
  2. #define LINKLIST_H
  3. #include <myhead.h>
  4. //定义数据类型
  5. typedef int datatype;
  6. //定义结点类型
  7. typedef struct Node
  8. {
  9. union
  10. {
  11. int len; //头结点数据域
  12. datatype data; //普通结点数据域
  13. };
  14. struct Node *next; //指针域
  15. } Node, *NodePtr;
  16. //创建循环链表
  17. NodePtr list_create();
  18. //链表判空
  19. int list_empty(NodePtr L);
  20. //链表申请空间封装节点
  21. NodePtr apply_node(datatype e);
  22. //按位置进行查找
  23. NodePtr list_search_pos(NodePtr L, int pos);
  24. //链表尾插
  25. int list_insert_tail(NodePtr L, datatype e);
  26. //链表遍历
  27. int list_show(NodePtr L);
  28. //链表的头删
  29. int list_delete_head(NodePtr L);
  30. //链表销毁
  31. void list_destroy(NodePtr L);
  32. void create(NodePtr L, datatype n);
  33. // 约瑟夫环问题求解
  34. void josephus(NodePtr L, int m);
  35. #endif

使用栈,完成进制转换

输入:一个整数,进制数

输出:该数的对应的进制数

1.c

  1. #include"1.h"
  2. int main() {
  3. int number, base;
  4. printf("请输入一个整数和进制数(用空格隔开):");
  5. scanf("%d %d", &number, &base);
  6. printf("转换后的进制数为:");
  7. convertToBase(number, base);
  8. return 0;
  9. }

2.c

  1. #include"1.h"
  2. void push(Stack *stack, int value)
  3. {
  4. if (stack->top == MAX_SIZE - 1)
  5. {
  6. printf("栈已满,无法插入新元素");
  7. return;
  8. }
  9. stack->data[++stack->top] = value;
  10. }
  11. int pop(Stack *stack)
  12. {
  13. if (stack->top == -1)
  14. {
  15. printf("栈为空,无法弹出元素");
  16. return -1;
  17. }
  18. return stack->data[stack->top--];
  19. }
  20. void convertToBase(int number, int base)
  21. {
  22. Stack stack;
  23. stack.top = -1;
  24. while (number > 0)
  25. {
  26. push(&stack, number % base);
  27. number /= base;
  28. }
  29. while (stack.top != -1)
  30. {
  31. int digit = pop(&stack);
  32. if (digit < 10)
  33. {
  34. printf("%d", digit);
  35. }
  36. else
  37. {
  38. printf("%c", 'A' + digit - 10);
  39. }
  40. }
  41. printf("\n");
  42. }

1.h

  1. #ifndef SEQSTACK_H
  2. #define SEQSTACK_H
  3. #include<myhead.h>
  4. #define MAX_SIZE 100
  5. typedef struct {
  6. int data[MAX_SIZE];
  7. int top;
  8. } Stack;
  9. void push(Stack *stack, int value);
  10. int pop(Stack *stack);
  11. void convertToBase(int number, int base);
  12. #endif

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

闽ICP备14008679号