数据结构课程设计.docx
- 文档编号:12515848
- 上传时间:2023-04-19
- 格式:DOCX
- 页数:46
- 大小:283KB
数据结构课程设计.docx
《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(46页珍藏版)》请在冰豆网上搜索。
数据结构课程设计
数据结构课程设计
学校:
专业:
计算机科学与技术专业
学号:
姓名:
1、集合的并、交和差运算
(一)设计题目
【问题描述】编制一个能演示执行集合的并、交和差运算的程序。
【基本要求】
(1)集合的元素限定为小写字母字符[‘a’..’z’]。
(2)演示程序以用户和计算机的对话方式执行。
【实现提示】以链表表示集合。
【选作内容】
(1)集合的元素判定和子集判定运算。
(2)求集合的补集。
(3)集合的混合运算表达式求值。
(4)集合的元素类型推广到其他类型,甚至任意类型。
(二)需求分析
LinkList();//建立只有头结点的空链表
LinkList(DataTypea[],intn);//建立有n个元素的单链表
~LinkList();//析构函数
voidPrintList();//按序号输出各元素
voidjiaoji(Node
voidbingji(Node
voidInsertSort(charr[],intn);//直接插入排序
(三)概要设计
在做第一题集合运算时,我通过有序单链表实现集合的交运算,并运算,差运算。
首先,我要对集合中的元素用有序单链表进行存储。
我首先通过直接插入排序对数组进行排序,使数组升序排列(因为我使用尾插法建立有序链表)。
在计算交集时,只需要查找单链表A和单链表B中相同的元素并保留在单链表A中。
由于用有序单链表表示集合,所以判断元素是否在B中不需要遍历表B,而是从上次搜索到的位置开始,若搜索过程中,遇到一个其值比该元素大的结点,便可以断定该元素不在该链表中,为此需设两指针p,q分别指向当前被比较的两个结点,会出现以下三种情况:
1若p->data>q->data,说明还未找到,需在表B中继续查找。
2若p->data
3若p->data==q->data,说明找到了公共元素。
同理,求并运算时,只需对单链表B中的每一个元素x,在单链表A中进行查找,若存在和x不相同的元素,则将该结点插入单链表A中。
求差运算时,只需对单链表B中的每个元素x,在单链表A中查找,若存在与x相同的结点,则将该结点从单链表A中删除。
(四)详细设计
#ifndefLinkList_H
#defineLinkList_H
template
structNode
{DataTypedata;Node
template
classLinkList
{
public:
LinkList();LinkList(DataTypea[],intn);
~LinkList();voidPrintList();Node
};
#endif
#include
usingnamespacestd;
#include"LinkList.h"
template
LinkList
:
LinkList()
{first=newNode
template
LinkList
:
LinkList(DataTypea[],intn)
{
Node
first=newNode
for(inti=0;i {s=newNode r->next=NULL; } template LinkList : ~LinkList() { Node while(first! =NULL) {q=first;first=first->next;deleteq;} } template voidLinkList : PrintList() { Node while(p! =NULL) {cout< cout< } template //要查找单链表A和单链表B中相同的元素并保留在单链表A中。 voidjiaoji(Node { Node pre=A;p=A->next;q=B->next; while(p! =NULL&&q! =NULL) { if(p->data {pre->next=p->next;deletep;p=pre->next;} elseif(p->data>q->data)q=q->next; else{p=p->next;q=q->next;pre=pre->next;} } } template //对单链表B中的每个元素x,在单链表A中查找,若存在与x相同的结点,则将该结点从单链表A中删除。 voidchaji(Node { Node pre=A;p=A->next;q=B->next; while(p! =NULL&&q! =NULL) { if(p->data {p=p->next;pre=pre->next;}//始终保证p=pre->next; if(p->data>q->data)q=q->next; if(p->data==q->data) {pre->next=p->next;deletep;p=pre->next;q=q->next;} } } template //对单链表B中的每一个元素x,在单链表A中进行查找,若存在和x不相同的元素,则将该结点插入单链表A中 voidbingji(Node { Node Node pre=A;p=A->next;q=B->next; while(p! =NULL&&q! =NULL) { if(p->data>q->data) {s=newNode pre->next=s;pre=s;q=q->next; } elseif(p->data { p=p->next;pre=pre->next; if(p==NULL&&q! =NULL){pre->next=q;p=q;} } elseif(p->data==q->data) { p=p->next;q=q->next;pre=pre->next; if(p==NULL&&q! =NULL){pre->next=q;p=q;} } } } voidInsertSort(charr[],intn) { for(inti=1;i { r[n]=r[i];//设置哨兵 for(intj=i-1;r[n] {r[j+1]=r[j];} r[j+1]=r[n]; } } #include #include #include usingnamespacestd; #include"LinkList.cpp" voidmain() { cout<<"注意,输入的字符串必须为小写字母,且不出现重复字母! "< charr1[100],r2[100]; cout<<"请输入字符串: "< cout<<"请输入字符串: "< intk1=strlen(r1);intk2=strlen(r2);InsertSort(r1,k1+1);InsertSort(r2,k2+1); LinkList cout<<"输出: "< cout<<"建立有序链表: ";L1.PrintList();cout<<"建立有序链表: ";L2.PrintList(); cout<<"1.交集."< cout<<"3.差集."< "< intchoice;cin>>choice; if(choice>0&&choice<4) switch(choice) { case1: cout<<"交运算: "< L1.PrintList();cout< case2: cout<<"并运算"< L1.PrintList();cout< case3: cout<<"差运算"< L1.PrintList();cout< } } 2、病人就医管理 (一)设计题目 【问题描述】病人到医院看病,排队看医生的情况,在病人排队过程中,主要发生两件事: (1)病人到达诊室,将病历本交给护士,排到等待队列中候诊。 (2)护士从等待队列中取出一位病人的病历,该病人进入诊室就诊。 试为医院编制按上述要求进行管理的模拟程序。 【基本要求】程序采用菜单方式,其选项及功能说明如下: (1)排队------输入病人的病历号,加入到病人排队队列中 (2)就诊-------病人排队队列中最前面的病人就诊,并将其从队列中删除。 (3)查看排队------从队首到队尾列出所有的排队病人的病历号。 (4) 下班---------退出运行。 (二)需求分析 patient();//无参构造函数 patient(char*num);//带参构造函数 patient(constpatient&per);//拷贝构造函数 ~patient();//折构函数 voiddisplay();//显示病人病历 voidinput();//输入病人病历 (三)概要设计 注意点: 在做第二题病人就医管理时,我采用的数据结构是队列,利用其先进先出的特性,病人取病历号时进队,就诊时出队。 判断对空的条件是front==rear. (四)详细设计 #include #include usingnamespacestd; classpatient//定义病人这一个类 {//病历号 public: char*number;patient();//无参构造函数 patient(char*num);//带参构造函数patient(constpatient&per);//拷贝构造函数 ~patient();//折构函数voiddisplay();//显示病人病历 voidinput();//输入病人病 }; patient: : patient() {number=NULL;} patient: : patient(char*num) { if(num) { number=newchar[strlen(num)+1];//避免浅拷贝,将病历号拷贝 strcpy(number,num); } } patient: : patient(constpatient&per)//拷贝构造函数 { if(per.number) { number=newchar[strlen(per.number)+1]; strcpy(number,per.number); } } patient: : ~patient()//折构函数 {if(number)delete[]number;} voidpatient: : display()//输出病人病历号 {cout<<"病历号: "< voidpatient: : input()//输入病人病历号 { charnum[10]; cout<<"输入病历号: "; cin>>num; if(number)delete[]number; number=newchar[strlen(num)+1];strcpy(number,num); } constintN=10; voidOutput(patient*a);//出队voidInput(patient*a);//入队 intjiuzhen(patient*a);intchakanpaidui(patient*a);voidend(patient*a); intfront=0,rear=1,z=10; voidInput(patient*a) { a[front].input();front++;z--;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 课程设计
![提示](https://static.bdocx.com/images/bang_tan.gif)