数据结构实验2016
数据结构实验报告-实验:1线性表的顺序存储和操作实现

}
for(inti=pos-1;i<length;i++)
if(listArray[i].equals(obj))returni+1;
return-1;
}
publicbooleanmodify(Object obj,intpos){
if(pos<1||pos>length){
List sort();
}
publicclasssequenceListimplementsList {
finalintmaxSize=10;
privateintlength;
privateObject[]listArray;
publicsequenceList(){//无参数的构造函数的定义
length=0;//线性表初始为空,即长度为0
System.out.println();
list2.preOrder();
System.out.println("线性表list2长度:"+list2.size());
}
}
publicinterfaceList {
Object value(intpos);
booபைடு நூலகம்eanadd(Object obj,intpos);
int[] a={20,16,38,42,29};
for(inti=0;i<a.length;i++) list1.add(a[i], i+1);
intn1=(Integer)list1.remove(2);
list1.add(80, 3);
intn2=(Integer)list1.value(4);
农夫过河实验报告

“数据结构与算法综合实验”课程设计报告题目:农夫过河问题学院计算机科学技术年级2014级专业计算机科学与技术学号********姓名高晗日期2016年3月30日星期三成绩评语黑龙江大学计算机科学技术学院、软件学院《数据结构与算法综合实验》报告1.系统概述(1)一个农夫带着一只狼、一只羊和一棵白菜,身处河的南岸,他要把这些东西全部运到北岸。
他面前只有一只小船,船只能容下他和一件物品,另外只有农夫才能撑船。
如果农夫在场,则狼不能吃羊,羊不能吃白菜;否则狼会吃羊,羊会吃白菜。
所以农夫不能留下羊和白菜自己离开,也不能留下狼和羊自己离开,但是狼不吃白菜。
要求给出农夫将所有东西运过河的方案。
(2)为农夫过河问题抽象数据模型,体会数据模型在求解问题中的重要作用。
(3)掌握顺序表和队列的逻辑结构和存储结构。
2.系统需求分析(1)针对实现整个过程需要多步,不同步骤中各个事物所处位置不同的情况,可定义一个结构体来实现对四个对象狼、羊、白菜和农夫的表示。
对于起始岸和目的岸,可以用0或者1来表示,以实现在程序设计中的简便性。
(2)题目要求给出四种事物的过河步骤,没有对先后顺序进行约束,这就需要给各个事物依次进行编号,然后依次试探,若试探成功,进行下一步试探。
这就需要使用循环或者递归算法,避免随机盲目运算且保证每种情况均试探到,不接受非法输入。
(3)题目要求求出农夫带一只羊,一条狼和一颗白菜过河的办法,所以依次成功返回运算结果后,需要继续运算,直至求出结果,即给出农夫的过河方案。
输出界面要求具有每一步中农夫所带对象及每步之后各岸的物体,需要定义不同的数组来分别存储上述内容,并使界面所示方案清晰简洁。
(4)实验运行环境为VC++6.0.3.系统概要设计(1)数据结构设计要模拟农夫过河的问题,用四位二进制数顺序分别表示农夫,狼,羊,白菜的位置。
用0表示农夫或某种东西在河的南岸,1表示在河的北岸。
则问题的初始状态是整数(二进制数表示为0000);问题的终结状态是整数15(二进制表示为1111)。
数据与算法基础(数据结构)实验指导书

}
/*
*前置条件:顺序表存在
*输入:要删除元素位置i
*功能:删除顺序表中位置为i的元素
*输出:无
*后置条件:顺序表删除元素
*/
template <class T>
T SeqList<T>::Delete(int i)
{
}
/*
*前置条件:顺序表存在
*输入:无
*功能:输出顺序表长度
*输出:顺序表长度
*后置条件:顺序表不变
{
}
/*
*前置条件:顺序表存在
*输入:查询元素值x
*功能:按值查找值的元素并输出位置
*输出:查询元素的位置
*后置条件:顺序表不变
*/
template <class T>
int SeqList<T>::Locate(T x)
{
}
/*
*前置条件:顺序表存在
*输入:无
*功能:顺序表遍历
*输出:输出所有元素
cout<<endl;
cout<<"顺序表a的长度为:";
cout<<a.Length()<<endl; //返回单链表长度
cout<<endl;
cout<<"按位查询第二个元素:"<<endl;
cout<<"第二个元素为:";
cout <<a.Get(2)<<endl; //查找顺序表中第二个元素
}
cout<<endl;
cout<<"顺序表a中的元素有:"<<endl;
算法与数据结构实验报告

2015-2016学年第二学期《算法与数据结构》课程实验报告专业软件工程学生姓名成晓伟班级软件141学号1410075094实验学时16实验教师徐秀芳信息工程学院实验一单链表的基本操作一、实验目的1.熟悉C语言上机环境,进一步掌握C语言的基本结构及特点。
2.掌握线性表的各种物理存储表示和C语言实现。
3.掌握单链表的各种主要操作的C语言实现。
4.通过实验理解线性表中的单链表存储表示与实现。
二、主要仪器及耗材普通计算机三、实验内容与要求1、用C语言编写一个单链表基本操作测试程序。
(1)初始化单链表(2)创建单链表(3)求单链表长度(4)输出单链表中每一个结点元素(5)指定位置插入某个元素(6)查找第i个结点元素的值(7)查找值为e 的结点,并返回该结点指针(8)删除第i个结点(9)销毁单链表2、实验要求(1)程序中用户可以选择上述基本操作。
程序启动后,在屏幕上可以菜单形式显示不同功能,当按下不同数字后完成指定的功能,按其他键,则显示错误后重新选择。
(2)要求用线性表的顺序存储结构,带头结点的单链表存储结构分别实现。
(3)主函数实现对基本操作功能的调用。
3、主要代码(1)初始化单链表LinkList *InitList(){ //创建一个空链表,初始化线性表LinkList *L;L=(LinkList *)malloc(sizeof(LinkList));L->next=NULL;return L;}(2)创建单链表//头插法void CreateListF(LinkList *L){LinkList *s;int i=1,a=0;while(1){printf("输入第%d个元素(0表示终止)",i++);scanf("%d",&a);if(a==0)break;s=(LinkList *)malloc(sizeof(LinkList));s->data=a;s->next=L->next;L->next=s;}}(3)求链表长度int ListLength(LinkList *L){ //求链表长度int n=0;LinkList *p=L;while(p->next!=NULL){p=p->next;n++;}return(n);}(4)在指定位置插入元素int InsertList(LinkList *L,int i,ElemType e){LinkList *p=L,*s;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找出要插入的位置的前一个位置if(p==NULL){return 0;}else{s=(LinkList *)malloc(sizeof(LinkList));s->data=e;s->next=p->next;p->next=s;return 1;}}(5)输出链表void DispList(LinkList *L){ //输出链表LinkList *p=L->next;while(p!=NULL){printf("%d",p->data);p=p->next;}printf("\n");}(6)查找链表中指定元素int GetElem(LinkList *L,int i){ //查找链表中指定元素LinkList *p=L;int j=0;while(j<i&&p!=NULL){j++;p=p->next;}if(p==NULL){return 0;}else{return p->data;}}(7)查找值是e的结点并返回该指针LinkList *LocateElem(LinkList *L,ElemType e){ //查找值是e的结点并返回该指针int i=1;LinkList *p=L;while(p!=NULL)if(p->data==e) return p;}if(p==NULL){return NULL;}}(8)删除元素int ListDelete(LinkList *L,int i,ElemType *e){ //删除元素LinkList *p=L,*q;int j=0;while(p!=NULL&&j<i-1){p=p->next;j++;} //找到要删除元素地址的前一个地址if(p==NULL){ return 0;} //不能删除else{q=p->next;*e=q->data;p->next=q->next;free(q); //删除成功return 1;}}(9)销毁链表void DestroyList(LinkList *L){//销毁链表LinkList *pre=L,*p=L->next;while(p!=NULL){free(pre);pre=p;p=pre->next;}free(pre);}main函数:int main(){LinkList *L;ElemType e;int i;L=InitList();CreateListF(L);DispList(L);printf("输入要查找的元素位置:\n");scanf("%d",&i);e=GetElem(L,i);printf("%d\n",e);printf("单链表长度为:%d\n",ListLength(L));printf("输入要删除元素的位置:");scanf("%d",&i);if (i>ListLength(L)){printf("超出范围重新输入");scanf("%d",&i);}if(ListDelete(L,i,&e)==0){printf("未找到元素\n");}else DispList(L);printf("输入插入元素的位置和值:");scanf("%d%d",&i,&e);InsertList(L,i,e);DispList(L);return 0;}4、测试数据及测试结果输入:23 56 12 28 45输出:四、注意事项1、存储结构定义和基本操作尽可能用头文件实现。
数据结构教案

数据结构教案(总32页) -CAL-FENGHAI.-(YICAI)-Company One1-CAL-本页仅作为文档封面,使用请直接删除2015 至2016 学年第二学期数据结构课程教案课程编码: 1261D03总学时/周学时: 80 / 5开课时间: 2016年2 月 24日第 1 周至第 16 周授课年级、专业、班级: 15级网工程2班使用教材严蔚敏. 数据结构(C语言版)[M] 北京:清华大学出版社,2011.系别/教研室:信息工程学院 / 物联网工程授课教师:刘波教学目标:《数据结构》是物联网工程专业的一门专业必修课。
用计算机解决任何问题都需要进行数据表示和数据处理,而数据表示和数据处理正是《数据结构》要研究的内容。
主要介绍如何合理地组织数据、有效地存储和处理数据,正确地设计算法以及对算法的分析和评价。
通过本课程教学,使学生了解数据结构的基本概念,理解数据结构的逻辑结构和物理结构的基本概念以及有关算法,掌握算法描述及算法的评价标准,熟悉在不同存储结构上实现不同的运算,并对算法设计的方式和技巧有所体会,旨在培养学生基本的、良好的程序设计技能,编制高效可靠的程序,并为学生日后学习操作系统和数据库等后续课程奠定基础。
教学要求:本课程主要是以抽象数据类型的观点来组织和讲解线性表、栈、队列、树、二叉树、图等各种主要的数学模型并定义为相应的抽象数据类型,给出各种物理表示法和有关算法,关于数据处理技术介绍几种主要的排序和查找算法。
学生通过学习该课程后主要应掌握以下内容:1.了解数据结构及有关的基本概念;2.了解各种抽象数据类型的性质;3.掌握各种抽象数据类型的实现和基本算法;4.对算法的时间和空间复杂性有一定的分析能力;5.能够选择适当的数据结构和存储结构以及设计有效的算法,解决实际问题;6.掌握数据结构在排序和查找等常用算法中的应用。
教学重点:抽象数据类型、顺序表、单链表、循环链表、栈、队列、数组、特殊矩阵、树和二叉树、最小生成树、拓扑排序、查找、内部排序教学难点:单链表、栈、循环队列、特殊矩阵、二叉树、关键路径、最短路径教学方法与手段:1.理论部分以讲授法为主,结合讨论及课堂练习实现教学目的。
南邮数据结构实验一

实验报告
( 2016 / 2017 学年第一学期)
课程名称数据结构A
实验名称线性表的基本运算及多项式的算术运算实验时间2017 年 3 月22 日指导单位计算机学院计算机科学与技术系
指导教师邹志强
学生姓名吴爱天班级学号B15040916 学院(系) 计算机学院专业信息安全
实验报告
实验报告
度为O(n)级别。
2、在顺序表类SeqList 中增加成员函数bool DeleteX (const T &x), 删除表中所有元素值等于x 的元素.若表中存在这样的元素, 则删除之, 且函数返回true, 否则函数返回false.
删除所有值为X的元素
注释:主要思路为,依次查找SeqList内的元素,每次都与X的值进行依次对比,如果相同则删除,不同则继续向下扫描,知道SeqList末尾,最后用Search()来检验是否删除干净,复杂度也为O(n).
如图,原数据为 7 49 73 58 30 72,逆转过后为72 30 58 73 49 7,符合预期。
DeleteX()
如图,原数据中有3个0,输出结果中已经没有0,已经删除干净,符合预期。
实验报告
如图,分别检测6X^6+3X^5+4X^2与2X^2+3X相加和相乘运算,得到
6X^6+3X^5+4X^2+2X^2+3X+2X^2+3X和12X^8+18X^7+6X^7+9X^6+8X^4+12X^3,
符合预期。
武汉理工大学数据结构与算法综合实验哈夫曼树

..
v
.. .
..
.
typedef char * pBuffer ; //其大小视原文件压缩后的大小
2.核心算法设计
(1)生成 Huffman 树和 Huffman 编码的算法 void Select(HTNode huffTree[],int m) {
int min,min2,i; min=min2=1000; for(i=0;i<m;i++)
b=b<<1; if(pBinStr[i]=='1') {
b=b|0x01; } } return b; } bool InitHead(const char *pFilename,HEAD &sHead) { char ch;
..
v
.. . .. .
..
.
.. .
//初始化文件 strcpy(sHead.type,"HUF"); sHead.length=0; for(int i=0;i<256;i++) {
..
v
.. .
..
.
.. .
二叉树的存储结构。使用结构体存储节点,使用数组存储树的节点,使用静态二叉链表方 式存储二叉树。
Huffman编码存储结构 struct HTNode
{ int weight;//权值 int parent; int lchild; int rchild; char zifu; string bianma;
..
.
.. .
学生学号
Xxx
实验课成绩
学生实验报告书
实验课程名称 开课学院
指导教师姓名 学生姓名
数据结构多项式相加实验报告doc

数据结构多项式相加实验报告篇一:数据结构实验多项式加法数据结构实验报告实验名称:多项式加减法学号:1XX10419姓名:林强实验日期:XX.5.05一、实验目的通过实现多项式的加减法,对链表有更深入的了解二、实验具体内容1、实验题目1:(1)题目设计一个一元稀疏多项式简单的加减法计算器实现要求:一元稀疏多项式简单计算器的基本功能是:(1)输入并建立多项式:A(x)?7?3x?9x8?5x17;B(x)?8x?22x7?9x8(2)输出多项式(3)多项式A和B相加,建立多项式C=A+B,并输出相加的结果多项式C(4)选作:多项式A和B相减,建立多项式C=A-B,并输出相加的结果多项式D(2)分析1:本程序的任务是实现两个多项式的加法其中多项式的系数为浮点型,指数为整数,输出的结果也为系数和指数。
(1)输入的形式和输入值的范围:输入多项式的系数a和未知数X的指数b,当a和b都为零时,输入结束。
输入值的范围:a为实数,b为整数。
(2)输出形式:输出多项式的系数和多项式未知数X 的指数即(a,b)形式。
(3)程序所能达到的功能,实现两个多项式的加法,并输出最后的结果2:整个程序运行期间实行动态创建节点,一边输入数据,一边创建节点当将全部数据输入到单链表中后再调用多项式加法这个函数,并一边实现多项式的相加,一边释放节点,有效防止了在程序反复运行过程中可能出现系统空间不够分配的现象(3)实验代码typedef int Status;#define OVERFLOW -1#define null 0typedef struct Lnode{float coef; //存储项系数int expn;//存储项指数struct Lnode *next;}Lnode,*LinkList;typedef LinkList polynomial;Status InitList_L(LinkList &L) {//初始化头节点L=(LinkList)malloc(sizeof(Lnode));if(!L)return(-1);L->next=null;return 1;}void AddPolyn(polynomial pa, polynomial pb){ //实现两个多项式相加的算法float x;polynomial qa;polynomial qb;polynomial s;polynomial u;qa=pa->next; qb=pb->next; s=pa;while(qa&&qb){if(qa->expnexpn){s=qa;qa=qa->next;}else if(qa->expn==qb->expn){x=qa->coef+qb->coef;if(x!=0){qa->coef=x;s=qa;qa=qa->next;u=qb;qb=qb->next;free(u);}else{s->next=qa->next;free(qa);qa=s->next;u=qb;qb=qb->next;free(u);}}else if(qa->expn>qb->expn){ u=qb->next;s->next=qb;s=qb;qb->next=qa;qb=u;}}if(qb)qa->next=qb;free(pb);}void main(){float a;int b;polynomial L1;polynomial L2; LinkList q;LinkList p;LinkList m;LinkList n;InitList_L(L1);q=L1;InitList_L(L2);p=L2;cout 请输入数据:" for(;;){ cin>>a;cin>>b;if(a==0&&b==0) break;m=new Lnode;m->coef=a;m->expn=b;q->next=m;q=m;q->next=null;}//循环输入第一个多项式的系数与指数for(;;){cin>>a;cin>>b;if(a==0&&b==0)break;n=new Lnode;n->coef=a;n->expn=b;p->next=n;p=n;p->next=null;}//循环输入第二个多项式的系数与指数AddPolyn(L1,L2);//调用多项式相加的算法while((L1->next)!=null){coutnext->coefnext->expn L1=L1->next;}//输出计算结果}三、实验小结通过编写多项加法这个程序,我将自己所学到的创建链表,初始化链表和多项式加法算法都应用了一次,这使我们不仅仅只是理论化的学习书本上的知识,而是将学习到的理论知识应用到实际的操作中来增强我们的实际操作能力,这使我增加了实际操作经验,也使我通过实际操作来认识到自己在程序编写上的不足从而增强了我的实际编写程序的能力。
2016春《数据结构》作业100%

华师网院2016春《数据结构》作业100%1.第1题以下叙述错误的是( )。
A.数据的三个层次是数据、数据元素、数据项B.数据类型是指相同性质的计算机数据的集合C.每种逻辑结构都有一个运算的集合D.储存结构中不仅要储存数据的内容,还要把数据间的关系表示出来。
您的答案:B题目分数:2此题得分:2.02.第2题多维数组之所以有行优先顺序和列优先顺序两种存储方式是因为( )。
A.数组的元素处在行和列两个关系中B.数组的元素必须从左到右顺序排列C.数组的元素之间存在次序关系D.数组是多维结构,内存是一维结构您的答案:A题目分数:2此题得分:2.03.第3题线性表采用链式存储时,其地址( )。
A.必须连续B.部分地址必须连续C.一定不连续D.连续与否均可您的答案:D题目分数:2此题得分:2.04.第5题线索二叉树中某结点为叶子的条件是( )。
A.p-> lchild!=NULL || p-> rchild!=NULLB.p-> ltag==0 || p-> rtag==0C.p-> lchild!=NULL && p-> rchild!=NULLD.p-> ltag==1 && p-> rtag==1您的答案:D题目分数:2此题得分:2.05.第6题设有向图n个顶点和e条边,进行拓扑排序时,总的计算时间为( )。
A)O(nlogn)2B)O(en)n)C)O(elog2D)O(n+e)A.AB.BC.CD.D您的答案:D题目分数:2此题得分:2.06.第7题n)且稳定的排序方法是( )。
最好和最坏时间复杂度均为O(nlog2A.快速排序B.堆排序C.归并排序D.基数排序您的答案:C题目分数:2此题得分:2.07.第8题假定有k个关键字互为同义词,若用线性探测法把这k个关键字存入散列表中,至少要进行( )次探侧。
A.k-1B.kC.k+1D.k(k+1)/2您的答案:D题目分数:2此题得分:2.08.第9题n个记录直接选择排序时所需的记录最多交换次数是( )。
约瑟夫环问题实验报告

//报数为m的人出列
while(n--)
{
for(int s=m-1; s--; r=p, p = p->link);
cout << "The output is: " << p->data << endl;
r->link = p->link;
LinkList d = new LNode;
if(!d)
二、实验问题描述
设编号为1,2,···,n的n个人围坐一圈,约定编号为k(1≤k≤n)的人从1开始报数,数到m的那个人出列,他的下一位又从1开始报数,数到m的那个人又出列,依次类推,直到所有人出列为止,由此产生一个出队编号的序列。
3、实验步骤
1、实验问题分析
①由于当某个人退出圆圈后,报数的工作要从下一个人开始继续,剩下的人仍要是围成一个圆圈,可以使用循环表;由于退出圆圈的工作对应着表中结点的删除操作,对于这种删除操作频繁的情况,应该选用效率较高的链表结构;为了程序指针每一次都指向一个具体的代表一个人的结点而不需要进行判断,链表不带表头结点。所以,对于所有人围成的圆圈所对对应的数据结构采用一个不带头结点的循环链表来描述。设头指针为p,并根据具体情况移动
可以采用数据类型定义: Typedef struct node {
int number;
struct node *next; }Lnode,*Linklist;
②为了记录退出的人的先后顺序,采用一个顺序表进行存储,程序结束后再输入依次退出的人的编号顺序。由于只记录各个结点的number值就可以,所以定义一个整型一维数组。如“int quite[N];”N为一个根据实际问题定义的一个足够大的整数。
(完整)2016最新广工anyview数据结构答案

【题目】若两棵二叉树T1和T2皆为空,或者皆不空且T1的左、右子树和T2的左、右子树分别相似,则称二叉树T1和T2相似.试编写算法,判别给定两棵二叉树是否相似.二叉链表类型定义:typedef struct BiTNode {TElemType data;struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;**********/Status Similar(BiTree T1, BiTree T2)/*判断两棵二叉树是否相似的递归算法*/{if(!T1&&!T2)//同为空时,两树相似return TRUE;else if(T1&&T1){if(Similar(T1 -> lchild,T2 -> lchild)&& Similar(T1 -> rchild,T2 —> rchild))//两树都不为空时,判断左右子树是否相似return TRUE;elsereturn FALSE;}else//以上两种情况都不符合,就直接返回FALSEreturn FALSE;}/**********【题目】编写递归算法,求对二叉树T先序遍历时第k个访问的结点的值。
二叉链表类型定义:typedef struct BiTNode {TElemType data;struct BiTNode *lchild, *rchild;} BiTNode, *BiTree;**********/TElemType PreOrder(BiTree T, int &k) {TElemType x=’#’;if(T==NULL)return '#';if(k==1)return T-〉data;if(T—>lchild!=NULL){k--;x=PreOrder(T—>lchild,k);}if(T->rchild!=NULL&&x==’#’){k—-;x=PreOrder(T-〉rchild, k);}return x;}TElemType PreOrderK(BiTree T, int k)/* 求对二叉树T先序遍历时第k个访问的结点的值。
数据结构程序设计课题

衡阳师范学院工科课程设计 -《数据结构》课程设计报告题目:迷宫问题(栈)学号:14450139 14450132姓名:鲁向阳肖吟月班级:物联网班(1405)指导教师:王杰老师日期:2016年6月目录1概述 (4)1.1 课程设计目的 (4)1.2 开发环境 (4)1.3 任务分配 (4)2需求分析 (5)2.1 题目内容 (5)2.2 设计思想说明 (5)2.3 数据结构设计 (6)3算法的设计 (7)3.1 定义坐标(X,Y): (7)3.2 定义方向: (7)3.3 定义/链表结点: (7)3.4 定义栈: (8)3.5 定义迷宫定义移动的4个方向: (8)4各模块的伪码算法 (9)4.1 根据输入产生一个8*8的迷宫: (9)4.2 探索路径函数: (11)4.3 输出迷宫 (15)5函数的调用关系图 (17)6.1 自动生成迷宫运行情况 (18)7心得体会 (19)参考文献 (20)附录 (21)1概述1.1课程设计目的本次课程设计是迷宫求解问题,主要是模拟从入口到出口的通路。
程序中的数据采取的是“栈”作为数据的逻辑结构,并且使用链式存储结构,即是实现一个以链表作存储结构的栈类型。
本课程设计实现了链栈的建立,入栈,出栈,判断栈是否为空的方法,关键的是迷宫通路路径的“穷举求解”和递归求解的方法。
1.2开发环境具有Intel酷睿i3处理器且满足以下要求的计算机:4GB 内存,500GB 硬盘;安装Visual C++ 6.0。
1.3任务分配两人一起查找相关资料,整合并进行探讨。
其中一人通过查找的资料先行拟定文件的大纲,初步定稿后,然后再由另一个人进行进一步加工,细化,最后两人一起核实文件,进行进一步的升华,最终完成该任务。
2需求分析2.1题目内容以一个m*n的长方阵表示迷宫,0和1分别表示迷宫中的通路和障碍。
设计一个程序,对任意设定的迷宫,求出一条从入口到出口的通路,或得出没有通路的结论。
2.2设计思想说明计算机解迷宫通常用的是“穷举求解”方法,首先从迷宫的入口开始,如果该位置就是迷宫出口,则已经找到了一条路径,搜索工作结束。
数据结构实验报告-单链表

2016级数据结构实验报告实验名称:实验一线性表——题目1学生姓名:李文超班级:2015661131班内序号:15学号:2015522147日期:2016年11月13日1.实验要求实验目的:根据线性表的抽象数据类型的定义,选择下面任一种链式结构实现线性表,并完成线性表的基本功能。
线性表存储结构(五选一):1、带头结点的单链表2、不带头结点的单链表3、循环链表4、双链表5、静态链表线性表的基本功能:1、构造:使用头插法、尾插法两种方法2、插入:要求建立的链表按照关键字从小到大有序3、删除4、查找5、获取链表长度6、销毁7、其他:可自行定义编写测试main()函数测试线性表的正确性。
2.程序分析2.1 存储结构单链表的存储:(1)链表用一组任意的存储单元来存放线性表的结点。
这组存储单元既可以是连续的,也可以是不连续的,甚至零散地分布在内存的某些位置。
(2)链表中结点的逻辑次序和物理次序不一定相同。
为了能正确表示结点间的逻辑关系,在存储每个元素值的同时,还要存储该元素的直接后继元素的位置信息,这个信息称为指针或链。
结点结构┌──┬──┐ data 域---存放结点值的数据域│data │next │ next 域---存放结点的直接后继的地址的指针域└──┴──┘单链表在内存中的存储示意地址 内存单元1000H头指针 1020H1080H10C0H2.2 关键算法分析1、关键算法:(1)头插法自然语言描述:a:在堆中建立新结点b:将a[i]写入到新结点的数据域c:修改新结点的指针域d:修改头结点的指针域。
将新结点加入链表中伪代码描述a:Node <T> * s=new Node <T>b:s->data=a[i]c:s->next=front->next;d:front->next=s(2)尾插法自然语言描述:a:在堆中建立新结点:b:将a[i]写入到新结点的数据域:c:将新结点加入到链表中d:修改修改尾指针伪代码描述a:Node <T> * s=new Node <T>b:s->data=a[i]c:r->next=s;d:r=s(3)遍历打印函数自然语言描述:a:判断该链表是否为空链表,如果是,报错b:如果不是空链表,新建立一个temp指针c:将temp指针指向头结点d:打印temp指针的data域e:逐个往后移动temp指针,直到temp指针的指向的指针的next域为空伪代码描述a: If front->next==NULL①Throw ”an empty list ”②Node<T>* temp=front->next;b:while(temp->next)c:cout<<temp->data<<" ";d:temp=temp->next;(4) 获取链表长度函数自然语言描述:a:判断该链表是否为空链表,如果是,输出长度0b:如果不是空链表,新建立一个temp指针,初始化整形数n为0c:将temp指针指向头结点d:判断temp指针指向的结点的next域是否为空,如果不是,n加一,否则return ne: 使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next域为0,返回n伪代码描述a:if ront->next==NULLb:Node<T>* temp=front->next;c:while(temp->next)d:temp=temp->next;(5)析构/删除函数自然语言描述:a:新建立一个指针,指向头结点b:判断要释放的结点是否存在,c:暂时保存要释放的结点d:移动a中建立的指针e:释放要释放的指针伪代码描述a:Node <T> * p=frontb:while(p)c:front=pd:p=p->nexte:delete front(6)按位查找函数自然语言描述:a:初始化工作指针p和计数器j,p指向第一个结点,j=1b:循环以下操作,直到p为空或者j等于1①:p指向下一个结点②:j加1c:若p为空,说明第i个元素不存在,抛出异常d:否则,说明p指向的元素就是所查找的元素,返回元素地址伪代码描述a:Node <T> * p=front->next;j=1;b:while(p&&j!=1)①:p=p->next②:j++c:if(!p) throw ”error”d:return p(7)按位查找函数自然语言描述:a:初始化工作指针p和计数器j,p指向第一个结点,j=1b:循环以下操作,找到这个元素或者p指向最后一个结点①:判断p指向的结点是不是要查找的值,如果是,返回j,否则p指向下一个结点,并且j的值加一c:如果找到最后一个结点还没有找到要查找的元素,返回查找失败信息伪代码描述a:Node <T> * p=front->next;j=1;b:while(p)①: if(p->next==x) return jp=p->nextj++c:return “error”(8)插入函数自然语言描述:a:在堆中建立新结点b:将要插入的结点的数据写入到新结点的数据域c:修改新结点的指针域d:修改前一个指针的指针域,使其指向新插入的结点的位置伪代码描述a:Node <T> * s=new Node <T>;b:s-data=p->datac:s->next=p->nextd:p->next=se:p->data=x(9)删除函数自然语言描述:a:从第一个结点开始,查找要删除的位数i前一个位置i-1的结点b:设q指向第i个元素c:将q元素从链表中删除d:保存q元素的数据e:释放q元素伪代码描述a:q=p->nextb:p->next=q->nextc:x=q->datad:delete q2、代码详细分析(插入):(1)从第一个结点开始,查找节点,使它的数据比x大,设p指向该结点:while (x>p->data) { p=p->next;}(2)新建一个节点s,把p的数据赋给s:s->data=p->data;(3)把s加到p后面:s->next=p->next; p->next=s;(4)p节点的数据用x替换:p->data=x;示意图如图所示xp->datas3、关键算法的时间复杂度:O(1)3.程序运行结果1. 流程图:2、结果截图3.测试结论:可以正确的对链表进行插入,删除,取长度,输出操作。
北京大学2016年秋季学期《数据结构》课程作业【答案】

树形结构中元素之间存在一对多_关系。(第一章)
2
n
3.一个算法的最基本的原操作执行次数为(3n +2nlog2 +4n-7)/(7n),则该算法的时间
复杂度为_ O(n)______。(第一章)
4.链式存储结构用一组地址任意的存储单元依次存放数据元素,数据元素之间的逻辑
关系通过__指针________间接地反映。(第二章)
答 顺序表的优点势可以随机访问数据元素;缺点是大小固定,不利于增减结点(增 减操作需要移动元素)。链表的优点是采用指针方式增减结点,非常方便(只需要改 变指针指向,不移动结点)。其缺点是不能进行随机访问,只能顺序访问;另外,每
第5页 共 10 页
个结点上增加指针域,造成额外存储空间增大。
2. (第二章)在一个单链表 HL 中删除指针 p 所指结点,应执行如下关键操作: if(________) HL = HL->next; else { q = HL; while(________) q = q->next; _____________; } delete p;
件是_____B_____。(第五章)
a 空或只有一个结点
b 高度等于其结点数
c 任一结点无右孩子
d 任一结点无左孩子
21. 树的基本遍历策略分为先根遍历和后根遍历;二叉树的基本遍历策略可分为先序
遍历、中序遍历和后序遍历。结论___A_______是正确的。(第五章)
a.树的先根遍历序列与其对应的二叉树的先序遍历序列相同
08,09},R={r},r={<01,02>,<01,03>,<01,04>,<02,05>,<02,06>,<03,
用队列模拟病人排队

数据结构课程设计报告(2015/2016学年第2学期)学生姓名:学生专业:计算机科学与技术学生班级:学生学号:上机环境:Visual C++ 6.02016年4月23日实验题目:编写一个程序exp3—7.cpp,反应病人到医院看病,排队看医生的情况。
要求模拟病人等待就诊这一过程。
程序采用菜单方式,其选项及功能说明如下:⑴排队——输入排队病人的病历号,加入到病人排队队列中;⑵就诊——病人排队队列中最前面的病人就诊,并将其从队列中删除;⑶查看排队——从队首到队尾列出所有的排队病人的病历号;⑷不再排队,余下依次就诊——从队首到队尾列出所有的排队病人的病历号,并退出运行;⑸下班——退出运行。
实验文件:exp3_7.h#ifndef exp3_7_h#define exp3_7_h#define _Nmax 11#include <string>using namespace std;typedef char Type;typedef struct patient{Type name[20];int age;Type sex[5];Type number[_Nmax];} ElemType;typedef struct qnode{ElemType data;struct qnode * next;} QNode;typedef struct{QNode * front;QNode * rear;} LiQueue;void InitQueue( LiQueue * &q);//初始化队列void DestroyQueue( LiQueue * &q);//销毁队列bool QueueEmpty( LiQueue * &q);//判断队列是否为空void enQueue( LiQueue * &q, ElemType e);//进队列bool deQueue( LiQueue * &q, ElemType &e);//出队列void scanf_pat( ElemType &p);//输入病人的信息void printf_pat( ElemType &e);//输出下一个病人的信息void operation();//操作void printf_Menu();//菜单#endifexp3_7.cpp#include <iostream>#include "exp3_7.h"#include <string>using namespace std;void InitQueue( LiQueue * &q){q = ( LiQueue *)malloc(sizeof( LiQueue));q->front = q->rear = NULL;}void DestroyQueue( LiQueue * &q){QNode * p = q->front , * r;if( p!= NULL){r = p->next ;while ( r!= NULL){free(p);p = r;r = p->next ;}}free(p);free(q);}bool QueueEmpty( LiQueue * &q){return( q->rear == NULL);}void enQueue( LiQueue * &q, ElemType e) {QNode * p;p = (QNode *)malloc(sizeof( QNode));p->data = e;p->next = NULL;if( q->rear == NULL)q->front = q->rear = p;else{q->rear ->next = p;q->rear = p;}}bool deQueue( LiQueue * &q, ElemType &e) {QNode * t;if( q->rear ==NULL)return false;t = q->front ;if( q->front == q->rear )q->front = q->rear = NULL;elseq->front = q->front ->next ;e = t->data;free(t);return true;}void scanf_pat( ElemType &p){cout<<"输入病人的姓名:";cin>> ;[19] = '\0';cout<<"输入病人的性别:";cin>> p.sex ;p.sex [4] = '\0';cout<<"输入病人的年龄:";cin>> p.age;cout<<"输入病人的编号:";cin>> p.number ;p.number [_Nmax-1] = '\0';}void printf_pat( ElemType &e){cout<<"下一个病人"<<'\n'<<"姓名:"<< <<'\n'<<"性别:"<< e.sex <<'\n'<<"年龄:"<< e.age <<'\n'<<"病历号:"<< e.number <<endl; }void operation(){ElemType p ,e;LiQueue * q;int n;InitQueue(q);printf_Menu();cin>>n;cout<<endl;while(n != 5){switch(n){case 1:scanf_pat(p);enQueue(q,p);break;case 2:if(deQueue(q,e) == true)printf_pat(e);break;case 3:QNode *t;t = q->front;while(q->front != NULL){e = q->front->data;printf_pat(e);q->front = q->front->next;};q->front = t;break;case 4:while(q->front != NULL){if(deQueue(q,e) == true)printf_pat(e);};break;}cout<<"请选择你所需的功能:";cin>>n;cout<<endl;}}void printf_Menu(){cout<<"******************choose yourfunction*********************"<<endl;cout<<" 1.排队 2.就诊"<<endl;cout<<" 3.查看排队 4.不再排队,余下依次就诊"<<endl;cout<<" 5.退出运行"<<endl;cout<<"请选择你所需要的功能:";}exp3_7_main.cpp#include <iostream>#include <string>using namespace std;#include "exp3_7.h"int main(){operation();return 0;}算法描述:程序采用链队储存数据,用switch函数进行功能选择:1.排队操作采用函数enQueue(q,e)进队;2.就诊操作使用deQueue(q,e)函数和printf(e)函数实现;3.查看排队采用q->front依次输出数据;4.不再排队,余下病人就诊用while语句和deQueue(q,e)函数和printf(e)函数实现;5.退出实验数据:。
数据结构课程设计

数据结构课程设计----个人设计报告专业:班级:姓名:学号:指导教师:日期: 2016年X月XX日至XX日目录1 课程设计目的 (3)2 课程设计内容和要求 (3)3 任务完成情况 (3)4 设计报告 (4)4.1顺序表应用 (4)4.1.1 设计目的 (4)4.1.2 设计内容及要求 (4)4.1.3 需求分析 (5)4.1.4 概要设计 (7)4.1.5 详细代码 (8)4.1.6 使用说明 (8)4.1.7 测试结果与分析 (8)4.1.8 参考文献 (10)4.2链表应用 (10)4.2.1 设计目的 (10)4.2.2 设计内容及要求 (11)4.2.3 需求分析 (12)4.2.4 概要设计 (14)4.2.5 详细代码 (16)4.2.6 使用说明 (16)4.2.7 测试结果与分析 (16)4.2.8 参考文献 (18)4.3树和二叉树 (19)4.3.1 设计目的 (19)4.3.2 设计内容及要求 (19)4.3.3 需求分析 (19)4.3.4 概要设计 (20)4.3.5 详细代码 (21)4.3.6 使用说明 (21)4.3.7 测试结果与分析 (22)4.3.8 参考文献 (22)5 体会与感想 (23)附录: (24)设计一(顺序表应用)的代码 (24)设计二(链表的应用)的代码 (35)设计三(二叉树应用)的代码 (47)1 课程设计目的1、学习获取知识的方法;2、提高发现问题、分析问题和解决实际问题的能力;3、加强创新意识和创新精神;4、加强团队的分工与合作;5、掌握面向实际背景思考问题的方法。
2 课程设计内容和要求内容:(仅供参考,请根据实际完成情况填写)第一章前言第二章顺序表与链表的应用第三章树结构的应用第四章图结构的应用第五章赫夫曼编码的应用要求:完成第2章、第3章中每章的比作必做任务。
在完成个人任务的基础上,完成第4章第5章的小组任务。
每人必须在完成个人任务的基础上提交个人任务的设计报告,内容包括:任务名称、目的、具体内容、需求分析、概要设计、主要代码分析、测试结果、收获与体会。
数据结构栈和队列实验报告

数据结构栈和队列实验报告南京信息⼯程⼤学实验(实习)报告实验(实习)名称栈和队列⽇期2017.11.8 得分指导⽼师崔萌萌系计算机系专业软件⼯程年级2016 班次(1) 姓名学号⼀、实验⽬的1、学习栈的顺序存储和实现,会进⾏栈的基本操作2、掌握递归3、学习队列的顺序存储、链式存储,会进⾏队列的基本操作4、掌握循环队列的表⽰和基本操作⼆、实验内容1、⽤栈解决以下问题:(1)对于输⼊的任意⼀个⾮负⼗进制数,显⽰输出与其等值的⼋进制数,写出程序。
(2)表达式求值,写出程序。
2、⽤递归写出以下程序:(1)求n!。
(2)汉诺塔程序,并截图显⽰3、4、5个盘⼦的移动步骤,写出移动6个盘⼦的移动次数。
3、编程实现:(1)创建队列,将asdfghjkl依次⼊队。
(2)将队列asdfghjkl依次出队。
4、编程实现创建⼀个最多6个元素的循环队列、将ABCDEF依次⼊队,判断循环队列是否队满。
三、实验步骤1.栈的使⽤1.1 ⽤栈实现进制的转换:代码如下:#include#includeusing namespace std;int main(){stack s; //栈s;int n,radix;printf("请输⼊要转换的⼗进制⾮负整数: ");scanf("%d",&n);printf("请输⼊⽬标进制: ");scanf("%d",&radix);printf("转换为%d进制: ",radix);while(n) {s.push(n%radix);n /= radix;}while(!s.empty()) { //⾮空printf("%d",s.top());s.pop();}printf("\n");return 0;}运⾏结果如下:2.2 求表达式的值代码如下:#include#include#include#include#define true 1#define false 0#define OPSETSIZE 8typedef int Status;unsigned char Prior[8][8] = { //运算符优先级表// '+' '-' '*' '/' '(' ')' '#' '^'/*'+'*/ '>','>','<','<','<','>','>','<',/*'-'*/ '>','>','<','<','<','>','>','<',/*'*'*/ '>','>','>','>','<','>','>','<',/*'/'*/ '>','>','>','>','<','>','>','<',/*'('*/ '<','<','<','<','<','=',' ','<',/*')'*/ '>','>','>','>',' ','>','>','>',/*'#'*/ '<','<','<','<','<',' ','=','<',/*'^'*/ '>','>','>','>','<','>','>','>'};typedef struct StackChar { //StackChar类型的结点SC char c;struct StackChar *next;}SC;struct StackFloat *next;}SF;SC* Push(SC* s,char c) //SC类型的指针Push,返回p{SC* p = (SC* )malloc(sizeof(SC));p->c = c;p->next = s;return p;}SF* Push(SF* s,float f) //SF类型的指针Push,返回p{SF* p = (SF* )malloc(sizeof(SF));p->f = f;p->next = s;return p;}SC* Pop(SC* s) //SC类型的指针Pop{SC* q = s;s = s->next;free(q);return s;}SF* Pop(SF* s) //SF类型的指针Pop{SF* q = s;s = s->next;free(q);return s;}float Operate(float a,unsigned char theta, float b) //计算函数Operate { switch(theta){case '+': return a+b;case '-': return a-b;case '*': return a*b;case '/': return a/b;case '^': return pow(a,b);default : return 0;}char OPSET[OPSETSIZE] = {'+','-','*','/','(',')','#','^'};Status In(char Test,char *TestOp){int Find = false;for (int i=0; i< OPSETSIZE; i++) {if(Test == TestOp[i]) Find = true;}return Find;}Status ReturnOpOrd(char op,char *TestOp){for(int i=0; iif(op == TestOp[i]) return i;}}char precede(char Aop, char Bop){return Prior[ReturnOpOrd(Aop,OPSET)][ReturnOpOrd(Bop,OPSET)];}float EvaluateExpression(char* MyExpression)//表达式的运算符优先算法{//OPTR和OPND分别为运算符栈和运算数栈,OP为运算符集合SC* OPTR = NULL; //运算符栈,字符元素SF* OPND = NULL; //运算数栈,实数元素char TempData[20];float Data,a,b;char theta, *c, Dr[] = {'#','\0'};OPTR = Push(OPTR,'#');c = strcat(MyExpression,Dr);strcpy(TempData,"\0"); //字符串拷贝函数while (*c != '#' || OPTR->c != '#') {if (!In(*c, OPSET)) {Dr[0] = *c;strcat(TempData,Dr); //字符串连接函数c++;if (In(*c, OPSET)) {Data = atof(TempData); //字符串转换函数(double) OPND = Push(OPND, Data); strcpy(TempData,"\0");}} else { //不是运算符则进栈switch (precede(OPTR->c, *c))case '<': //栈顶元素优先级低OPTR=Push(OPTR, *c); c++; break;case '=': //去括号并接收下⼀字符OPTR = Pop(OPTR); c++; break;case '>': //退栈并将运算结果⼊栈theta = OPTR->c; OPTR = Pop(OPTR);b = OPND->f; OPND = Pop(OPND);a = OPND->f; OPND = Pop(OPND);OPND = Push(OPND, Operate(a, theta, b)); break;}}}return OPND->f;}int main(){char s[128];printf("请输⼊表达式: \n");scanf("%s",s);printf("该表达式的值为: \n");printf("%s = ",s);printf("%g\n",EvaluateExpression(s)); // %g return 0; }运⾏结果如下:2.递归的使⽤2.1 求n!:代码如下:#includeint Fact(int n){if(0 == n) return 1;else return n*Fact(n-1);}{int n;scanf("%d",&n);printf("%d的阶乘为:",n);printf("%d",Fact(n));return 0;}运⾏结果如下:2.2 哈诺塔:代码如下:#includeint Hanoi(int n,char a,char b,char c) { if(1 == n)printf("%c-%d->%c ",a,1,c);else{Hanoi(n-1,a,c,b);printf("%c-%d->%c ",a,n,c);Hanoi(n-1,b,a,c);}return 0;}int main(){int n;char a='A',b='B',c='C';printf("请输⼊汉诺塔的层数: "); scanf("%d",&n);Hanoi(n,a,b,c);printf("\n");return 0;}运⾏结果如下:n=3时n=4时n=5时n=6时由3,4,5可推知n 层哈诺塔需要移动 12 n次;n=6时,需要移动63次。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验指导书
实验一线性表的应用
【实验目的】
1. 熟练掌握线性表的基本操作在顺序存储和链式存储上的实现;
2. 以线性表的各种操作(建立、插入、删除、遍历等)的实现为重点;
3. 掌握线性表的动态分配顺序存储结构的定义和基本操作的实现;
4. 通过本章实验帮助学生加深对C语言的使用(特别是函数的参数调用、指针类型的应用和链表的建立等各种基本操作)。
【实验内容】
约瑟夫问题的实现:n只猴子要选猴王,所有猴子按1,2,…,n编号围坐一圈,从第1只开始按1,2,…,m报数,凡报到m号的猴子退出圈外,如此循环报数,直到圈内剩下一只猴子时,这个猴子就是猴王。
编写一个程序实现上述过程,n和m由键盘输入。
【实验要求】
1. 要求用顺序表和链表分别实现约瑟夫问题;
2. 独立完成,严禁抄袭;
3. 上交的实验报告由如下部分组成:①实验名称②实验目的③实验内容(数据描述,算法描述,程序清单,测试结果,算法分析)
实验二栈和队列的应用
【实验目的】
1. 熟练掌握栈和队列的结构,以及这两种数据结构的特点;
2. 能够在两种存储结构上实现栈的基本运算,特别注意栈满栈空的判断条件和描述方法;
3. 熟练掌握链队列和循环队列的基本运算,特别注意队列满和队列空的判断条件和描述方法。
【实验内容】
表达式求值的实现:输入一个包含“+”、“-”、“*”、“/”、正整数和圆括号的合法表达式,用算符优先法计算该表达式的结果。
【实验要求】
1. 要求用栈实现表达式求值问题;
2. 独立完成,严禁抄袭;
3. 上交的实验报告由如下部分组成:①实验名称②实验目的③实验内容(数据描述,算法描述,程序清单,测试结果,算法分析)
实验三数组的应用
【实验目的】
1. 掌握数组的两种存储表示方法;
2. 掌握对特殊矩阵进行压缩存储时的下标变换公式;
3. 掌握稀疏矩阵的两种压缩存储方法的特点和适用范围。
【实验内容】
稀疏矩阵转置的实现:用三元组顺序表做存储结构,实现稀疏矩阵的转置。
【实验要求】
上交实验报告,要求同上。
实验四树和二叉树的应用
【实验目的】
1. 熟练掌握树的基本概念、二叉树的基本操作及在链式存储结构上的实现;
2. 重点掌握二叉树的生成、遍历及求深度等算法;
3. 掌握哈夫曼树的含义及其应用。
4. 掌握运用递归方式描述算法及编写递归C程序的方法,提高算法分析和程序设计能力。
【实验内容】
二叉树采用二叉链表作存储结构,试编程实现二叉树的如下基本操作:
1. 按先序序列构造一棵二叉链表表示的二叉树T;
2. 对这棵二叉树进行遍历:中序、后序以及层次遍历序列,分别输出结点的遍历序列;
3. 求二叉树的深度/叶结点数目。
【实验要求】
上交实验报告,要求同上。
实验五图的应用
【实验目的】
1. 熟练掌握图的邻接矩阵和邻接表的存储方式;
2. 实现图的一些基本运算,特别是深度遍历和广度遍历;
3. 掌握以图为基础的一些常用算法,如最小生成树、拓扑排序、最短路径等。
【实验内容】
1. 由给定的顶点和边的信息构造图的邻接矩阵存储;
2. 对该图进行深度优先搜索,输出搜索得到的结点序列;
3. 以邻接表作存储结构,用克鲁斯卡尔算法构造最小生成树。
【实验要求】
上交实验报告,要求同上。
实验六查找表的应用
【实验目的】
1. 熟练掌握静态查找表的构造方法和查找算法;
2. 熟练掌握二叉排序树的构造和查找方法;
3. 熟练掌握哈希表的构造和处理冲突的方法;
4. 掌握各种查找表查找效率的分析方法。
【实验内容】
1. 要求将二叉排序树的建立、插入、删除、显示等算法合并在一个综合程序中,用户可通过菜单选择方式运行各种操作算法;
2. 已知哈希表的表长为m,哈希函数为H(key)=key MOD p,用开放定址法(增量序列采用线性探测再散列)解决冲突,试编写构造哈希表的程序。
【实验要求】
上交实验报告,要求同上。
实验七排序算法的应用
【实验目的】
1. 熟练掌握各种排序的算法思想、方法及稳定性;
2. 对一组数据,能写出其具体的排序过程、算法及完整程序,并上机调试;
3. 掌握每一种排序算法的时空复杂度的分析方法。
【实验内容】
有如下数据:
成绩75 87 68 92 88 61 77 96 80 72
姓名王华李燕张萍陈涛刘丽章强孙军朱彬徐伟曾亚
以成绩作关键字,试编程实现如下基本操作:
1. 用冒泡排序对上面数据按成绩非递减排列,并分析时空复杂度;
2. 用简单选择排序对上面数据按成绩非递减排列,并分析时空复杂度;
3. 用快速排序对上面数据按成绩非递减排列,并分析时空复杂度。
【实验要求】
上交实验报告,要求同上。