关于C语言数据结构的问题(约瑟夫环)

2024-12-02 05:10:29
推荐回答(1个)
回答1:

#include
#include
#include // malloc()等
#include // INT_MAX等
#include // EOF(=^Z或F6),NULL
#include // atoi()
#include // eof()
#include // floor(),ceil(),abs()
#include // exit()
#include // cout,cin
#include

// 函数结果状态代码
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1

///////////////////////////////////////////////////////////////////////////
typedef int Status;

typedef int ElemType;

typedef struct NodeType
{
ElemType data,locate;
NodeType *next;
} NodeType,*LinkType; //结点类型,指针类型

typedef struct OrderedList{

LinkType head; //分别指向线性链表的头结点和尾结点
int size; //指示链表当前的长度
}OrderedList; //有序链表类型

///////////////////////////////////////////////////////////////////////////
bool InitList(OrderedList &L,int n)
{
if(n==0)
return ERROR;

int i;
LinkType q;

if(L.head=((NodeType*)malloc(sizeof(NodeType))))
{
printf("请输入第1个人的密码:");
scanf("%d",&L.head->data);
L.size=1;
L.head->locate=1;
L.head->next = L.head;
}
else
return ERROR;

q=L.head;
for(i=2;i<=n;i++)
{
if(q->next=((NodeType*)malloc(sizeof(NodeType))))
{
q=q->next;
printf("请输入第%d个人的密码:",i);
scanf("%d",&q->data);
L.size++;
q->locate=i;
}
else
return ERROR;
}
q->next=L.head;

return TRUE;
}

void Joseph(OrderedList &L,int m)
{
LinkType p = L.head;
LinkType q = p;
int i;
printf("输出顺序如下:");
while( L.size > 0 )
{
i = m - 1;
while( i > 0 )
{
q = p;
p = p->next;
i--;
}
printf("第%d个人,密码为:%d\n",p->locate,p->data);
q->next = p->next;
free(p);
L.size--;
p = q->next;
}
}

void main ()
{
int m;
int n;
OrderedList T;

//n表示约瑟夫环中节点个数,m表示报数循环的个数
printf("请输入n 与 m 的值\n");
scanf("%d %d",&n,&m);
if (n<1||m<1)
{
printf("对不起,输入有误!");
exit(OVERFLOW);
}

InitList(T,n);
Joseph(T,m);

getchar();
getchar();
}