级《数据结构》课程设计题目A210 陈建华 53090119.docx
- 文档编号:29014805
- 上传时间:2023-07-20
- 格式:DOCX
- 页数:31
- 大小:22.23KB
级《数据结构》课程设计题目A210 陈建华 53090119.docx
《级《数据结构》课程设计题目A210 陈建华 53090119.docx》由会员分享,可在线阅读,更多相关《级《数据结构》课程设计题目A210 陈建华 53090119.docx(31页珍藏版)》请在冰豆网上搜索。
级《数据结构》课程设计题目A210陈建华53090119
2009级《数据结构》课程设计
[实验目的]培养学生综合运用所学理论知识求解问题的能力和协作精神。
[实验原理]针对相对复杂问题,综合数据结构、算法和相关数学知识,给出解决问题的方案,应用相关的数据结构和算法知识设计并编写代码,给出测试数据和测试方案,完成上机测试和运行结果分析。
[实验要求]
1.第一题每人独立完成,第二题以小组为单位协作完成(每组3-4人);
2.第一周内须完成第一题,第二周完成第二题;
3.检查程序前须提交设计报告(按提交报告的先后顺序检查程序);
4.每人每周提交一份设计报告(第二题重点描述自己的分工);
5.检查第二题时小组成员都要参与讲解(每人侧重讲自己完成部分);
6.每次上机必须出席,如不能到需事先提交辅导员签字的假条;
题目一:
停车场管理系统
[实验目的]
综合运用线性表、队列、排序、随机数等数据结构知识,掌握并提高分析、设计、实现及测试程序的综合能力。
[实验内容及要求]
停车场拥有M个车位和一条进入停车场的便道,便道上最多停放N辆汽车。
汽车要想进入车位,首先进入便道等候。
若有空闲车位,则停车入位,否则在便道继续等候,直至有车位空出。
若便道已经停满等候的汽车,后到达的汽车只能离开,选择其他停车场。
设计一个停车场管理系统,模拟停车场的运作,并统计停车场的收入。
(1)使用随机数产生某一时间段内进入和离开停车场的车辆数目;
(2)存储并记录如下数据项:
汽车到达和离去的时间及汽车的车号;
(3)车辆到达时,提示汽车的停车位置编号(为车辆分配编号最小的可用车位),若车位已满给出相应提示;
(4)汽车离去时,输出汽车在停车场内停留的时间和应交纳的费用。
(5)对该停车场进行统计:
统计每天到达、离开的车次,停车总时数、每天停车场的收入等。
[测试数据]
M=30,N=5,以1小时为时间的最小单位,每小时停车费30元,每小时到达的车辆数目在0-20辆之间均匀分布,车辆停留1小时后离开的概率是25%,每多停留1小时后离开概率增加25%,4小时后一定要离开。
一天以24小时计算。
[实现提示]
用队列模拟便道,可用车位需按照编号排序,申请车位时分配编号最小的车位,可用车位动态变化,选择排序方法时应考虑算法效率。
题目二:
哈夫曼编码/译码器
[实验目的]
综合运用树、线性表、文件等数据结构知识,掌握并提高分析、设计、实现及测试程序的综合能力。
[实验内容及要求]
设计一个哈夫曼编码、译码系统。
对一个ASCII编码的文本文件中的字符进行哈夫曼编码,生成编码文件;反过来,可将编码文件译码还原为一个文本文件。
(1)从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt);
(2)统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理);
(3)根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;
(4)图形化输出哈夫曼树、哈夫曼编码;
(5)将文本文件利用哈夫曼树进行编码,存储成压缩文件(编码文件后缀名.huf)
(6)用哈夫曼编码来存储文件,并和输入文本文件大小进行比较,计算文件压缩率;
(7)进行译码,将huf文件译码为ASCII编码的txt文件,与原txt文件进行比较。
[测试数据]
文本文件自行选择,至少含3000个字符。
《数据结构》课程设计报告
姓名
陈建华
学号
2009级
1班
6组
实验室:
计算机楼A209
提交日期
2010.8.24
成绩
指导教师
题目三:
哈夫曼编码/译码器
问题解析:
运用树和线性表的数据结构知识,设计huffman编码,建立一个栈,编码
从文件中读入任意一篇英文短文(文件为ASCII编码,扩展名为txt);
统计并输出不同字符在文章中出现的频率(空格、换行、标点等也按字符处理);
根据字符频率构造哈夫曼树,并给出每个字符的哈夫曼编码;
图形化输出哈夫曼树、哈夫曼编码;
将文本文件利用哈夫曼树进行编码,存储成压缩文件(编码文件后缀名.huf)
用哈夫曼编码来存储文件,并和输入文本文件大小进行比较,计算文件压缩率;
进行译码,将huf文件译码为ASCII编码的txt文件,与原txt文件进行比较
数据结构选择、算法设计:
本题采用了链表,树的数据结构。
任务分工及进度计划:
由陈建华同学完成编码和解码函数部分,由荣国东同学完成栈和队列的构造部分,由廖乐同学完成主函数,比较函数的调用方式。
用户手册用户输入file1.txt,当存在这个文件的时候,该程序可以将这个文件的字符(包括空格和换行)显示出来,并显示其个数,下一步,该程序希望用户建立一个文件(比如file2.txt),然后解码至file3.txt,将file1.txt和file.txt进行比较,核实是否相同。
同时将file2.txt和file1.txt比较输出压缩率。
,测试结果根据题目要求的测试结果正确
总结(对所作程序进行分析、评价运行效果,总结遇到的问题和解决办法)
在利用数组的建立过程中,发现比较函数使用很不方便,(例如每次要减少2个节点并插入一个),利用C++中的class可以更好的解决这个问题。
程序清单:
#include
#include
#include
#include
usingnamespacestd;
ifstreaminfile1;//读原文件
ofstreamoutfile2;
ifstreaminfile2;//读压缩文件
ofstreamoutfile3;
ifstreaminfile3;//读解码后的文件
ofstreamoutfile4;
ifstreaminfile4;
classBTNode{
public:
chardata;
intflunt;
stringhuff;
BTNode*Left;
BTNode*Right;
public:
BTNode(constcharitem,BTNode*Left1=NULL,BTNode*Right1=NULL):
data(item),Left(Left1),Right(Right1),flunt(0){}
voidSetLeft(BTNode*L){Left=L;}
voidSetRight(BTNode*R){Right=R;}
BTNode*GetLeft(){returnLeft;}
BTNode*GetRight(){returnRight;}
voidSetData(constint&item){data=item;}
char&GetData(){returndata;}
int&GetFlunt(){returnflunt;}
voidSetFlunt(constintf){flunt=f;}
};
classSNode//*****************************************栈*****************************************************
{
public:
BTNode*item;
SNode*next;
SNode(BTNode*t){item=t;next=NULL;}
};
classStack
{
public:
SNode*top;
Stack(){top=NULL;}
voidInsert(BTNode*t);
BTNode*Pop();
boolIsEmpty();
};
boolStack:
:
IsEmpty()
{
if(top==NULL)
returntrue;
else
returnfalse;
}
voidStack:
:
Insert(BTNode*t)
{
SNode*p;
p=newSNode(t);
if(IsEmpty())
top=p;
else
{p->next=top;
top=p;
}
}
BTNode*Stack:
:
Pop()
{
BTNode*p;
SNode*q;
if(top==NULL){cout<<"thestackisempty"<
else
{p=top->item;
q=top;
top=top->next;
deleteq;
returnp;
}
}
Stacks;
classLNode
{public:
charch;
intcount;
boolflag;
stringhuff;
LNode*next;
BTNode*root;
LNode(){next=NULL;}
LNode(char&ch1){ch=ch1;count=1;next=NULL;flag=0;root=NULL;}
};
classList
{
public:
LNode*head;
LNode*current;
intcount;
List(){head=newLNode();count=0;current=head;}
voidInsert(char&ch);
voidDelete();
boolIsEmpty();
voidSortInsert(LNode*pt);
voidSort();
voidBackSort();
};
voidList:
:
Insert(char&ch)
{
current->next=newLNode(ch);
current=current->next;
}
boolList:
:
IsEmpty()
{
if(count==0)
return1;
else
return0;
}
voidList:
:
SortInsert(LNode*pt)
{
LNode*p;
LNode*p1;
p1=head;
p=head->next;
while(p!
=NULL&&pt->count>p->count){p1=p;p=p->next;}
if(p==NULL)
{
p1->next=pt;
}
else
{
pt->next=p;
p1->next=pt;
}
count++;
}
voidList:
:
Delete()
{
LNode*p;
p=head->next;
head->next=p->next;
count--;
}
voidList:
:
Sort()
{
intmin;
LNode*p;
LNode*q;
LNode*p1;
LNode*q1;
LNode*temp;
p1=head;
p=p1->next;
while(p->next!
=NULL)
{q1=p;
q=p->next;
while(q!
=NULL)
{
if(q->count
{if(p->next!
=q)
{
temp=p->next;
p1->next=q;
p->next=q->next;
q->next=temp;
q1->next=p;
q=p;
p=p1->next;
}
else
{
p1->next=q;
p->next=q->next;
q->next=p;
q=p;
p=p1->next;
}
}
q1=q;
q=q->next;
}
p1=p;
p=p->next;
}
}
voidList:
:
BackSort()
{
intmin;
LNode*p;
LNode*q;
LNode*p1;
LNode*q1;
LNode*temp;
p1=head;
p=p1->next;
while(p->next!
=NULL)
{q1=p;
q=p->next;
while(q!
=NULL)
{
if(q->count>p->count)
{if(p->next!
=q)
{
temp=p->next;
p1->next=q;
p->next=q->next;
q->next=temp;
q1->next=p;
q=p;
p=p1->next;
}
else
{
p1->next=q;
p->next=q->next;
q->next=p;
q=p;
p=p1->next;
}
}
q1=q;
q=q->next;
}
p1=p;
p=p->next;
}
}
Listl;
ListListSearch;
voidtranslate()//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&translate&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&
{charc;
LNode*p;
while((c=infile1.get())!
=EOF)
{
p=(l.head);
while(c!
=p->ch&&p->next!
=NULL){p=p->next;}
if(p->next==NULL)
{
if(c==p->ch){p->count=p->count+1;}
else
{l.Insert(c);l.count=l.count+1;}
}
else
p->count=p->count+1;
p=p->next;
}
l.Sort();
/*LNode*pp=newLNode();
pp->count=1;pp->ch='z';
l.SortInsert(pp);
l.Delete();*/
p=l.head->next;//
cout<<"文件字符统计如下:
"< while(p! =NULL) { cout< '< p=p->next; } } classTree{ private: BTNode*root; public: Tree(BTNode*t=NULL){root=t;} BTNode*Create(LNode*h); BTNode*Getroot(){returnroot;} voidSetroot(BTNode*t){root=t;} intHeight(BTNode*t2); }; Treetr; BTNode*root; charresult[10000]={0};//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&createlink(level)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& classQNode { public: BTNode*node; QNode*next; friendclassLinkQuene; QNode(BTNode*t=NULL){node=t;next=NULL;} }; classLinkQuene { public: QNode*front,*rear; LinkQuene(){rear=front=newQNode();} voidInQuene(BTNode*); BTNode*OutQuene(); }; voidLinkQuene: : InQuene(BTNode*item=NULL) { rear->next=newQNode(item); rear=rear->next; } BTNode*LinkQuene: : OutQuene() { QNode*p; p=front->next; BTNode*t=p->node; front->next=p->next; deletep; if(! front->next) rear=front; returnt; } intTree: : Height(BTNode*t) { if(! t)return0; inthl,hr; hl=Height(t->GetLeft()); hr=Height(t->GetRight()); returnhl>hr? ++hl: ++hr; } BTNode*Tree: : Create(LNode*h)//&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&createtree&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& { BTNode*p1=NULL,*p2=NULL; LNode*t1=NULL,*t2=NULL; BTNode*s;BTNode*root1; intt=l.count; while(l.count>1){ t1=h->next;t2=h->next->next; l.Delete();l.Delete(); if((t1->flag==0)&&(t2->flag! =0)) { p1=newBTNode(0); p1->SetData(t1->ch); p1->SetFlunt(t1->count); p1->SetLeft(NULL); p1->SetRight(NULL); p2=t2->root; } if((t1->flag! =0)&&(t2->flag==0)) { p2=newBTNode(0); p2->SetData(t2->ch); p2->SetFlunt(t2->count); p2->SetLeft(NULL); p2->SetRight(NULL); p1=t1->root; } if((t1->flag==0)&&(t2->flag==0)) { p1=newBTNode(0); p1->SetData(t1->ch); p1->SetFlunt(t1->count); p1->SetLeft(NULL); p1->SetRight(NULL); p2=newBTNode(0); p2->SetData(t2->ch); p2->SetFlunt(t2->count); p2->SetLeft(NULL); p2->SetRight(NULL); } if((t1->flag! =0)&&(t2->flag! =0)) { p1=t1->root; p2=t2->root; } s=newBTNode(0); s->SetFlunt(p1->GetFlunt()+p2->GetFlunt()); s->SetLeft(p1);s->SetRight(p2);s->SetData('*'); LNode*s1;s1=newLNode(); s1->count=p1->GetFlunt()+p2->GetFlunt(); s1->flag=1; s1->root=s; l.SortInsert(s1); } root1=h->next->root; returnroot1; } voidBT(BTNode*a){ if(a! =NULL) cout< '< else return; BT(a->GetLeft()); BT(a->GetRight()); } voidCode(BTNode*t)//*********************************编码函数************************************************ { staticstrings=""; staticintcounter=0; if(t==NULL) return; s=s+'0';counter=counter+1; Code(t->GetLeft());counter=counter-1; s=s.erase(counter,1); s=s+'1';counter=counter+1; Code(t->GetRight());counter=counter-1; s=s.erase(counter,1); t->huff=s; } voidCompress()// { BTNode*p; p=root; if(p==NULL)return; while(p! =NULL||! s.IsEmpty())//遍历 { while(p! =NULL) { s.Insert(p); p=p->GetLeft(); } if(s.IsEmpty())return; p=s.Pop(); if(p->GetLeft()==NULL&&p->GetRight()==NULL) {ListSearch.Insert(p->data); ListSearch.current->count=p->flunt; ListSearch.current->huff=p->huff; } p=p->GetRight(); } ListSearch.BackSort(); LNode*l; cout<<"字符——哈夫曼码检索表如下: "< l=ListSearch.head->next;//打印检索表 while(l! =NULL) { cout< '<
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 数据结构 级数据结构课程设计题目A210 陈建华 53090119 课程设计 题目 A210