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,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 }总结
以上是内存溢出为你收集整理的带头结点的循环链表实现约瑟夫环全部内容,希望文章能够帮你解决带头结点的循环链表实现约瑟夫环所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)