Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdio.h>
- #include <stdlib.h>
- struct soldier* create_soldier(int sequence);
- struct soldier* create_reverse_circle(int n);
- struct soldier* rearrange_circle(struct soldier *head);
- void display(struct soldier *head);
- int kill(struct soldier *head, int n, int k);
- struct soldier
- {
- struct soldier* previous;
- struct soldier* next;
- int number;
- };
- struct soldier* create_soldier(int sequence)
- {
- struct soldier* soldier = (struct soldier*) malloc (sizeof(struct soldier));
- soldier -> number = sequence;
- soldier -> next = soldier;
- soldier -> previous = soldier;
- return soldier;
- }
- struct soldier* create_reverse_circle(int n) {
- struct soldier *head, *soldier;
- head = create_soldier(1);
- int counter;
- for(counter = 2; counter <= n; counter++){
- soldier = create_soldier(counter);
- soldier->next = head;
- soldier->previous = head->previous;
- head->previous = soldier;
- head = soldier;
- }
- head->previous->next = head;
- return head;
- }
- struct soldier* rearrange_circle(struct soldier *head)
- {
- struct soldier *headreverse, *j, *next2;
- j = head -> next;
- headreverse = head;
- headreverse -> next = headreverse;
- headreverse -> previous = headreverse;
- while (j != head)
- {
- next2 = j -> next;
- j -> next = headreverse;
- j -> previous = headreverse -> previous;
- headreverse -> previous -> next = j;
- headreverse -> previous = j;
- headreverse = j;
- j = next2;
- }
- return headreverse;
- }
- void display(struct soldier *head)
- {
- struct soldier *start;
- if(head == NULL)
- return;
- printf("%d", head->number);
- start = head->next;
- if(start != head)
- printf(" ");
- while(start != head){
- printf("%d", start->number);
- if(start->next != head)
- printf(" ");
- start = start->next;
- }
- printf("\n\n");
- }
- int kill(struct soldier *head, int n, int k)
- {
- struct soldier *headreverse, *j;
- int counter = 0;
- if(n == 1)
- return head -> number;
- j = head;
- for (counter = 0; counter < k-1; counter++)
- {
- j = j -> next;
- }
- headreverse = j -> next;
- j -> next -> previous = j -> previous;
- j -> previous -> next = j -> next;
- n--;
- return kill(headreverse, n, k);
- }
- int main()
- {
- struct soldier *list;
- int safe;
- int skip;
- int n, k;
- printf("Input: \n");
- scanf("%d", &n, &k);
- list = create_reverse_circle (n);
- printf("\nList: ");
- display(list);
- list = rearrange_circle (list);
- printf("After ordering: ");
- display(list);
- safe = kill (list, n, k);
- printf("Survived: %d\n", safe);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement