You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  1. /*
  2. * @Author: your name
  3. * @Date: 2021-06-20 17:11:37
  4. * @LastEditTime: 2021-06-20 19:21:51
  5. * @LastEditors: Please set LastEditors
  6. * @Description: In User Settings Edit
  7. * @FilePath: \slist\slist.c
  8. */
  9. #include "loop_list.h"
  10. #include "stdlib.h"
  11. #include "stdio.h"
  12. pkt_node_t pkt_creat_joseph(void)
  13. {
  14. pkt_node_t p, r, h;
  15. p = (pkt_node_t)malloc(sizeof(struct pkt_node));
  16. p->next = p;
  17. p->data = 1;
  18. h = p;
  19. int n, i;
  20. loop:
  21. printf("input a number:");
  22. scanf("%d", &n);
  23. if (n < 0)
  24. {
  25. printf("input error < 0\n");
  26. goto loop;
  27. }
  28. r = h;
  29. for (i = 2; i <= n; i++)
  30. {
  31. p = (pkt_node_t)malloc(sizeof(struct pkt_node));
  32. p->data = i;
  33. r->next = p;
  34. r = p; /* r ponit list tail */
  35. }
  36. p->next = h; /* tail node ponit head node */
  37. return h;
  38. }
  39. int pkt_show_list(pkt_node_t l)
  40. {
  41. pkt_node_t p = l;
  42. int i = 0;
  43. while (p->next != l)
  44. {
  45. printf("l[%d] = %d\n", i, p->data);
  46. p = p->next;
  47. i++;
  48. }
  49. printf("l[%d] = %d\n", i, p->data);
  50. return 0;
  51. }
  52. int pkt_joseph(pkt_node_t l, int k, int m)
  53. {
  54. PKT_ASSERT(l);
  55. pkt_node_t p = l;
  56. while (p->next->data != k)
  57. {
  58. p = p->next; /* find k node prev node*/
  59. }
  60. printf("l[k] = %d\n", p->next->data);
  61. pkt_node_t r = p;
  62. pkt_node_t q;
  63. int i;
  64. while (r->next != r)
  65. {
  66. for (i = 0; i < m - 1; i++) /* find next del node prev node */
  67. {
  68. r = r->next;
  69. }
  70. q = r->next; /* save delete node to q */
  71. r->next = q->next;
  72. printf("del = %d\n", q->data);
  73. free(q);
  74. }
  75. printf("del = %d\n", r->data); /* last node */
  76. free(r);
  77. return 0;
  78. }
  79. int main(int argc, char **argv)
  80. {
  81. pkt_node_t list;
  82. list = pkt_creat_joseph();
  83. pkt_show_list(list);
  84. pkt_joseph(list, 3, 4);
  85. return 0;
  86. }