求助

八卦之魂 2003-10-15 07:12:58
各位兄弟姐妹大家好,小弟有一道数据结构的题目做不出来,麻烦哪位帮我做出来。不胜感激。谢谢。y-sea321@sohu.com
约瑟夫环:
编号1-N的人顺时针排成环,每人持有一密码(密码为任意一正整数,但不能重复),初始一正整数 M,任从环中一处顺时针报数,直到M时,删去该人,并取其密码作为下一次的 M',再从该人的下一个人开始报数,如此下去,直到剩下最后一人为止。
要求用链表处理,用C/C++语言描述。
...全文
34 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
hhlong 2003-10-16
  • 打赏
  • 举报
回复

厉害呀!
北极猩猩 2003-10-16
  • 打赏
  • 举报
回复
当然是一样的了,霍夫曼环,经典问题啊
playboyxp 2003-10-16
  • 打赏
  • 举报
回复
#include <iostream.h>
void main()
{
int a[17],i,j,k=1,integer;
for(i=0;i<17;i++)
a[i]=i+1;
cin>>integer;
i=-1;
while(1)
{
for(j=0;j<integer;)
{
i=(i+1)%17;
if(a[i]!=0) j++;
}
if(k==17) break;
cout<<a[i]<<" ";
a[i]=0;
k++;
}
cout<<a[i]<<endl;
}
hbDeng 2003-10-16
  • 打赏
  • 举报
回复
我当年的作业作业不知道丢哪去了,你要的话,留个言,我帮你找找
李马 2003-10-15
  • 打赏
  • 举报
回复
这是我当年的作业,和你的要求好像完全一样哦。

#include <stdio.h>
#include <stdlib.h>
/* 链表结点 */
typedef struct _linknode {
int nIndex;
int nPassword;
struct _linknode* next;
} NODE, *PNODE;
/* 函数声明 */
PNODE CreateLinkList(int* pn);
PNODE AddNode(PNODE pHead, int index);
PNODE DelNode(PNODE pHead, int index, int* pm);
void SimOut(PNODE pHead, int m, int count);
/* 主函数 */
int main(void)
{
int m, n;
PNODE pHead = CreateLinkList(&n);
printf("Please input m: ");
scanf("%d", &m);
SimOut(pHead, m, n);
return 0;
}
/* 创建链表,并返回头结点 */
PNODE CreateLinkList(int* pn)
{
int n, i;
PNODE p, q;
/* 初始化头结点 */
p = (PNODE)malloc(sizeof(NODE));
p->nIndex = -1;
p->nPassword = -1;
p->next = NULL;
/* 取得总人数 */
printf("Please input the number of the peoples: ");
scanf("%d", &n);
*pn = n;
/* 创建其它结点 */
for (i = 0; i < n; i++)
q = AddNode(p, i);
/* 创建约瑟夫环 */
q->next = p->next;
free(p);
return q;
}
/* 添加一个结点,返回其地址 */
PNODE AddNode(PNODE pHead, int index)
{
PNODE p, q;
int i = 0;
/* 定位结点 */
for (p = pHead; p->next != NULL; p = p->next)
if (i++ == index)
break;
/* 创建结点 */
q = (PNODE)malloc(sizeof(NODE));
q->nIndex = index + 1;
printf("Please input person #%d password: ", index + 1);
scanf("%d", &q->nPassword);
p->next = q;
q->next = NULL;
return q;
}
/* 删除结点,并返回前一个结点 */
PNODE DelNode(PNODE pHead, int index, int* pm)
{
PNODE p, q;
int i = -1;
/* 定位结点 */
for (p = pHead ; p != NULL; p = p->next)
if (++i == index)
break;
/* 删除结点 */
q = p->next;
printf("Number %d is out.\n", q->nIndex);
p->next = q->next;
/* pm传回新的m值 */
*pm = q->nPassword;
free(q);
/* 返回前一个结点,以备下次删除之用 */
return p;
}
/* 模拟约瑟夫环的报数过程 */
void SimOut(PNODE pHead, int m, int count)
{
int x = m;
int n = count;
PNODE p = pHead;
while (n > 0)
{
p = DelNode(p, x % n != 0 ? x % n - 1 : n - 1, &x);
n--;
}
}

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧