Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.64 KB | None | 0 0
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3.  
  4. struct soldier* create_soldier(int sequence);
  5. struct soldier* create_reverse_circle(int n);
  6. struct soldier* rearrange_circle(struct soldier *head);
  7. void display(struct soldier *head);
  8. int kill(struct soldier *head, int n, int k);
  9.  
  10. struct soldier
  11. {
  12. struct soldier* previous;
  13. struct soldier* next;
  14. int number;
  15. };
  16.  
  17. struct soldier* create_soldier(int sequence)
  18. {
  19. struct soldier* soldier = (struct soldier*) malloc (sizeof(struct soldier));
  20.  
  21. soldier -> number = sequence;
  22. soldier -> next = soldier;
  23. soldier -> previous = soldier;
  24.  
  25. return soldier;
  26. }
  27.  
  28. struct soldier* create_reverse_circle(int n) {
  29.  
  30. struct soldier *head, *soldier;
  31. head = create_soldier(1);
  32.  
  33. int counter;
  34.  
  35. for(counter = 2; counter <= n; counter++){
  36.  
  37. soldier = create_soldier(counter);
  38. soldier->next = head;
  39. soldier->previous = head->previous;
  40. head->previous = soldier;
  41. head = soldier;
  42. }
  43.  
  44. head->previous->next = head;
  45.  
  46. return head;
  47. }
  48. struct soldier* rearrange_circle(struct soldier *head)
  49. {
  50. struct soldier *headreverse, *j, *next2;
  51.  
  52. j = head -> next;
  53. headreverse = head;
  54. headreverse -> next = headreverse;
  55. headreverse -> previous = headreverse;
  56.  
  57.  
  58. while (j != head)
  59. {
  60. next2 = j -> next;
  61. j -> next = headreverse;
  62. j -> previous = headreverse -> previous;
  63. headreverse -> previous -> next = j;
  64. headreverse -> previous = j;
  65. headreverse = j;
  66.  
  67. j = next2;
  68. }
  69. return headreverse;
  70. }
  71.  
  72. void display(struct soldier *head)
  73. {
  74. struct soldier *start;
  75.  
  76. if(head == NULL)
  77. return;
  78.  
  79. printf("%d", head->number);
  80. start = head->next;
  81.  
  82. if(start != head)
  83. printf(" ");
  84.  
  85. while(start != head){
  86.  
  87. printf("%d", start->number);
  88.  
  89. if(start->next != head)
  90. printf(" ");
  91.  
  92. start = start->next;
  93. }
  94.  
  95. printf("\n\n");
  96. }
  97.  
  98. int kill(struct soldier *head, int n, int k)
  99. {
  100. struct soldier *headreverse, *j;
  101. int counter = 0;
  102.  
  103. if(n == 1)
  104. return head -> number;
  105.  
  106. j = head;
  107.  
  108. for (counter = 0; counter < k-1; counter++)
  109. {
  110. j = j -> next;
  111. }
  112. headreverse = j -> next;
  113. j -> next -> previous = j -> previous;
  114. j -> previous -> next = j -> next;
  115.  
  116. n--;
  117.  
  118. return kill(headreverse, n, k);
  119.  
  120. }
  121.  
  122. int main()
  123. {
  124. struct soldier *list;
  125. int safe;
  126. int skip;
  127. int n, k;
  128.  
  129. printf("Input: \n");
  130. scanf("%d", &n, &k);
  131.  
  132. list = create_reverse_circle (n);
  133.  
  134. printf("\nList: ");
  135. display(list);
  136.  
  137. list = rearrange_circle (list);
  138.  
  139. printf("After ordering: ");
  140. display(list);
  141.  
  142. safe = kill (list, n, k);
  143. printf("Survived: %d\n", safe);
  144.  
  145. return 0;
  146. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement