歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux編程 >> Linux編程 >> 使用循環鏈表實現約瑟夫環(圍圈報數問題)

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

日期:2017/3/1 9:14:48   编辑:Linux編程

剛開始學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,我覺得最好這樣做,而且,在使用指針時,都應該判斷一下是否為空。

Copyright © Linux教程網 All Rights Reserved