数据结构课程设计报告
数据结构课程设计报告
学院:信息工程
专业:信息工程
老师:陈占龙
姓名:郝宝亮
学号:20111001149
班号:116112-05
2013年1月
目录
控制台
1.停车场管理 (3)
2.个人电话号码查询系统 (6)
3.排序运用 (12)
4.“火烧连营”问题 (16)
5.管道铺设施工的最佳方案选择 (19)
MFC
1.停车场管理 (27)
2.个人电话号码查询系统 (29)
3.排序运用 (34)
总结
自我总结 (38)
实习题目一停车场管理
【问题描述】
设停车场是一个可停放 n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放在车场的最北端),若车场内已停满n 辆汽车,则后来的汽车只能在门外的便道上等候,一旦有车开走,则排在便道上的第一辆车即可开入;当停车场内某辆车要离开时,在它之后进入的车辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场,每辆停放在车场的车在它离开停车场时必须按它停留的时间长短交纳费用。试为停车场编制按上述要求进行管理的模拟程序。
【设计思想】
以栈模拟停车场,以队列模拟车场外的便
道,按照从终端读入的输入数据序列进行模拟管理。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息,汽车牌照号以及到达或离去的时刻。对每一组输入的数据进行操作后的输出信息为:若是车辆到达,则输出汽车在停车场内或便道上的停车位置;若是车辆离去,则输出汽车在停车场内停留的时间和应交纳的费用(在便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。需另设一个栈,临时停放为给要离去的汽车让路而从停车场推出来的汽车,也用顺序存
储结构实现。输入数据按到达或离去的时刻有序。栈中每个元素表示一辆汽车,包含两个数据项:汽车的牌照号码和进入停车场的时刻。【设计表示】
输入数据
停离
判断停车场计算停车费
【代码实现】
//主函数的实现 #include "stdafx.h" #include "iostream.h" #include "queue.h" #include "stack.h"
int main(int argc, char* argv[]) {
cout<<"请输入停车场的容量:"; int n,num,time; cin>>n; char a;
cout<<"请输入停车场车辆的情况:"<
是 否 停放在便
进入停车
调用栈、对列的入栈、
退出
SeqStack
LinkedQueue
s1.Push(a,num,time);
cout<<"车牌为 "< while (a!='E') { cin>>a>>num>>time; int time1=time; if (a=='A') { if (s1.Find(num)==true) { cout<<"车牌为"< continue;; } else { if (s1.getSize() { s1.Push(a,num,time); cout<<"车牌为 "< } else { q.EnQueue(a,num,time); cout<<"车牌为 "< } } } if (a=='D') { if (s1.Find(num)==true) //先找到此车 { int b=s1.gettime(num); cout<<"车牌为 "< for (int i=s1.getnum(num)+1;i { s1.Pop(a,num,time); // 将车辆放在零时栈 s2.Push(a,num,time); } s1.Pop(a,num,time); //退出 此车 for (i=0;i { s2.Pop(a,num,time); s1.Push(a,num,time); } if(q.getSize()>0) //如果便道中 有车,则将便道的车进入停车场 { q.DeQueue(a,num,time); s1.Push(a,num,time1); } } else { cout<<"车牌为 "< } } } return 0; } 【运行结果】 实习题目二个人电话号码查询系统 【问题描述】 人们在日常生活中经常需要查找某个人或某个单位的电话号码,本实验将实现一个简单 的个人电话号码查询系统,根据用户输入的信息(例如姓名等)进行快速查询。 基本要求: (1)在外存上,用文件保存电话号码信息;(2)在内存中,设计数据结构存储电话号码信息; (3)提供查询功能:根据姓名实现快速查询;(4)提供其他维护功能:例如插入、删除、修改等。 【设计思想】 由于需要管理的电话号码信息较多,而且要在程序运行结束后仍然保存电话号码信息, 所以电话号码信息采用文件的形式存放到外存中。在系统运行时,需要将电话号码信息从文件调入内存来进行查找等操作,为了接收文件中的内容,要有一个数据结构与之对应,可以 设计如下结构类型的数组来接收数据: const int max=10; struct TeleNumber { string name; //姓名 string phoneNumber; //固定电话号码 string mobileNumber; //移动电话号码 string email; //电子邮箱 } Tele[max]; 为了实现对电话号码的快速查询,可以将上述结构数组排序,以便应用折半查找,但是, 在数组中实现插入和删除操作的代价较高。如果记录需频繁进行插入或删除操作,可以考虑 采用二叉搜索树组织电话号码信息,则查找和维护都能获得较高的时间性能。更复杂地,需 要考虑该二叉搜索树是否平衡,如何使之达到平衡。 【设计表示】 读取内存中的 输入操作选择 查添删修【代码实现】 //结构体的实现 #include #include "stdlib.h" #include using namespace std; struct TeleNumber; istream &operator>>(istream &is,TeleNumber &c); //使编译器识别重载的运算符ostream &operator<<(ostream &os,TeleNumber &c); struct TeleNumber { string name; string phoneNumber; string mobileNumber; string email; friend istream &operator>>(istream &is,TeleNumber &c); //重载>> friend ostream &operator<<(ostream &os,TeleNumber &c); //重载<< }Tele[10]; istream &operator>>(istream &is,TeleNumber &c) { is>>https://www.doczj.com/doc/1717472480.html,>>c.phoneNumber>>c.mobileNumb er>>c.email; //输入结构体 return is; ostream &operator<<(ostream &os,TeleNumber &c) //输出结构体 { os< return os; } //二叉搜索树的实现 #include "stdlib.h" struct BSTNode //TeleNumber(E) { TeleNumber data; BSTNode *left,*right; BSTNode():left(NULL),right(NULL){} BSTNode(const TeleNumber d,BSTNode *L=NULL,BSTNode *R=NULL) :data(d),left(L),right(R){} ~BSTNode(){} void setData(TeleNumber d){data=d;} TeleNumber getData(){return data;} class BST { public: BST():root(NULL){} ~BST(){} bool Insert(const TeleNumber& e1) { return Insert(e1,root); } bool Remove(const string x) { return Remove(x,root); } bool Modify(const string x,BSTNode *&ptr); BSTNode *getroot(){return root;} BSTNode *Search(const string x,BSTNode *ptr); private: BSTNode *root; bool Insert(const TeleNumber& e1,BSTNode *&ptr); bool Remove(const string x,BSTNode *&ptr); }; //插入到二叉搜索树 bool BST::Insert(const TeleNumber& e1,BSTNode *&ptr) { int i=0; if (ptr==NULL) { ptr=new BSTNode(e1); if (ptr==NULL) { cerr<<"Out of space"< return true; } } else if (int(https://www.doczj.com/doc/1717472480.html,.substr(i,i+1)[0]) { Insert(e1,ptr->left); } else if (int(https://www.doczj.com/doc/1717472480.html,.substr(i,i+1)[0])>int(ptr->d https://www.doczj.com/doc/1717472480.html,.substr(i,i+1)[0])) { Insert(e1,ptr->right); } else return false; }; //删除二叉搜索树中的某结点 bool BST::Remove(const string x,BSTNode *&ptr) { BSTNode *temp; if (ptr!=NULL) { if (int(x.substr(0,1)[0]) { Remove(x,ptr->left); } else if (int(x.substr(0,1)[0])>int(ptr->https://www.doczj.com/doc/1717472480.html, .substr(0,1)[0])) { Remove(x,ptr->right); } else if (ptr->left!=NULL&&ptr->right!=NULL) { temp=ptr->right; while (temp->left!=NULL) { temp=temp->left; } ptr->data=temp->data; Remove(ptr->https://www.doczj.com/doc/1717472480.html,,ptr->right); } else { temp=ptr; if (ptr->left==NULL) { ptr=ptr->right; } else ptr=ptr->left; delete temp; return true; } } return false; }; //在二叉搜索树的某个值 BSTNode *BST::Search(const string x,BSTNode *ptr) { if (ptr==NULL) { return NULL; } else if (int(x.substr(0,1)[0]) .substr(0,1)[0])) { return Search(x,ptr->left); } else if (int(x.substr(0,1)[0])>int(ptr->https://www.doczj.com/doc/1717472480.html, .substr(0,1)[0])) { return Search(x,ptr->right); } else return ptr; }; bool BST::Modify(const string x,BSTNode *&ptr) { ptr=Search(x,root); cin>>ptr->data; return true; } //主函数的实现 #include