Joseph环Word下载.docx
《Joseph环Word下载.docx》由会员分享,可在线阅读,更多相关《Joseph环Word下载.docx(15页珍藏版)》请在冰点文库上搜索。
设定每个人的号码
GetFirstCountValue()
循环链表已经存在,每个人的密码和号码均已设定
设定第一个出队的人的密码
GetOutputOrder(L,int,int,int*)
求解出出队的顺序
printResult(int*,int)
输出出队的顺序
2.本程序包含了3个模块:
(1)主程序模块:
voidmain()
{
初始化链表
do{
接受命令;
处理命令;
}while(命令!
=“退出”);
}
(2)链表模块:
实现链表的抽象数据类型
各模块之间的调用关系如下:
主程序模块
↓
链表模块
3.求解一条出队的顺序的算法:
voidGetOutputOrder(LinkList*L,intpersonNumber,intreportValue,intarray[MAXPERSONNUMBER])
Node*p,*q;
intcount=1,i=0;
p=(*L);
while(personNumber)
{
while(count!
=reportValue)
{
q=p;
p=p->
next;
count++;
}
array[i++]=p->
data;
reportValue=p->
password;
q->
next=p->
free(p);
p=q->
count=1;
personNumber--;
}
二.详细设计
1.设定链表结点定义
typedefstructNode
intdata;
intpassword;
structNode*next;
}Node,*LinkList;
2.完整的链表算法定义
voidCreatLinkList(LinkList*L)//创建链表
(*L)=(LinkList)malloc(sizeof(Node));
if((*L)==NULL)
printf("
fail"
);
exit
(1);
voidInitLinkList(LinkList*L,intpersonNumber)//初始化单链表
Node*p,*q;
inti;
p->
data=1;
password=GetPassword();
for(i=2;
i<
=personNumber;
i++)
q=(LinkList)malloc(sizeof(Node));
if(q==NULL)
printf("
exit
(1);
data=i;
p->
next=q;
p=q;
next=(*L);
3.相关函数的算法:
intGetPersonNumber()//设定人数
intpersonNumber;
printf("
pleaseinputthenumberofpeople:
"
scanf("
%d"
&
personNumber);
while(personNumber>
MAXPERSONNUMBER||personNumber<
0)
\nerror"
MAXPERSONNUMBER);
scanf("
returnpersonNumber;
intGetPassword()//给每个人设密码
intpassword;
staticintcount=1;
\npleaseinputthe%d'
spassword:
count);
password);
while(password>
MAXPASSWORDVALUE||password<
0)
error:
MAXPASSWORD);
count++;
returnpassword;
intGetFirstCountValue()//确定开始的上限值
intfirstCountValue;
\npleaseinputthefirstoutpassword:
firstCountValue);
while(firstCountValue>
MAXFIRSTCOUNTVALUE||firstCountValue<
MAXFIRSTCOUNTVALUE);
returnfirstCountValue;
}
voidGetOutputOrder(LinkList*L,intpersonNumber,intreportValue,intarray[MAXPERSONNUMBER])//获得正确的顺序
voidprintResult(intarray[],intpersonNumer)//输出结果
inti;
\ntheorderis:
"
for(i=0;
personNumer;
%-3d"
array[i]);
\n"
4.main函数的算法:
intmain()//主函数
LinkListL;
intpersonNumber,reportValue;
intarray[MAXPERSONNUMBER];
personNumber=GetPersonNumber();
CreatLinkList(&
L);
InitLinkList(&
L,personNumber);
reportValue=GetFirstCountValue();
GetOutputOrder(&
L,personNumber,reportValue,array);
printResult(array,personNumber);
system("
pause"
return0;
完整的程序代码为:
//***********************
//PROGRAMNAME:
约塞夫环问题*
//CONTENT:
求解出队顺序*
#include"
stdio.h"
stdlib.h"
#defineMAXPASSWORDVALUE20
#defineMAXPERSONNUMBER30
#defineMAXFIRSTCOUNTVALUE10
#defineMAXPASSWORD10
intdata;
structNode*next;
voidCreatLinkList(LinkList*);
voidInitLinkList(LinkList*,int);
intGetPassword();
intGetPersonNumber();
intGetFirstCountValue();
voidGetOutputOrder(LinkList*,int,int,int*);
voidprintResult(int*,int);
voidCreatLinkList(LinkList*L)
voidInitLinkList(LinkList*L,intpersonNumber)
intGetPersonNumber()
intGetPassword()
intGetFirstCountValue()
voidprintResult(intarray[],intpersonNumer)
intmain()
}}
三.调试分析
1.本实验的核心算法就是求解出队的顺序,在设计时我遇到一个问题,就是在函数调用顺序方面出现了错误,使得程序运行结果有误,但及时改正了。
2.该程序运用了很多链表的操作:
CreatLinkList(L),InitLinkList(L,int)。
3.求解出队顺序时调用的函数有:
GetPassword(),GetPersonNumber(),GetFirstCountValue(),printResult(int*,int),GetOutputOrder(L,int,int,int*)。
四.用户手册
1.本程序的运行环境为DevC++.
2.
首先设定要入队的人数;
然后分别键入每个人的密码,注意密码是小于10的;
最后选择一个第一个出队的人的密码开始出队,运行得出对顺序。
五.测试结果
六.附录
stdio.h就是指“standardinput&
output"
,意思就是说标准输入输出头文件。
sdlib.h里包含了C、C++语言的一些函数该文件包含了的C语言标准函数库的定义。