| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2273 人关注过本帖
标题:[求助]用顺序表实现约瑟夫问题
只看楼主 加入收藏
落落的哀伤
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2007-6-20
收藏
 问题点数:0 回复次数:4 
[求助]用顺序表实现约瑟夫问题
用顺序表实现约瑟夫问题,请各位高手帮帮忙~~~
后天急用,谢谢
搜索更多相关主题的帖子: 约瑟夫 顺序 
2007-06-20 18:59
ibiancheng
Rank: 1
等 级:新手上路
帖 子:148
专家分:0
注 册:2007-4-3
收藏
得分:0 
???一般(数据结构)的书上都有的好象

执著的信念,坚定的自信,勤奋的努力才是通向成功的捷径! !!
2007-06-20 21:42
herbert_1987
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:1314
专家分:0
注 册:2007-5-13
收藏
得分:0 

////////// 头文件///////////////////
typedef struct member
{
int ID;//某个人的序号
int cipher;//密码
member *next;//下一个

}Person;

typedef struct
{
Person *head;//链表头
Person *tail;//链表尾
int lenth;//链表长
}List;


/////////////算法部分( cpp 文件)/////////////////////
//约瑟夫环

//添加链表元素
void AddMember(List &list,int ID,int cipher)
{
Person *per = (Person *)malloc(sizeof(Person));
per->ID = ID;
per->cipher = cipher;

//当链表为空时
if(list.lenth == 0)
{
list.head = per;
list.tail = per;
per->next = list.head;
}
else //当链表不空时
{
per->next = list.head;
list.tail->next = per;
list.tail = per;
}
list.lenth++;
}

//用来记录输出结果的数组 初始化
void InitArray(int lenth, int **array)
{
*array = (int *)malloc(lenth * sizeof(int));
}


//处理链表(排序)
void DoList(List list, int *array)
{
int N = list.lenth;//用于循环
int arrayCount = 0;//输出数组的下标
int cip;
Person *person = list.head;
cip = person->cipher;
while(N > 0)
{
for(int i = 1; i < cip; i++)//找出下一个出列的人
person = person->next;

Person *p = person->next;

cip = p->cipher;
array[arrayCount] = p->ID;
arrayCount++;

person->next = p->next;
free(p);
N--;
}


}

////////////主函数部分 ( cpp 文件)/////////////////////
#include <iostream.h>
#include <malloc.h>
#include <stdlib.h>

#include "test2.h"
#include "algo2.cpp"


void main()
{
int max, n;
int cipher;

List list;
char loop;//循环的标志

do
{
cout<<"*************** 约瑟夫环问题 ****************"<<endl<<endl;

do
{
cout<<"输入密码的最大值: ";
cin>>max;
cout<<endl<<"输入人数: ";
cin>>n;

if(max <= 0 || n <= 0)
cout<<"你所输入的数不能小于 1,请重新输入"<<endl;
}
while(max <= 0 || n <= 0);
list.lenth = 0;

for(int i = 1; i <= n; i++)
{
cout<<"输入第 "<<i<<" 个人的密码(必须大于0): ";
do
{
cin>>cipher;
if(cipher > max)
cout<<"你所输入的数大于密码的最大值,请从新输入:"<<endl;
if(cipher <= 0)
cout<<"你所输入的数小于 1,请从新输入:"<<endl;
}
while(cipher > max || cipher <= 0);

AddMember(list, i, cipher);//添加成员
}

int *array;
InitArray(n, &array);//数组初始化

DoList(list, array);//按顺序删除成员

cout<<endl<<"************* 出列顺序为 ***************"<<endl;
for(i = 1; i <= n; i++)//输出出列顺序
{
if(i%20 == 0)
cout<<endl;
cout<<array[i-1]<<" ";
}

cout<<endl<<"是否要继续?(Y / N)"<<endl;
cin>>loop;
system("cls");//清屏幕
}
while(loop == 'Y' || loop == 'y');
}

刚好做了一个, 不是很规范, 不介意就拿去.


人生重要的不是所站的位置,而是所朝的方向
2007-06-21 17:23
aipb2007
Rank: 8Rank: 8
来 自:CQU
等 级:贵宾
威 望:40
帖 子:2879
专家分:7
注 册:2007-3-18
收藏
得分:0 
你的
main函数是不是太复杂了点!呵呵~

Fight  to win  or  die...
2007-06-22 09:45
herbert_1987
Rank: 5Rank: 5
等 级:贵宾
威 望:15
帖 子:1314
专家分:0
注 册:2007-5-13
收藏
得分:0 
以下是引用aipb2007在2007-6-22 9:45:12的发言:
你的
main函数是不是太复杂了点!呵呵~


说的也是.


人生重要的不是所站的位置,而是所朝的方向
2007-06-22 12:48
快速回复:[求助]用顺序表实现约瑟夫问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.020070 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved