自己写的,有点拙略,勿喷啊...
这是完整的 VC++6.0 的工程 http://pan.baidu.com/s/1jGkM5wy 密码: iz62
源码如下:
#include <stdio.h>
#include <stdlib.h>
/*
*功能:约瑟夫问题解决办法(循环链表解决)
*By:Ailson Jack
*Date:2014.05.24
*/
#define error0
#define ok 1
typedef int ElementType;
typedef struct CycleListNode Node;
typedef struct CycleListNode *ptrNode;
struct CycleListNode//循环链表结点
{
ElementType data;//数据区
ptrNode next;//指向下一个结点
};
void Josephus(ptrNode list,int start,int count,int length);
int CycleList_CreateNode(ptrNode *list);
void CycleList_Init(ptrNode *list,int length);
void CycleList_Delete(ptrNode *list,int position);
void CycleList_Find(ptrNode *list,ElementType Start);
void Prin_CycleList(ptrNode list,int length);
int main(void)
{
int Start=1;//起始计数位置
int Count=3;//第Count个位置的结点出局
int length=41;//循环链表的长度
ptrNode list;
CycleList_CreateNode(&list);
CycleList_Init(&list,length);
Prin_CycleList(list,length);
Josephus(list,Start,Count,length);
while (1)
{
}
return 0;
}
//约瑟夫问题解决办法(循环链表解决)
void Josephus(ptrNode list,int start,int count,int length)
{
int i=1;
CycleList_Find(&list,start);
printf("\r\n约瑟夫问题解决开始....\r\n");
while (i<=length)
{
CycleList_Delete(&list,count);
i++;
}
printf("\r\n约瑟夫问题解决结束\r\n");
}
//创建循环链表头结点
int CycleList_CreateNode(ptrNode *list)
{
*list=(ptrNode)malloc(sizeof(CycleListNode));
if(*list==NULL)
{
printf("Out of Space...\r\n");
return error;
}
(*list)->next=NULL;
return ok;
}
//初始化循环链表,并且最后丢掉链表头结点,链表的数据为1 -> length
void CycleList_Init(ptrNode *list,int length)
{
int i=1;
ptrNode newNode;
ptrNode FirstNode;
FirstNode=*list;
while(i<=length)//i从1到 length
{
newNode=(ptrNode)malloc(sizeof(CycleListNode));
newNode->data=i;
(*list)->next=newNode;
(*list)=newNode;
i++;
}
(*list)->next=FirstNode->next;
*list=FirstNode->next;
}
//删掉循环链表中从表头数的第position个位置的数据
//最终将头结点变为删除前那个结点的下一个结点
void CycleList_Delete(ptrNode *list,int position)
{
int i=1;
ptrNode tmp;
if (position==1)
{
tmp=*list;
while (tmp->data!=(*list)->next->data)
{
*list=(*list)->next;
}
printf("%d ",(*list)->next->data);
(*list)->next=tmp->next;
*list=tmp->next;
free(tmp);
tmp=NULL;
}
else
{
while (i<position-1)
{
(*list)=(*list)->next;
i++;
}
tmp=(*list)->next;
printf("%d ",tmp->data);
(*list)->next=(*list)->next->next;
free(tmp);
tmp=NULL;
*list=(*list)->next;
}
}
//查找循环链表中数据元素是Start的结点的位置,并且将该节点设为新的起始结点
void CycleList_Find(ptrNode *list,ElementType Start)
{
while ((*list)->data!=Start)
{
*list=(*list)->next;
}
}
//打印循环链表中的数据
void Prin_CycleList(ptrNode list,int length)
{
int i=1;
printf("打印循环链表...\r\n");
while (i<=length)
{
printf("%d ",list->data);
list=list->next;
i++;
}
printf("\r\n结束打印\r\n");
}
这是完整的 VC++6.0 的工程 http://pan.baidu.com/s/1jGkM5wy 密码: iz62
源码如下:
#include <stdio.h>
#include <stdlib.h>
/*
*功能:约瑟夫问题解决办法(循环链表解决)
*By:Ailson Jack
*Date:2014.05.24
*/
#define error0
#define ok 1
typedef int ElementType;
typedef struct CycleListNode Node;
typedef struct CycleListNode *ptrNode;
struct CycleListNode//循环链表结点
{
ElementType data;//数据区
ptrNode next;//指向下一个结点
};
void Josephus(ptrNode list,int start,int count,int length);
int CycleList_CreateNode(ptrNode *list);
void CycleList_Init(ptrNode *list,int length);
void CycleList_Delete(ptrNode *list,int position);
void CycleList_Find(ptrNode *list,ElementType Start);
void Prin_CycleList(ptrNode list,int length);
int main(void)
{
int Start=1;//起始计数位置
int Count=3;//第Count个位置的结点出局
int length=41;//循环链表的长度
ptrNode list;
CycleList_CreateNode(&list);
CycleList_Init(&list,length);
Prin_CycleList(list,length);
Josephus(list,Start,Count,length);
while (1)
{
}
return 0;
}
//约瑟夫问题解决办法(循环链表解决)
void Josephus(ptrNode list,int start,int count,int length)
{
int i=1;
CycleList_Find(&list,start);
printf("\r\n约瑟夫问题解决开始....\r\n");
while (i<=length)
{
CycleList_Delete(&list,count);
i++;
}
printf("\r\n约瑟夫问题解决结束\r\n");
}
//创建循环链表头结点
int CycleList_CreateNode(ptrNode *list)
{
*list=(ptrNode)malloc(sizeof(CycleListNode));
if(*list==NULL)
{
printf("Out of Space...\r\n");
return error;
}
(*list)->next=NULL;
return ok;
}
//初始化循环链表,并且最后丢掉链表头结点,链表的数据为1 -> length
void CycleList_Init(ptrNode *list,int length)
{
int i=1;
ptrNode newNode;
ptrNode FirstNode;
FirstNode=*list;
while(i<=length)//i从1到 length
{
newNode=(ptrNode)malloc(sizeof(CycleListNode));
newNode->data=i;
(*list)->next=newNode;
(*list)=newNode;
i++;
}
(*list)->next=FirstNode->next;
*list=FirstNode->next;
}
//删掉循环链表中从表头数的第position个位置的数据
//最终将头结点变为删除前那个结点的下一个结点
void CycleList_Delete(ptrNode *list,int position)
{
int i=1;
ptrNode tmp;
if (position==1)
{
tmp=*list;
while (tmp->data!=(*list)->next->data)
{
*list=(*list)->next;
}
printf("%d ",(*list)->next->data);
(*list)->next=tmp->next;
*list=tmp->next;
free(tmp);
tmp=NULL;
}
else
{
while (i<position-1)
{
(*list)=(*list)->next;
i++;
}
tmp=(*list)->next;
printf("%d ",tmp->data);
(*list)->next=(*list)->next->next;
free(tmp);
tmp=NULL;
*list=(*list)->next;
}
}
//查找循环链表中数据元素是Start的结点的位置,并且将该节点设为新的起始结点
void CycleList_Find(ptrNode *list,ElementType Start)
{
while ((*list)->data!=Start)
{
*list=(*list)->next;
}
}
//打印循环链表中的数据
void Prin_CycleList(ptrNode list,int length)
{
int i=1;
printf("打印循环链表...\r\n");
while (i<=length)
{
printf("%d ",list->data);
list=list->next;
i++;
}
printf("\r\n结束打印\r\n");
}