用循环链表解决约瑟夫问题,打印出最后的人
#include <stdio.h>
#include <stdlib.h>
typedef int datatype;
typedef struct node_t
{
datatype data;
struct node_t *next;
}link_t;
int main(int argc, const char *argv[])
{
int all_num=8;//有八个人
int start_num=3;//从第三个人开始
int n=3;//数三个
link_t *ptail=NULL;//用于保存链表最后一个节点的地址
link_t *pnew=NULL;//用于保存新建节点地址
link_t *pdel=NULL;
//创建地一个节点
link_t *h=(link_t *)malloc(sizeof(link_t));
if(NULL == h)
{
printf("malloc head error.\n");
return -1;
}
//初始化第一个节点
h->data=1;
h->next=NULL;
ptail=h;
//创建剩余节点,链接到第一个节点之后
int i;
for(i=2;i<=8;i++)
{
pnew=(link_t *)malloc(sizeof(link_t));
if(NULL == pnew)
{
printf("malloc new node error.\n");
return -1;
}
//初始化新节点
pnew->data=i;
pnew->next=NULL;
//拼接到链表最后
ptail->next=pnew;
ptail=pnew;
}
//头尾相连。的到循环链表
ptail->next=h;
//从3开始,先找到第2个人
for(i=0;i<start_num-2;i++)
{
h=h->next;
}
while(h != h->next)
{
for(i=0;i<n-1;i++)
{
h=h->next;
}
pdel=h->next;
h->next=pdel->next;
free(pdel);
pdel=NULL;
}
printf("king is %d\n",h->data);
return 0;
}