正好這幾天在看數據結構,覺得鏈表應用挺廣的,特寫一實例。
問題描述:
選首領。N個遊戲者圍成一圈,從第一個開始順序報數1,2,3.凡報到3者退出圈子,最後留在圈中的人爲首領。
思路:
創建一個包含N個節點的單循環鏈表來模擬N個人圍成的圈。節點的數據域存放遊戲者的編號。
在程序中,以刪除節點模擬人退出圈子的處理,整型變量c(初始值爲1)用於計數,指針變量p的初始值爲head,運行時,從p所指的節點開始計數,p沿鏈表中的指針每次向後指一個節點,c值隨p指針的移動相應地遞增。當c計數到2時,就刪除下一個節點,然後將c置爲0。爲了避免將剩下的最後一個節點刪除,另外設置一個計數器k,其初值爲參加遊戲的人數。每當刪除一個節點時,k值就減1,當k等於1時,首領就選出來了!
代碼:
- #include <stdio.h>
- #include <stdlib.h>
- typedef struct node{
- int code; /* 遊戲者的編號 */
- struct node *next;
- }NODE,*LinkList;
- LinkList create_list(int n)
- /* 創建一個節點數爲n的單循環鏈表,返回值爲遊戲編號爲1的節點的指針 */
- { LinkList head,p;
- int i;
- head=(NODE*)malloc(sizeof(NODE));/*創建循環鏈表的第一個節點*/
- if(!head){
- printf("內存位置錯誤!/n");return NULL;
- }
- head->code=1; head->next=head;
- for(i=n;i>1;--i){/* 尾插法創建循環鏈表的其餘n-1個節點*/
- p=(NODE*)malloc(sizeof(NODE));
- if(!p){
- printf("內存位置錯誤!/n");return NULL;
- }
- p->code=i; p->next=head->next; head->next=p;
- }/*for*/
- return head;
- }/*create_list*/
- void output(LinkList head)/*輸出鏈表中的節點的數據*/
- { LinkList p;
- p=head;
- do{
- printf("%4d",p->code); p=p->next;
- }while(p!=head);
- printf("/n");
- }/*output*/
- void play(LinkList head,int n)
- { LinkList p,q;
- int c=0,k;
- p=head; c=1;k=n;
- while(k>1){
- if(c==2){ /* 當c等於2時,p指向的節點後繼即爲被刪除的節點*/
- q=p->next;p->next=q->next;
- printf("%4d",q->code); free(q);
- c=0; k--;
- }/*if*/
- else{c++;p=p->next;}
- }/*while*/
- printf("/n%4d 是首領.",p->code); /*輸出最後留在圈子內的人的編號*/
- }/*play*/
- void main(void)
- { LinkList head;
- int n;
- printf("請輸入遊戲者的遊戲編號:"); scanf("%d",&n);
- head=create_list(n); /*創建單循環鏈表*/
- if(head){
- output(head); /*輸出單循環鏈表中的節點的信息*/
- play(head,n);
- }
- }
截圖:
轉自:http://blog.csdn.net/ppiao1970hank/article/details/6329483