1 #include<bits/stdc++.h> 2 using namespace std; 3 #define sc scanf 4 #define pr printf 5 6 typedef struct LNode{ 7 int data; 8 struct LNode *next; 9 }LNode,*LinkList; 10 11 void Create_CircleList(LinkList &L,int n) 12 { 13 LNode *p,*q; 14 L = (LNode *)malloc(sizeof(LNode)); 15 L->data = n + 1; 16 L->next = NULL; 17 18 //创建最后一个结点 19 q = (LNode *)malloc(sizeof(LNode)); 20 scanf("%d",&q->data); 21 q->next = L->next; 22 L->next = q; 23 24 for(int i = 1;i < n;i++) 25 { 26 p = (LNode *)malloc(sizeof(LNode)); 27 scanf("%d",&p->data); 28 p->next = L->next; 29 L->next = p; 30 } 31 //因为是循环链表,所以最后一个结点的指针指向头结点 32 q->next = L; 33 34 } 35 36 //遍历循环链表 37 void Traver_CircleList(LinkList &L) 38 { 39 LNode *p = L; 40 while(p->next != L) 41 { 42 p = p->next; 43 cout << p->data << " "; 44 } 45 puts(""); 46 } 47 48 int getLength(LinkList &L) 49 { 50 LNode *p = L; 51 int cnt = 0; 52 while(p->next != L) 53 { 54 p = p->next; 55 cnt++; 56 } 57 return cnt; 58 } 59 60 //删除循环链表的某个结点 61 bool Delete_Node(LinkList &L,int i,int &e) 62 { 63 int len = getLength(L); 64 65 if(L->next == NULL) 66 { 67 puts("Sorry! Empty LinkList!"); 68 return 0; 69 } 70 if(i < 1 || i > len) 71 { 72 puts("Oh! Baby! The position is invalid. Please re-enter the position!"); 73 return 0; 74 } 75 LNode *p = L; 76 int j = 0; 77 while(p->next != L && j < i - 1) 78 { 79 p = p->next; 80 j++; 81 } 82 LNode *q; 83 q = p->next; 84 p->next = q->next; 85 e = q->data; 86 free(q); 87 return 1; 88 } 89 90 void Joseph(LinkList &L,int m,int k,int n) 91 { 92 int cnt = 0,tot = 1; 93 LNode *p = L,*q; 94 for(int i = 1;i < k;i++) 95 { 96 p = p->next; 97 } 98 99 while(tot < n ) 100 { 101 cnt++; 102 //ty++; 103 if( (p->next)->data == n + 1 ) { 104 p = p->next; 105 cnt--; 106 continue; 107 } 108 109 if(cnt % m == 0) 110 { 111 tot++; 112 LNode *tem = p->next; 113 p->next = tem->next; 114 //p = tem->next; 115 cout << tem->data << " "; 116 free(tem); 117 } 118 else p = p->next; 119 } 120 q = L->next; 121 puts(""); 122 pr("The Lucky guy is "); 123 cout << q->data << endl; 124 return; 125 } 126 int main() 127 { 128 LNode *la; 129 int n,m,k; 130 scanf("%d%d%d",&n,&m,&k); 131 Create_CircleList(la,n); 132 133 cout << "La length = " << getLength (la) << endl; 134 Traver_CircleList(la); 135 136 Joseph(la,m,k,n); 137 cout << "La length = " << getLength (la) << endl; 138 int e; 139 bool ok = Delete_Node(la,1,e); 140 if(ok) 141 { 142 cout << "The delete number is " << e << endl; 143 cout << "after delete La length = " << getLength(la) << endl; 144 pr("after delete La is "); 145 Traver_CircleList(la); 146 } 147 return 0; 148 }