程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 使用循環鏈表實現約瑟夫環(圍圈報數問題),圍圈報數

使用循環鏈表實現約瑟夫環(圍圈報數問題),圍圈報數

編輯:關於C語言

使用循環鏈表實現約瑟夫環(圍圈報數問題),圍圈報數


剛開始學C,碰到經典的圍圈報數問題,現先將實現代碼附下:

#include<stdio.h>
#include<stdlib.h>

struct LNODE{            //鏈表定義
 int data;
 struct LNODE *next;
};
typedef struct LNODE Lnode;
typedef struct LNODE *LinkList;
struct LNODE *create(int s[])      //創建單項循環鏈表
{
 struct LNODE *head=NULL,*p=NULL,*last=NULL;
 int i=0;
 head=(struct LNODE *)malloc(sizeof(struct LNODE));
 if(!head)
 printf("memory allocation error!");
 if(s[0]!=0)
 {
  
  head->data=s[0];
  head->next=head;
  last=head;
   i++;
  while(s[i]!=0)      //判斷是否為0,為0則結束
  {
   p=(struct LNODE*)malloc(sizeof(struct LNODE));
   last->next=p;
   p->data=s[i];  
   p->next=head;
   last=p;
   i++;
  }
 }
 return head;
}
void printlist(struct LNODE *head)    //打印循環鏈表
{
 struct LNODE *q;
 int i;
 printf("the linked list is :\n");
 if(!head)
  printf("NULL");
 else
 {
  q=head;
  do
  {
   printf("%d\t",q->data);
   q=q->next;
  }while(q!=head);
 }
 printf("\n");
 
}
  
  
int main()
{
 int  circlelist[100],n,i,k=1;
 printf("please input the number:");
 scanf("%d",&n);      //輸入人數
 getchar();
 for(i=0;i<n;i++)
  circlelist[i]=i+1;      //給每個人編號
 circlelist[i]=0;        //最後值賦0
 for(i=0;i<=n;i++)
  printf("%d\t",circlelist[i]);    //打印編號
 LinkList p=NULL,q=NULL;
 p=create(circlelist);
 printlist(p);          //打印編號鏈表
 while(p->data!=p->next->data)    //自身與自身相等時退出循環
 {
  if(k!=3)                //設置報到數3的人退出
  {
   k++;
   q=p;
   p=p->next;
  }
  else
  {
   k=1;
   printf("%d\t",p->data);      //打印先後推出的人員編號
   q->next=p->next;        //刪除報3的人員結點
   p=q->next;
  }
 }
 printf("\n%d\n",p->data);

}

剛開始指針定義時都沒有賦值為NULL,調試沒錯誤,可是卻無法執行。

書中說,建議定義時如果暫時不使用指針,先賦值為NULL,我覺得最好這樣做,而且,在使用指針時,都應該判斷一下是否為空。


 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved