数据结构 程序设计 排序系统.docx
- 文档编号:24028590
- 上传时间:2023-05-23
- 格式:DOCX
- 页数:12
- 大小:59.49KB
数据结构 程序设计 排序系统.docx
《数据结构 程序设计 排序系统.docx》由会员分享,可在线阅读,更多相关《数据结构 程序设计 排序系统.docx(12页珍藏版)》请在冰豆网上搜索。
数据结构程序设计排序系统
学号
数据结构课程设计
设计说明书
排序系统
起止日期:
2011年12月12日至2011年12月16日
学生姓名
班级
成绩
指导教师(签字)
电子与信息工程系
2011年12月16日
目录
一、设计目的1
二、设计要求1
三、设计内容1
一、需求分析2
二、问题求解2
三、总体设计2
四、详细设计4
五、调试与测试5
六、关键源程序清单和执行结果5
四、参考文献8
天津城市建设学院
课程设计任务书
2011—2012学年第1学期
电子与信息工程系软件工程专业班级
课程设计名称:
数据结构课程设计
设计题目:
排序系统
完成期限:
自2011年12月12日至2011年12月16日共1周
设计依据、要求及主要内容(可另加附页):
一、设计目的
熟悉各种数据结构和运算,会使用数据结构的基本操作解决一些实际问题。
二、设计要求
(1)重视课程设计环节,用严谨、科学和踏实的工作态度对待课程设计的每一项任务;
(2)按照课程设计的题目要求,独立地完成各项任务,严禁抄袭;凡发现抄袭,抄袭者与被抄袭者皆以零分计入本课程设计成绩。
凡发现实验报告或源程序雷同,涉及的全部人员皆以零分计入本课程设计成绩;
(3)学生在接受设计任务后,首先要按设计任务书的要求编写设计进程表;
(4)认真编写课程设计报告。
三、设计内容
题目
1)问题描述
设编号为1,2,3,……,n的n(n>0)个人按顺时针方向围坐一圈,每个人持有一个正整数密码。
开始时任选一个正整数做为报数上限m,从第一个人开始顺时针方向自1起顺序报数,报到m是停止报数,报m的人出列,将他的密码作为新的m值,从他的下一个人开始重新从1报数。
如此下去,直到所有人全部出列为止。
令n最大值取30。
要求设计一个程序模拟此过程,求出出列编号序列。
2)基本要求
(1)初步完成总体设计,搭好框架,确定人机对话的界面,确定函数个数;
(2)完成最低要求:
建立一个文件,包括某5个人的情况。
一、需求分析
本系统为实现排序功能,输入所要排序的人数,要求人数大于等于1小于等于30人并为其排号,系统运用循环链表将输入的n个人顺时针排成环。
每人手里又一张密码牌,密码拍亦要求大于等于1,记录为m的值,首先,一圈人顺时针报数。
利用指针将m指向与其相同的报数号,记录该人的报数号和密码值并将其作为作为新的m值,该人出链,指针指向下一人,重复执行以上操作直至链表为空,
记录出链顺序号。
二、问题求解
为了完成问题,根据题意可联想到使用指针和链表。
首先假设6个人顺时针排成一圈,m的初值为4,给每个人编号。
6个人的密码分别为3,4,5,2,6,1。
记录每个人的编号与密码。
设头尾指针与两个临时指针。
头尾相接,即为环,也就是一个循环链表。
从第一个人开始报数,报4的人出列,此时指针1指向4,取这个人的密码值更新m,指针指向下一人,指针2指向指针1。
该人出列,删除。
重新开始报数。
因为第四个人的密码值为2,所以在报到2的时候,第2个人出列,此时指针1指在当前人处,指针2在前一人处,出列后,指针2指向指针1。
记录当前人密码值1并更新m值,以此类推,直至链表为空,最后的出队顺序为:
4,6,1,5,2,3
三、总体设计
程序设计组成框图:
程序流程图:
四、详细设计
利用结构体与类分别存放数据,定义结构体person,并定义number,key为整型。
structperson//声明结构体类型person
{
intnumber;//number为编号
intkey;//key为密码
person*next;
};
定义类linklist,声明两个成员函数create和show。
定义人数n与m值。
classlinklist//链表类,此类包含多个person类,并控制输入输出
{
private:
intn;//用于存放人数
intm;//用于存放初始密码
person*head;//链表的头结点
public:
linklist()//定义构造成员函数,函数名与类名相同
{m=0;n=0;head=NULL;}//利用构造函数对对象中的数据成员赋初值
voidcreate();//声明环的成员函数
voidshow();//声明运算并输出的成员函数
};
Create函数用来建立相应的输入输出功能和建立循环链表。
其中,链表的定义借助两个临时指针p1,p2。
p1=newperson,利用for循环(利于一个int型数据存放结点编号,进而实现循环),通过临时指针的首尾相接,建立循环链表,输出链表数据。
考虑到链表为空的情况,添加if语句,避免出现编译错误。
建立链表的具体代码如下:
person*p1,*p2;//定义2个临时指针
for(inti=1;i<=n;i++)//for循环中用于初始化环
{
p1=newperson;//新实例化一个人的对象
p1->number=i;//给这个人编个号
cin>>p1->key;
while(p1->key<1)
{
cin>>p1->key;
}
if(i==1)//如果当前链表为空,头结点指向第一个人
{
head=p1;
p2=p1;
}
else//否则,p2永远指向尾结点,新建的结点都接到p2之后
{
p2->next=p1;
p2=p1;
}
}
p2->next=head;//把链表连成一个循环链表(就是一个环)
}
Show函数执行排序功能,设int型函数count,初值为1,通过循环语句找到第m个人,利用三个临时指针,p1.p2和p,将p1指向m个人,p2指向他的前一人,p2->next指向p1->next,实现第m人的出链,将p1指针后移一位,p指针指向该结点,即第m人,删除该结点。
此外要将m值赋给p1->key,m值更新,下一次循环开始,直至链表结点全部出链。
具体代码如下:
person*p1,*p2,*p;
p1=head;
//有n个人,所以执行n次循环
for(inti=1;i<=n;i++)
{
intcount=1;
//用count定位到第m个人,循环后,p1指向这个人,p2指向这个人的上一个人
while(count++ { p2=p1; p1=p1->next; } cout< m=p1->key;//把当前人的密码作为指向下一个人所要经过的人数 p=p1;//p指向当前这个人 p2->next=p1->next;//把这个人前面的人和后面的人连接 p1=p1->next;//下次从这个人的下一个人开始数 deletep;//从链表中删除这个人 } 主函数调用create函数和show函数 五、调试与测试 1.第一次编写程序时,忽略了链表为空时的状态,虽然程序执行无误,但在输入人数值为一的情况是时,因为指针p2找不到可停靠结点,发生编译错误。 进而想到程序缺少错误情况的分析。 六、关键源程序清单和执行结果 #include usingnamespacestd; structperson//声明结构体类型person { intnumber;//number为编号 intkey;//key为密码 person*next; }; classlinklist//链表类,此类包含多个person类,并控制输入输出 { private: intn;//用于存放人数 intm;//用于存放初始密码 person*head;//链表的头结点 public: linklist()//定义构造成员函数,函数名与类名相同 {m=0;n=0;head=NULL;}//利用构造函数对对象中的数据成员赋初值 voidcreate();//声明环的成员函数 voidshow();//声明运算并输出的成员函数 }; voidlinklist: : create()//定义成员函数create { cout<<"请输入人数: "; cin>>n; while(n<1||n>30)//人数取值范围在1到30人之间 { cout<<"人数错误,请重新输入: "< cin>>n; } cout<<"请输入m的初值: "; cin>>m; while(m<1) { cout<<"m值输入错误,请重新输入: "< cin>>m; } person*p1,*p2;//定义2个临时指针 for(inti=1;i<=n;i++)//for循环中用于初始化环 { p1=newperson;//新实例化一个人的对象 p1->number=i;//给这个人编个号 cout<<"请输入第"< "; cin>>p1->key; while(p1->key<1) { cout<<"密码输入错误,请重新第"< "< cin>>p1->key; } if(i==1)//如果当前链表为空,头结点指向第一个人 { head=p1; p2=p1; } else//否则,p2永远指向尾结点,新建的结点都接到p2之后 { p2->next=p1; p2=p1; } } p2->next=head;//把链表连成一个循环链表(就是一个环) } voidlinklist: : show()//定义类linklist中的函数show { person*p1,*p2,*p; p1=head; cout<<"**********编号序列结果**********"< //有n个人,所以执行n次循环 for(inti=1;i<=n;i++) { intcount=1; //用count定位到第m个人,循环后,p1指向这个人,p2指向这个人的上一个人 while(count++ { p2=p1; p1=p1->next; } cout< cout< m=p1->key;//把当前人的密码作为指向下一个人所要经过的人数 p=p1;//p指向当前这个人 p2->next=p1->next;//把这个人前面的人和后面的人连接 p1=p1->next;//下次从这个人的下一个人开始数 deletep;//从链表中删除这个人 } } intmain() { linklistl;//定义对象l l.create();//调用l的create函数 l.show();//调用l的show函数 return0; } 四、参考文献 1.王红梅.数据结构.清华大学出版社 2.王红梅.数据结构学习辅导与实验指导.清华大学出版社 3.严蔚敏,吴伟民.数据结构(C语言版).清华大学出版社
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 程序设计 排序系统 排序 系统
![提示](https://static.bdocx.com/images/bang_tan.gif)