数据结构课程设计

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、题目:求解约瑟夫(Josephus)问题

1、【问题描述】:

有一个旅行社要从n个旅客中选出一名旅客,为他提供免费的环球旅行服务。旅行社安排这些旅客围成一个圆圈,并从帽子中取出一张纸条,用纸条上面写的正整数m(m

2、设计:

2.1概要设计:采用循环单链表实现,其中包括链表节点的设计及循环单链表类的设计。链表的数据元素有头结点和节点的数目,其中头结点的数据类型设计成节点类型,节点的数目size设计成整数类型。循环单链表类的操作集合有构造函数、析构函数、取大小函数、定位函数、插入函数、删除函数、取值函数以及求解该问题约瑟夫函数。其中的删除、取值等操作要保证参数不越界的约束条件i>=0&&i<=size-1;插入操作要满足i>=0&&i<=size;定位操作要使得i>=-1&&i<=size-1.

2.2详细设计:本问题的求解主要是对约瑟夫函数的设计。首先给该函数传入m的值,然后定义一个指针指向头结点,依照题目要求设计循环条件使指针依次指向下一结点直到找到淘汰对象,然后用事先定义的k记录,是指针指向淘汰节点的前一结点,再进行循环,直至完成题目要求。

3、测试:测试函数设计主函数接口,定义n与m的值分别为8,3.定义一个循环单链表对象,将各个数据插入到循环单链表中,再将m值传入约瑟夫函数。测试过程中出现的大部分错误主要来自于功能函数对删除节点的前一节点定位操作的错误,后来在改正过程中添加了k辅助定位,解决了该问题。

4、使用说明及设计小结:使用时每次定义好n与m的值在进行操作。该程序的设计我认为有待改进的地方还是定位操作,该解法的最终实现得益于k的引入。但不免失之普遍性,应该有更好的,更易懂的算法实现。

5、约瑟夫函数实现代码:

#include"LinList.h"

template

void LinList:: Joseph(int a)

{

int k = 0;

ListNode *p=head,*q;

while(p!=NULL)

{

for(int i=0;i

{

p=p->next;

if(p==head) i--;

}

q=p;

cout<<"淘汰第"<data<<"号"<

for(int j=0;j

{

p = p->next;

if(p==head) k=j;

}

if(size==1)

{

cout<<"优胜者为第"<

exit(0);

}

Delete(size - k -1);

}

}

测试函数:

#include

#include

#include"LinList.h"

void main(void)

{

int m=3;

int n=8;

LinList myList;

for(int i=0;i

myList.Insert(i+1,i);

myList.Joseph(m);

}

程序运行结果:

二、题目:停车场管理问题

1、【问题描述】:

设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制程序模拟该停车场的管理。

2、设计

2.1概要设计:这个问题用到的数据类型有链式队列、链式堆栈、顺序堆栈。队列类的数据成员有队列节点类的对头指针和队尾指针还有整数类型的计数器count。操作集合有构造、析构函数、入队列、出队列、非空否、取对头数据元素、随机查找及删除节点、显示队列元素等操作。链式堆栈的数据成员有堆栈节点类型的头指针和整数类型的size。操作集合有入栈、出栈、取栈顶元素、堆栈非空否等操作。其中删除操作要保证size>0。顺序堆栈类的数据成员有DataType类型的堆栈数组和整数类型的栈顶指示器,操作集合有入栈、出栈、取栈顶元素、堆栈非空否等操作。其中入栈操作要保证栈顶指示器的值小于数组的上限,删除操作要保证栈顶指示器的值大于0.

2.2详细设计:本题可用以顺序栈模拟停车场,以链式队列模拟该停车场大门外的便道。需另设一个顺序栈,临时停放为给要离去的汽车让路而从停车场退出来的汽车。输入的数据按到达或离去的时刻有序。栈中的每个元素表示一辆汽车,包括两个数据项:汽车的牌照号码和进入停车场的时刻。

3、测试:输入相应数据进行测试时,发现对于从便道转入到停车场的汽车的收费不对。改正时要将该类型汽车的入停车场时间置为为其空出车位的汽车离停车场的时间。

4、使用说明及设计总结:进行输入时要按照提示输入,注意输入的离开停车场的时间不能早于进入停车场的时间。程序的功能实现的可以,但是还是有些冗长,找到更加精练的算法会更好。

5、功能函数实现代码:

template

void Reach(SeqStack & s,LinQueue & q)

{

Car C;char nothing[2];

cout<<"\n请输入车牌号(例:鲁A1234):";

cin>>C.num;

if(s.NotFull())

{

cout<<"\n请输入时间:/** **/";

cin>>C.inpark.hour>>C.inpark.minutes;

s.Push(C);

cout<<"\n汽车"<

相关文档
最新文档