數據結構—約瑟夫環問題(循環單鏈表)


n個數據元素構成一個環,從環中任意位置開始計數,計到m將該元素從表中取出,重復上述過程,直至表中只剩下一個元素。

解題思路:用一個無頭結點的循環單鏈表來實現n個元素的存儲。循環單鏈表:尾指針指向頭結點。這樣指針可以循環移動。

可以使用兩個指針來操作,將指針q指向需要操作的結點上,指針p指向需要操作結點的前一個結點。

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <malloc.h>
 4 #include <math.h>
 5 #define NULL 0
 6 typedef struct LNode
 7 {
 8     int num;///編號
 9     struct LNode *next;
10 } LNode, *Linklist;
11 Linklist head,tail;
12 void Createlist(int n)///創建含有n個結點的單循環鏈表
13 {
14     int i;
15     Linklist p,q;
16     head=(Linklist)malloc(sizeof(LNode));
17     q=head;
18     q->num=1;
19     for(i=2; i<=n; i++)
20     {
21         p=(Linklist)malloc(sizeof(LNode));
22         p->num=i;
23         q->next=p;
24         q=p;
25     }
26     p->next=head;
27     tail=p;///尾指針要指向頭結點
28 }
29 void Outlist(int k)
30 {
31     int i;
32     Linklist p,q;
33     p = head;
34     for(i=1; i<k-1; i++)///循環k-2次
35     {
36         p = p->next;///指向需要操作元素的前一個指針
37     }
38     q = p->next;///指向需要操作元素的指針
39     while(q != p)
40     {
41         printf("%3d",q->num);
42         p->next = q->next;///刪除q所指向的元素
43         for(i=1; i<k; i++)///因為要經過已經刪除的元素,所以需要多刪除一次
44         {
45             p = p->next;
46         }
47         q = p->next;
48     }
49     printf("%3d\n",q->num);
50 
51 }
52 int main()
53 {
54     int k,n;
55     printf("---------------約瑟夫環問題--------------\n");
56     printf("\n請輸入總人數和從第幾個人開始報數n,k:\n");
57     scanf("%d%d",&n,&k);
58     Createlist(n);
59     printf("\n出隊的次序:\n");
60     Outlist(k);
61     return 0;
62 }

我看了一下我同學的做法,可以p直接使用尾指針,而q來自頭指針,這樣在遍歷的時候,p指針一直會在q指針之前。

 

 1 void Outlist(int k)
 2 {
 3     int i;
 4     Linklist p,q;
 5     q = head;
 6     p = tail;
 7     for(i=1;i<k;i++)
 8     {
 9         p = p->next;
10         q = q->next;
11     }
12     while(q != p)
13     {
14         printf("%3d",q->num);
15         p->next = q->next;
16         q = p->next;
17         for(i=1;i<k;i++)
18         {
19             p = p->next;
20             q = q->next;
21         }
22     }
23     printf("%3d\n",q->num);
24 }

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM