急!求一道数据结构的程序代码!要求用C语言,编写代码!谢谢!

约瑟夫环
使用循环链表实现约瑟夫环。给定一组编号分别是:4,7,5,9,3,2,6,1,8。初始值由用户输入,按照约瑟夫原理打印输出队列。
约瑟夫算法:n个人围成一圈,每个人都有一个互不相同的密码,该密码是一个整数值,选择一个人作为起点,然后顺时针从1到k(k为起点人手中的密码值)数数,每数到k的人退出圈子,然后从下一个人开始继续从1到j(刚退出圈子的人的密码)数数,数到j的人退出圈子。重复上面的过程,直到剩下最后一个人。

第1个回答  2013-07-05
#include <stdio.h>
#include <stdlib.h>

struct Node{
int data;
struct Node * next;
}Node;

int main(void)
{
int a[] = {4,7,5,9,3,2,6,1,8};

struct Node * NodeTemp = NULL;
struct Node * m_Head = NULL;
struct Node * m_pre = NULL;


for(int i=0;i<9;i++){//构造循环列表
NodeTemp = (struct Node *)malloc(sizeof(Node));

NodeTemp->data = a[i];

NodeTemp->next = NULL;

if(m_Head==NULL){
m_Head = m_pre = NodeTemp;
}
else{
m_pre->next = NodeTemp;
m_pre = NodeTemp;
}
}

m_pre->next = m_Head;


printf("please input first record :\n");
int record = 0;

scanf("%d",&record);


int N = 9;

while (N--)
{

record = record-1;//因为本身也算是1所以循环少一次

while (record--)
{
m_Head = m_Head->next;//找到节点
}

printf("%d ",m_Head->data);//输出值

record = m_Head->data;//保存值

NodeTemp = m_Head;//找到节点的前节点 因为我们要删掉找到得节点

while(NodeTemp->next!=m_Head){
NodeTemp = NodeTemp->next;
}

NodeTemp->next = NodeTemp->next->next;

free(m_Head);//删除

m_Head = NodeTemp->next;//从新开始

}




}

循环列表都忘了 写了好久。囧

第2个回答  2013-07-04
用链表,指针移动j次(k次)读出节点数值,然后删除节点,循环直到链表为空。追问

每个人手中的密码应该如何编进去?

追答

struct node
{
int value; //密码
struct node *next; //指向下一个节点
};

第3个回答  2013-07-04
最简单的是用循环链表,其次是数组