致 谢
这次的课程设计,我们四人一小组完成自己所选的课题,但是还是得到了来自很多方面的帮助。在此首先要感谢学院提供给我这次实践的机会,让我们有机会贴近现实,感受成功的喜悦;其次要感谢实验机房的老师提供优良的实验设备供我们做课程设计,正是这种良好的课程设计的环境让我们整个课程设计过程心情都非常愉快。再次要感谢指导老师的辛勤指导,每当我们遇到疑难问题时,是他一次次不厌其烦地解释和悉心地指导,我们才能闯过一个个难关,到达胜利的彼岸,是他给我们提供了一次宝贵的检验自己的机会。最后也要感谢同伴们的帮助,有了他们的支持使我遇到任何困难都觉得不是一个人在战斗。感谢所有在课程设计过程中帮助过我的人!
附 录
源代码:
#include
#include
struct LNode *next;//指向下一结点的指针 }LNode; /*构造结点*/
LNode *createNode(int m_num,int m_pwd) { LNode *p;
p=(LNode *)malloc(sizeof(LNode));//生成一个结点 p->num=m_num;//把实参赋给相应的数据域 p->pwd=m_pwd;
p->next=NULL;//指针域为空 return p; }
/*创建循环链表*/
void createList(LNode **ppHead,int n)
{/*创建单向循环链表ppHead,人数个数为n,并输入每个人的密码值,若建立失败则生成头结点,让cur指向他,若建立成功则插入结点P,cur指 向的数据元素为p,后续为\空\的结点,再把P插入循环链表ppHead中*/ int i,m_pwd;
LNode *p,*cur;//cur:浮标指针 for(i=1;i<=n;i++)
{ printf(\输入第%d个人的密码:\ scanf(\输入持有密码
p=createNode(i,m_pwd);//调用构造结点函数 if(*ppHead==NULL)//如果头结点为空 { *ppHead=cur=p;//生成头结点,让cur指向他 cur->next=*ppHead;//cur的指针域指向自身 } else//如果不为空,则插入结点 { p->next = cur->next; cur->next = p; cur= p;//cur指向新插入结点 } }
printf(\完成创建!\\n\提示链表创建完成 }
/*出队处理*/
void jose(LNode *ppHead,int m_pwd)
{/*p指向要删除结点的前一个结点,ppHead指向要删除的结点,使p=ppHead,ppHead再指向要删除结点的下一个结点,使p和ppHead链接,输出p指向结点的编号和密码值,释放ppHead,如此循环,直至把所有结点都打印和删除为止!*/
int i,j;
LNode *p;//定义指针变量 for(i=1;p!=ppHead;i++) { for(j=1;j { p=ppHead;//p赋值为ppHead,p指向要删除结点的前一个结点 ppHead=ppHead->next;//ppHead指向下一个元素 } p->next = ppHead->next;//p结点与头结点链接 i=ppHead->pwd;//i赋值为ppHead->pwd j=ppHead->num;//j赋值为ppHead->num,j为要删除的密码值 printf(\第%d个人出列,密码:%d\\n\ m_pwd=ppHead->pwd;//m_pwd赋值为ppHead->pwd free(ppHead);//释放头结点 ppHead=p->next;//ppHead重新赋值给p->next,即释放前的ppHead->pwd指针//删除报数结点 } i=ppHead->pwd;//i赋值为ppHead->pwd j=ppHead->num;//j赋值为ppHead->num printf(\最后一个出列是%d号,密码是:%d\\n\ free(ppHead);//释放头结点 } void instruction() { printf(\ printf(\约瑟夫环:\\n\ printf(\ 编号为1,2,3,4?,n的n个人按顺时针方向围坐一圈,每人持有一个密码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到时停止.报m的人出列,将他的密码m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去, 直到所有人全部出列为止.编程打印出列顺序.\\n\ printf(\ } void menu() { printf(\约瑟夫环*************************\\n\ printf(\ printf(\ [1]约瑟夫环问题的阐述 \\n\ printf(\ [2]按要求求解约瑟夫环 \\n\ printf(\ [0]退出 \\n\ printf(\欢迎使用!**********************\\n\} /*主函数模块*/ int main() { int n,m,x; LNode *ppHead=NULL; menu(); for(;;) { printf(\请选择要执行的操作:\ scanf(\ system(\ switch(x) { case 1: printf(\ printf(\约瑟夫环:\\n\ printf(\ 编号为1,2,3,4?,n的n个人按顺时针方向围坐一圈, 每人持有一个密码(正整数).一开始任选一个正整数作为报数的上限值m,从第一个人开始按顺时针方向自1开始顺序报数,报到m时停止.报m的人出列,将他的密码m作为新的m值,从他在顺时针方向上的下一人开始重新从1报数,如此下去, 直到所有人全部出列为止.编程打印出列顺序.\\n\ printf(\ main(); break; case 2: printf(\请输入总人数n:\ scanf(\ printf(\请输入开始上限数m:\ scanf(\ createList(&ppHead,n); printf(\ printf(\出队顺序:\\n\ jose(ppHead,m); printf(\约瑟夫环游戏结束!\\n\ main(); break; case 0: exit(0); default: system(\ printf(\您选择的操作有误,请重新选择...\\n\\n\\n\ main(); } } return 0; }