课程设计.docx
《课程设计.docx》由会员分享,可在线阅读,更多相关《课程设计.docx(11页珍藏版)》请在冰豆网上搜索。
课程设计
O
xuexiao
xxxx
课程名称:
数据结构课程设计
课程设计题目:
xxx
系:
xxx
专业:
xxxx
年级、班:
xxx
姓名:
xxx
学号:
xxx
指导教师:
xxx
职称:
xxx
xxxx年xx月
目录
1、问题描述·················································3
2、基本要求·················································3
3、测试数据·················································3
4、算法思想·················································3
5、模块划分·················································4
6、数据结构·················································4
7、源程序···················································5
8、测试情况·················································9
9、算法的时空分析···········································11
10、参考文献················································11
问题描述
设编号为1,2,…,n(n>0)个人按顺时针方向围坐一圈,每人持有一个正整数密码。
开始时任意给出一个报数上限值m,从第一个人开始顺时针方向自1起顺序报数,报到m时停止报数,报m的人出列,将他的密码作为新的m值,从他在顺时针方向上的下一个人起重新自1起顺序报数;如此下去,直到所有人全部出列为止。
要求设计一个程序模拟此过程,并给出出列人的编号序列。
(要求使用单循环链表)
基本要求
程序需要按照题目要求使用单循环链表的要求来实现程序功能,首先要建立一个结构体,然后还创建一个单循环链表。
在单循环链表里,需要建立函数来实现题目的需求,首先建立一个函数是运行题目问题的函数,然后还要解决出现结果的函数,即打印单循环链表的函数。
之后又要建立一个结点,即作为下一轮的M值的函数。
最后还需要解决的问题是判断此单循环链表是否为空,即也需要建立一个函数来解决此问题。
此程序必须到达的要求即是既要创建单循环链表链表,还需解决题目的要求。
测试数据
输入初始人员个数为10,然后把10个人附有一个代表的密码位,输入第一个人代表的密码位为1,第二个为2,第三个为3,,第四个为4,依次下去直到第十个人为10。
之后再输入M的初始值为5。
这样一共测试三组数据。
算法思想
程序主要是利用单循环链表的特点来实现题目要求的功能,首先要创建一个单循环链表,然后要实现人数的初始化,及要给每个人附有一个正数的密码位功能,然后就是要实现M值的初始化,即开始的人数是和M值的关系,当一个人数到M值时退出,还要把这个退出的原始密码作为下一轮的M值,从退出人的下一位开始数,M值为退出人的原始密码。
还要程序必须要打印出结果,因此又得构建一个打印函数程序,最后,还需要判断测试的链表是否为空,也要建立一个函数来实现此功能。
模块划分
在此程序中,建立了三个文件,即一个头文件,nodetype.h在此文件中主要解决的问题是建立一个结构体类型typedefstructNodeType,还要声明需要建立的函数。
如下:
voidCreaList(NodeType**,constint);/*创建单向循环链表*/
/*运行"题目"问题*/
voidStatGame(NodeType**,int);
/*打印循环链表*/
voidPrntList(constNodeType*);
/*得到一个结点*/
NodeType*GetNode(constint,constint);
/*测试链表是否为空,空为TRUE,非空为FALSE*/
unsignedEmptyList(constNodeType*);
在源文件nodetype.cpp中即要具体的实现函数功能,
voidCreaList(NodeType**ppHead,constintn)此函数主要是给人数赋予一个初始的密码,完成单循环链表的创建。
voidStatGame(NodeType**ppHead,intiCipher)此函数是解决报数,解决下一个M值的问题,并且得到循环的结果。
voidPrntList(constNodeType*pHead)此函数是打印出循环链表。
NodeType*GetNode(constintiId,constintiCipher)此函数是实现结点问题,为下一步做好空间准备。
unsignedEmptyList(constNodeType*pHead)此函数是判断创建的链表是否为空。
在main.cpp文件中,主要是调用nodetype.h和nodetype.cpp中的东西来实现函数功能。
数据结构
首先在nodetype.h中定义了一个结构体:
typedefstructNodeType
{
intid;
intcipher;
structNodeType*next;
}NodeType;
在此中序列编号id为int类型,密码cipher为int类型,还有一个结构体指针类型,指向下一个地址。
在voidCreaList(NodeType**ppHead,constintn)中,定义了两个int类型的变量iCounter,并且把iFlag复值为1;,还有两个数据结果指针变量,*pNew,和*pCur.
在voidStatGame(NodeType**ppHead,intiCipher)中,定义了两个int类型的变量,还有三个结构体指针,*pPrv,*pCur,*pDel。
在voidPrntList(constNodeType*pHead)中,定义了一个结构体指针指向pHead.
在NodeType*GetNode(constintiId,constintiCipher)中定义了一个结构体指针,*pNew。
在main函数中,定义了两个int型变量,n和m。
还要一个结构体指针*pHead。
源程序
nodetype.h
#include
#include
#include
#include
#include
usingnamespacestd;
#defineMAX_NODE_NUM100
#defineTRUE1U
#defineFALSE0U
typedefstructNodeType
{
intid;
intcipher;
structNodeType*next;
}NodeType;
/*创建单向循环链表*/
voidCreaList(NodeType**,constint);
/*运行"题目"问题*/
voidStatGame(NodeType**,int);
/*打印循环链表*/
voidPrntList(constNodeType*);
/*得到一个结点*/
NodeType*GetNode(constint,constint);
/*测试链表是否为空,空为TRUE,非空为FALSE*/
unsignedEmptyList(constNodeType*);
nodetype.cpp
#include"nodetype.h"
voidCreaList(NodeType**ppHead,constintn)
{
inti,iCipher;
NodeType*pNew,*pCur;
for(i=1;i<=n;i++)
{
cout<<"输入第"<
"<cin>>iCipher;
pNew=GetNode(i,iCipher);
if(*ppHead==NULL)
{
*ppHead=pCur=pNew;
pCur->next=*ppHead;
}
else
{
pNew->next=pCur->next;
pCur->next=pNew;
pCur=pNew;
}
}
cout<<"完成单向循环链表的创建!
"<}
voidStatGame(NodeType**ppHead,intiCipher)
{
intiCounter,iFlag=1;
NodeType*pPrv,*pCur,*pDel;
pPrv=pCur=*ppHead;
/*将pPrv初始为指向尾结点,为删除作好准备*/
while(pPrv->next!
=*ppHead)
pPrv=pPrv->next;
while(iFlag)
{
for(iCounter=1;iCounter{
pPrv=pCur;
pCur=pCur->next;
}
if(pPrv==pCur)
iFlag=0;
pDel=pCur;/*删除pCur指向的结点,即有人出列*/
pPrv->next=pCur->next;
pCur=pCur->next;
iCipher=pDel->cipher;
cout<<"第"<id<<"个人出列,密码:
"<cipher<free(pDel);
}
*ppHead=NULL;
getchar();
}
voidPrntList(constNodeType*pHead)
{
constNodeType*pCur=pHead;
if(EmptyList(pHead))
return;
do
{
cout<<"第"<id<<"个人,密码:
"<cipher<pCur=pCur->next;
}while(pCur!
=pHead);
getchar();
}
NodeType*GetNode(constintiId,constintiCipher)
{
NodeType*pNew;
pNew=(NodeType*)malloc(sizeof(NodeType));
if(!
pNew)
{
cout<<"Error,thememoryisnotenough!
"<exit(-1);
}
pNew->id=iId;
pNew->cipher=iCipher;
pNew->next=NULL;
returnpNew;
}
unsignedEmptyList(constNodeType*pHead)
{
if(!
pHead)
{
cout<<"Thelistis