《计算机软件技术基础》实验报告I—数据结构
实验二:停车场管理问题
一、问题描述
1.实验题目:
设停车场是一个可停放n 辆汽车的狭长通道,且只有一个大门可供汽车进出。汽车在停车
场内按车辆到达时间的先后顺序,依次由北向南排列(大门在最南端,最先到达的第一辆车停放
在车场的最北端)。若停车场内已经停满n辆车,那么后来的车只能在门外的便道上等候。一旦
有车开走,则排在便道上的第一辆车即可开入。当停车场内某辆车要离开时,在它之后进入的车
辆必须先退出车场为它让路,待该辆车开出大门外,其他车辆再按原次序进入车场。每辆停放在
车场的车在它离开停车场时必须按它停留的时间长短缴纳费用。试为停车场编制按上述要求进行
管理的模拟程序。
2.基本要求:
以栈模拟停车场,以队列模拟车场外的便道,按照从终端读入数据的序列进行模拟管理。每一
组输入数据包括三个数据项:汽车的“到达”(‘A'表示)或“离去”(‘D'表示)信息、汽车标
识(牌照号)以及到达或离去的时刻。对每一组输入数据进行操作后的输出信息为:若是车辆到
达,则输出汽车在停车场内或者便道上的停车位置;若是车辆离去,则输出汽车在停车场停留的
时间和应缴纳的费用(便道上停留的时间不收费)。栈以顺序结构实现,队列以链表结构实现。
3.测试数据:
设n=2,输入数据为:(‘A',1,5),(‘A',2,10),(‘D',1,15),(‘A',3,20),(‘A',
4,25),(‘A',5,30),(‘D',2,35),(‘D',4,40),(‘E',0,0)。每一组输入数据包括三
个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A'表
示到达;‘D'表示离去,‘E'表示输入结束。其中:(‘A',1,5)表示1号牌照车在5这个时刻
到达,而(‘D',1,15)表示1号牌照车在15这个时刻离去。
二、需求分析
1.程序所能达到的基本可能:
本程序用来模拟一个可停放n辆车的停车场的停车管理问题。用栈和队列模拟停车场及场外
通道,输入车辆状态(到达或者离开),车牌号和时间,就可显示停车位置或者该车在停车场停
留时间及应缴费用。.
.
2.输入的形式及输入值范围:
程序接受5个命令,分别是:到达(‘A',车牌号,时间);离去(‘D',车牌号,时间);停车场
(‘P', 0, 0)显示停车场的车数;候车场(‘W', 0, 0)显示候车场的车数;退出(‘E',
0, 0)退出程序。
3.输出的形式:
对于车辆到达,要输出汽车在停车场内或者便道上的停车位置;对于车辆离去,则输出汽车在停车场停留的时间和应缴纳的费用(便道上不收费)。用户输入完毕后,程序自动运行输出运行结果。
4.测试数据要求:
设n=2,输入数据为:(‘A',1,5),(‘A',2,10),(‘D',1,15),(‘A',3,20),(‘A',4,25),(‘A',5,30),(‘D',2,35),(‘D',4,40),(‘E',0,0)。每一组输入数据包括三个数据项:汽车“到达”或“离去”信息、汽车牌照号码及到达或离去的时刻,其中,‘A'表示到达;‘D'表示离去,‘E'表示输入结束。其中:(‘A',1,5)表示1号牌照车在5这个时刻到达,而(‘D',1,15)表示1号牌照车在15这个时刻离去。
三、概要设计
为了实现上述功能,该程序以栈模拟停车场以及临时停放为给要离去的汽车让路而从停车场退出来的汽车的场地,以队列模拟车场外的便道,因此需要栈和队列这两个抽象数据类型。
1.栈抽象数据类型定义:
ADT SqStack{
数据对象:D={ai,bi,ci,di|ai∈int, bi∈int,ci∈int,di∈char),
i =1,2...,n,n≥0}:
数据关系:R={(ai,bi,di,)|ai,bi,di∈D,ai,bi,di∈struct car};
基本操作:
Car_enter(carnum,cartime)//将到达车辆a的信息入栈s或者入队q
Car_Leave(carnum,cartime);//将待离开车辆d出栈s,并将q中相应车辆入栈并进行相关的操作
Result(char carmove,int carnum,int cartime)//根据输入信息完成车辆的离开或者到达
}ADT SqStack
ADT的C语言形式说明:
typedef struct //构造一个顺序栈
{
struct Node1 home[MaxSize];
2
.
.
int stacktop; //栈顶的指针
}Stack;
2.队列抽象数据类型定义
ADT LinkQueue{
数据对象:D={ai,bi,ci|ai∈Qnode*, bi∈Qnode*,ci∈int), i
} =1,2...,n,n≥0 ;
数据关系:R= ?
基本操作:
Car_enter(carnum,cartime)//将到达车辆a的信息入栈s或者入队q
Car_Leave(carnum,cartime);//将待离开车辆d出栈s,并将q中相应车辆入栈并进行相关的操作
Result(char carmove,int carnum,int cartime)//根据输入信息完成车辆的离开或者到达
}ADT LinkQueue
ADT的C语言形式说明:
typedef struct //构建一个链式队列
{
QNode *front,*rear;
}Queue;
void Car_enter(int carnum,int cartime) //到达车辆的信息入栈或者入队
void Car_Leave(int carnum,int cartime)//车离开
int Result(char carmove,int carnum,int cartime)//根据输入信息完成车辆的离开或者达到
3. 主程序流程及其模块调用关系:
1)主程序流程:
主函数提示用户输入指令:到达(‘A',车牌号,时间);离去(‘D',车牌号,时间);停车场‘P'显示停车场的车数;候车场‘W'显示候车场的车数;退出‘E'退出程序。
调用int Result(char carmove,int carnum,int cartime)根据输入信息完成车辆的离开或者达到。
若输入A则调用Car_enter(int carnum,int cartime) ,创建顺序栈CarS和链式队列CarQ,根据栈是否满决定输入的信息入栈还是入队列。若栈未满,输入的车辆信息入栈,若已满,入队列。
若输入D则调用Car_Leave(int carnum,int cartime):创建一个临时栈存放退出让路的车,若在车库中找到对应的车,车库中该车后面的车辆信息进入临时栈CarS2,该车出栈,显示车牌号,此时时间,停留时间,应缴费用。临时栈中的车的信息再回到CarS中。此时若队3
.
.
列CarQ不为空则将队列中车辆信息放入栈CarS中。若在车库中找不到对应的车的车牌号信息,则在表示候车场的队列中找该车信息,如果它在队列的最后,直接出列并输出车牌号,此时时间,停留时间,应缴费用。如果它不在队尾,先把对应信息保存在一个指向队列的指针中,输出车牌号,此时时间,停留时间,应缴费用。删除队列中此结点表示此车离开候车场。
若输入P,则输出车库车辆数PCar;
若输入W,则输出候车场车辆数WCar;
若输入E,则退出程序。
2)调用关系
四、详细设计
1.元素类型、结点类型和结点指针类型:
typedef struct Node1 //构建一个结构体
{
int carnum;
4
.
int time;
}Node1;
typedef struct Node2
{
int carnum;
int time;
struct Node2 *next;
}Node2;
2、创建顺序栈//构造一个顺序栈typedef struct
{
struct Node1 home[MaxSize];
//栈顶的指针int stacktop;
}Stack;
3、创建链式队列//构建一个链式队列typedef struct
{
Node2 *front,*rear;
}Queue;
4.车辆到达:void Car_enter(int carnum,int cartime) //到达车辆的信息入栈或者入队{
如果栈没有满的时候if(CarS.stacktop 到达车辆信息放入顺序栈 CarS.home[CarS.stacktop].carnum=carnum;//CarS.home[CarS.stacktop].time=cartime; +1 车库里的车数量PCar++;// 位:%d 进入时刻进printf(%d号车入停车场! :%d\n,CarS.home[CarS.stacktop].carnum,CarS.home[CarS.stacktop].time,PCar); 置栈顶指针加一CarS.stacktop++;// } 若栈满// else { CarQ.front->carnum=carnum; CarQ.front->time=cartime;//到达车辆信息加入到队列中 +1 //候车场车辆数WCar++; :%d 位时! 入printf(%d 号车进候车场到达 刻:%d\n,CarQ.front->carnum=carnum,CarQ.front->time=cartime,WCar); 置 CarQ.front->next=(Node2 *)malloc(sizeof(Node2));//分配空间 CarQ.front=CarQ.front->next;// 更改队列指针5 . . } } 5.车辆离开 void Car_Leave(int carnum,int cartime)//车离开 { Stack CarS2;//构造一个栈临时存放为了让位退出来的车 int i; int findcar=-1; Node2 *p,*f; CarS2.stacktop=0;//设临时栈CarS2为空 for(i=0;i { if(carnum==CarS.home[i].carnum) { findcar=i;//如果要寻找的车在车库里则让findcar等于车的号码 break; } } if(findcar!= -1) //如果在车库里找到这辆车 { for(;--CarS.stacktop>findcar;CarS2.stacktop++)//将车库里面在i车外面的车移动到临时栈CarS2中 { CarS2.home[CarS2.stacktop].carnum=CarS.home[CarS.stacktop].carnum; CarS2.home[CarS2.stacktop].time=CarS.home[CarS.stacktop].time; } printf(%d号车离开停车场! 离开时刻: %d,停留时长 (%d)\n,CarS.home[CarS.stacktop].carnum,cartime,cartime-CarS.home[CarS.stacktop].time); PCar--;//车库内车辆-1 牰湩晴尨应付停车费%d\n,(cartime-CarS.home[CarS.stacktop].time)*5); for(i=CarS2.stacktop-1;i>=0;i--)//把临时栈里面的车移回去 { CarS.home[CarS.stacktop].carnum=CarS2.home[i].carnum; CarS.home[CarS.stacktop].time=CarS2.home[i].time; CarS.stacktop++; CarS2.stacktop--; } if(CarQ.front!=CarQ.rear)//如果候车场有车,将它移进车库 { 6 . . CarS.home[CarS.stacktop].carnum=CarQ.rear->carnum;//将队列中的车牌号信息放入栈 CarS.home[CarS.stacktop].time=cartime;//将此时的时刻记录入栈CarS,确保计算费用是从车辆从候车场进入车库后才开始算 CarS.stacktop++; PCar++;//车库车辆数+1 WCar--;//候车场车辆数-1 p=CarQ.rear; CarQ.rear=CarQ.rear->next; free(p); } } else//如果车库中找不到此车,再在候车场找 { p=CarQ.rear; if(p!=CarQ.front&&p->carnum!=carnum) //候车场队列不为空 { f=p->next; while(f!=CarQ.front&&f->carnum!=carnum) { p=f; f=f->next; } if(f->carnum==carnum)//如果寻找的车在便道上,出队列 { findcar=1; p->next=f->next; printf(%d号车离开候车场! 离开时间: %d,停留时长 (%d)\n,f->carnum,cartime,cartime-f->time); WCar--; 牰湩晴尨应付停车费: %d\n,(cartime-f->time)*0); free(f); } } if(p->carnum==carnum)//要离开的车在队尾,直接出队 { findcar=1; CarQ.rear=CarQ.rear->next; printf(%d号车离开候车场!离开时间: %d,停留时长 (%d))!\n,p->carnum,cartime,cartime-p->time); WCar--; 牰湩晴尨应付停车费: %d\n,(cartime-p->time)*0); 7 . . free(p); } } if(findcar==-1) printf(%d号车不在停车场中!\n,carnum); } 6.主函数 main() { 牰湩晴尨试验名称:停车场管理问题\n); 牰湩晴尨学号:\n); 牰湩晴尨姓名:xx\n); printf(=========================================================\n); time_t rawtime1; struct tm * timeinfo1; time (&rawtime1); timeinfo1 = localtime (&rawtime1); //时间函数; 牰湩晴?程序运行开始,当前日期和时间: %s, asctime(timeinfo1)); int go=1,carnum,cartime,MM; char carmove; CarS.stacktop=0; CarQ.rear=CarQ.front=(Node2 *)malloc(sizeof(Node2)); while(go) { printf(\ 车辆到达请输入A;\n车辆离开请输入D;\n显示停车场内车数请输入P;\n显示候车场车数请输入 W;\n退出程序请输入E:\n); printf(\ 请输入信息:); carmove=getchar(); printf(\ ); switch(carmove) { case 'A': { printf(%c\n车牌号:\t,carmove); scanf(%d,&carnum); 牰湩晴尨时间:\t); 8 . . scanf(%d,&cartime); MM=Result(carmove,carnum,cartime); if(!MM)go=0; break; } case 'D': { printf(%c\n车牌号:\t,carmove); scanf(%d,&carnum); 牰湩晴尨现在时刻:\t); scanf(%d,&cartime); MM=Result(carmove,carnum,cartime); if(!MM)go=0; break; } case 'W': 牰湩晴尨正在外通道等待的车数量是: %d\n,WCar); break; case 'P': 牰湩晴尨车库内车的数量是: %d\n,PCar); break; 慣敳???瀺楲瑮?退出!\n); time_t rawtime2; struct tm * timeinfo2; time (&rawtime2); timeinfo2 = localtime (&rawtime2); 牰湩晴?程序运行结束,当前日期和时间: %s, asctime(timeinfo2)); return 0; } getchar(); } } 五、调试分析 此程序是分模块设计,根据输入的指令调用“到达”和“离开”模块,使车的信息入栈入队,或出栈出队。每次运行后又返回主菜单。程序整体结构清晰,操作方便。 六、使用说明 到达输入A,离开输入D,显示车库车辆数输入P,显示用户根据提示输入指令:候车场车辆数输入W,退出程序输入E。 9 . . 输入A后,根据提示输入车牌号i和此时时间,将显示“第i号车进入车库!时间:位置:”或“第i号车进入候车场!时间:位置:”; 输入D后,根据提示输入车牌号i和此时时间,将显示“第i号车离开车库!时间:停留时间:应缴费用:”。或“第i号车离开候车场!时间:停留时间:应缴费用:”; 输入W后显示“正在外通道等待的车数量是:”; 输入P后显示“车库内车的数量是”; 输入E后退出程序。 七、调试结果 设车库最大容量为2.输入一组数据进行测试:(‘A',1,5),(‘A',2,10),(‘D',1,15),(‘A',3,20),(‘A',4,25),(‘A',5,30),(‘D',2,35),(‘D',4,40),(‘E',0,0)。 初始界面为: 输入到达车辆: 10 . . 到达车辆超过车库容量时: 输入车辆离开信息:11 . . P 输入 :输入W12 . . 输入E: 八、遇到的问题和解决方法开始,程序编写完成后虽然没有报错,却不能运行,如图 1.13 . . 经检查程序,将Stack *CarS; Queue *CarQ; 这两个指针型变量改成Stack CarS; //用来表示车库的栈Queue CarQ; //用来表示候车场的队列,再次运行发现可以成功运行。 2.当输入上述数据后输入P和W后显示的车辆数不对,当车库内车辆离开时,外通道的车进入车库,但PCar和WCar没有正确跟随变化,如图 经检查程序,在如果候车场有车,将它移进车库if(CarQ.front!=CarQ.rear)//{ 将队列中的车牌号信息CarS.home[CarS.stacktop].carnum=CarQ.rear->carnum;// 14 . . 放入栈 CarS.home[CarS.stacktop].time=cartime;//将此时的时刻记录入栈CarS,确保计算费用是从车辆从候车场进入车库后才开始算 CarS.stacktop++; p=CarQ.rear; CarQ.rear=CarQ.rear->next; free(p); 这段程序中少了PCar++; WCar--;,加上后再次运行,程序正确。 3.计算费用时发现错误,在候车厅时间也被计入停车费。经检查程序,将 CarS.home[CarS.stacktop].time=CarQ.rear->time; 改成CarS.home[CarS.stacktop].time=cartime;使其计费时间从进入车库开始而不是从达到候车场开始。再次运行发现结果正确。 九、实验收货和感想 这是第一次运用栈和队列的相关知识编写程序,开始看到这个题目感觉挑战很大,从未尝试过这么复杂的一个系统。停车场问题相较与约瑟夫斯问题要复杂得多,分了多个模块。起初编写时漏洞很多,好在当框架出来后各个漏洞都可以被弥补。比如程序刚运行成功时,发现不能显示位置,车库车辆数和候车场车辆数不正确,计费不正确等很多漏洞,但这些细节的小问题都比较容易排查修改,最终终于做出了符合要求的停车场管理系统。当完成后,我对栈和队列的相关算法的理解也更加清晰深刻了。这个程序中还有一些灵活可变的地方,用宏定义定义了车库容量和费用单价,使具体数字可以较为灵活的改变,增加了这个程序的使用价值。计算机实践课程给了我 动手操作的机会,使我将理论和实际操作结合起来,更好地理解算法,更快地学会编程。每次编程都感觉收获非常多。练习的越多,对算法语句越是熟练,越能有深刻的理解,不仅帮助我更好的学习《软件技术基础》也为以后我们专业课的道路打好基石,对我们的逻辑能力也是很大的提升。 十、源程序 #include #include #include #define MaxSize 2//车库最大容量 #define fee 10//在车库中停车的单价 typedef struct Node1 //构建一个结构体 15 . . { int carnum; int time; }Node1; //构造一个顺序栈typedef struct { struct Node1 home[MaxSize]; //栈顶的指针int stacktop; }Stack; typedef struct Node2 { int carnum; int time; struct Node2 *next; }Node2; //构建一个链式队列typedef struct { Node2 *front,*rear; }Queue; 用来表示车库的栈//Stack CarS; 用来表示候车场的队列//Queue CarQ; 车库里车的数量int PCar=0;// 候车场的车的数量int WCar=0;// 到达车辆的信息入栈或者入队void Car_enter(int carnum,int cartime) //{ 如果栈没有满的时候if(CarS.stacktop CarS.home[CarS.stacktop].carnum=carnum;//到达车辆信息放入顺序栈 CarS.home[CarS.stacktop].time=cartime; 16 . . +1 PCar++;// 车库里的车数量 位入时刻:%d 进入停车场! 进printf(%d号 车:%d\n,CarS.home[CarS.stacktop].carnum,CarS.home[CarS.stacktop].time,PCar); 置栈顶指针加一CarS.stacktop++;// } //若栈满else { CarQ.front->carnum=carnum; CarQ.front->time=cartime;//到达车辆信息加入到队列中 +1 //候车场车辆数WCar++; 位时刻:%d 进入候车场! 到达printf(%d 号车:%d\n,CarQ.front->carnum=carnum,CarQ.front->time=cartime,WCar); 置CarQ.front->next=(Node2 *)malloc(sizeof(Node2));//分配空间 CarQ.front=CarQ.front->next;//更改队列指针 } } void Car_Leave(int carnum,int cartime)//车离开{ Stack CarS2;//构造一个栈临时存放为了让位退出来的车 《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时) 山东建筑大学测绘地理信息学院 实验报告 (2016—2017学年第一学期) 课程:计算机图形学 专业:地理信息科学 班级:地信141 学生姓名:王俊凝 学号:20140113010 指 实验一直线生成算法设计 一、实验目的 掌握基本图形元素直线的生成算法,利用编程语言C分别实现直线和圆的绘制算法。 二、实验任务 在TurboC环境下开发出绘制直线和圆的程序。 三、实验仪器设备 计算机。 四、实验方法与步骤 1 运行TurboC编程环境。 2 编写Bresenham直线绘制算法的函数并进行测试。 3 编写中点圆绘制算法的函数并进行测试。 4 增加函数参数,实现直线颜色的设置。 提示: 1. 编程时可分别针对直线和圆的绘制算法,设计相应的函数,例如void drawline(…)和void drawcircle(…),直线的两个端点可作为drawline的参数,圆的圆心和半径可作为drawcircle的参数。 2. 使用C语言编写一个结构体类型用来表示一个点,结构体由两个成员构成,x和y。这样,在向函数传入参数时,可使用两个点类型来传参。定义方法为: typedef struct{ int x; int y; }pt2; 此处,pt2就是定义的一个新的结构体数据类型,之后就可用pt2来定义其他变量,具体用法见程序模板。 3. 在main函数中,分别调用以上函数,并传入不同的参数,实现对直线的绘制。 4. 线的颜色也可作为参数传入,参数可采用TurboC语言中的预设颜色值,具体参见TurboC图形函数。 五、注意事项 1 代码要求正确运行,直线和圆的位置应当为参数,实现可配置。 2 程序提交.c源文件,函数前和关键代码中增加注释。 程序模板 #include 南京工程学院实验报告 <班级>_<学号>_<实验X>.RAR文件形式交付指导老师。 一、实验目的 1. 掌握查找的不同方法,并能用高级语言实现查找算法; 2. 熟练掌握二叉排序树的构造和查找方法。 3. 了解静态查找表及哈希表查找方法。 二、实验内容 设计一个算法读入一串整数,然后构造二叉排序树,进行查找。 三、实验步骤 1. 从空的二叉树开始,每输入一个结点数据,就建立一个新结点插入到当前已生成的二叉排序树中。 2. 在二叉排序树中查找某一结点。 3.用其它查找算法进行排序。 四、程序主要语句及作用 程序1的主要代码 public class BinarySearchTreeNode //二叉查找树结点 { public int key; public BinarySearchTreeNode left; public BinarySearchTreeNode right; public BinarySearchTreeNode(int nodeValue) { key = nodeValue; left = null; right = null; } public void InsertNode(BinarySearchTreeNode node)//插入结点 { if (node.key > this.key) { if (this.right == null) { this.right = node; return; } else this.right.InsertNode(node); } else { if (this.left == null) { this.left = node; return; } else this.left.InsertNode(node); } } public bool SearchKey(int searchValue) { if (this.key == searchValue) return true; if (searchValue > this.key) { if (this.right == null) return false; else return this.right.SearchKey(searchValue); } else { if (this.left == null) return false; else return this.left.SearchKey(searchValue); } 数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include 数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"< 《建筑结构试验》实验报告 班级: 学号: 姓名: 南昌航空大学土木工程试验中心 二○一○年四月 目录 试验一电阻应变片的粘贴及防潮技术试验二静态电阻应变仪的使用及接桥试验三电阻应变片灵敏系数的测定 试验四简支钢筋混凝土梁的破坏试验 试验一电阻应变片的粘贴及防潮技术 姓名:学号:星期第讲第组 实验日期:年月日同组者: 一、实验目的: 1.掌握电阻应变片的选用原则和方法; 2.学习常温用电阻应变片的粘贴方法及过程; 3.学会防潮层的制作; 4.认识并理解粘贴过程中涉及到的各种技术及要求对应变测试工作的影响。 二、实验仪表和器材: 1.模拟试件(小钢板); 2.常温用电阻应变片; 3.数字万用表; 4.兆欧表; 5.粘合剂:T-1型502胶,CH31双管胶(环氧树脂)或硅橡胶; 6.丙酮浸泡的棉球; 7.镊子、划针、砂纸、锉刀、刮刀、塑料薄膜、胶带纸、电烙铁、焊锡、焊锡膏等小工具; 8.接线柱、短引线 三、简述整个操作过程及注意事项: 1.分选应变片。在应变片灵敏数K相同的一批应变片中,剔除电阻丝栅有形状缺陷,片内有气泡、霉斑、锈点等缺陷的应变片,将电阻值在120±2Ω范围内的应变片选出待用。 2.试件表面处理。去除贴片位置的油污、漆层、锈迹、电镀层,用丙酮棉球将贴片处擦洗干净,至棉球洁白为止,以保证应变片能够牢固的粘贴在试件表面。 3.测点定位。应变片必须准确地粘贴在结构或试件的应变测点上,而且粘贴方向必须是要测量的应变方向。 4.应变片粘贴。注意分清应变片的正、反面,保证电阻栅的中心与十字交叉点对准。应变片贴好后,先检查有无气泡、翘曲、脱胶等现象,再用数字万用表的电阻档检查应变片有无短路、断路和阻值发生突变(因应变片粘贴不平整导致)的现象。 5.导线固定。接线柱粘帖不要离应变片太远,接线柱挂锡不可太多,导线挂锡一端的裸露线芯不能过长,以31mm为宜。引出线不要拉得太紧,以免试件受到拉力作用后,接线柱与应变片之间距离增加,使引出线先被拉断,造成断路;也不能过松,以避免两引出线互碰 数据结构实验总结报告 一、调试过程中遇到哪些问题? (1)在二叉树的调试中,从广义表生成二叉树的模块花了较多时间调试。 由于一开始设计的广义表的字符串表示没有思考清晰,处理只有一个孩子的节点时发生了混乱。调试之初不以为是设计的问题,从而在代码上花了不少时间调试。 目前的设计是: Tree = Identifier(Node,Node) Node = Identifier | () | Tree Identifier = ASCII Character 例子:a(b((),f),c(d,e)) 这样便消除了歧义,保证只有一个孩子的节点和叶节点的处理中不存在问题。 (2)Huffman树的调试花了较长时间。Huffman编码本身并不难处理,麻烦的是输入输出。①Huffman编码后的文件是按位存储的,因此需要位运算。 ②文件结尾要刷新缓冲区,这里容易引发边界错误。 在实际编程时,首先编写了屏幕输入输出(用0、1表示二进制位)的版本,然后再加入二进制文件的读写模块。主要调试时间在后者。 二、要让演示版压缩程序具有实用性,哪些地方有待改进? (1)压缩文件的最后一字节问题。 压缩文件的最后一字节不一定对齐到字节边界,因此可能有几个多余的0,而这些多余的0可能恰好构成一个Huffman编码。解码程序无法获知这个编码是否属于源文件的一部分。因此有的文件解压后末尾可能出现一个多余的字节。 解决方案: ①在压缩文件头部写入源文件的总长度(字节数)。需要四个字节来存储这个信息(假定文件长度不超过4GB)。 ②增加第257个字符(在一个字节的0~255之外)用于EOF。对于较长的文件, 会造成较大的损耗。 ③在压缩文件头写入源文件的总长度%256的值,需要一个字节。由于最后一个字节存在或不存在会影响文件总长%256的值,因此可以根据这个值判断整个压缩文件的最后一字节末尾的0是否在源文件中存在。 (2)压缩程序的效率问题。 在编写压缩解压程序时 ①编写了屏幕输入输出的版本 ②将输入输出语句用位运算封装成一次一个字节的文件输入输出版本 ③为提高输入输出效率,减少系统调用次数,增加了8KB的输入输出缓存窗口 这样一来,每写一位二进制位,就要在内部进行两次函数调用。如果将这些代码合并起来,再针对位运算进行一些优化,显然不利于代码的可读性,但对程序的执行速度将有一定提高。 (3)程序界面更加人性化。 Huffman Tree Demo (C) 2011-12-16 boj Usage: huffman [-c file] [-u file] output_file -c Compress file. e.g. huffman -c test.txt test.huff -u Uncompress file. e.g. huffman -u test.huff test.txt 目前的程序提示如上所示。如果要求实用性,可以考虑加入其他人性化的功能。 三、调研常用的压缩算法,对这些算法进行比较分析 (一)无损压缩算法 ①RLE RLE又叫Run Length Encoding,是一个针对无损压缩的非常简单的算法。它用重复字节和重复的次数来简单描述来代替重复的字节。尽管简单并且对于通常的压缩非常低效,但它有的时候却非常有用(例如,JPEG就使用它)。 变体1:重复次数+字符 文本字符串:A A A B B B C C C C D D D D,编码后得到:3 A 3 B 4 C 4 D。 数据结构(C语言版) 实验报告 专业班级学号姓名 实验1 实验题目:单链表的插入和删除 实验目的: 了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求: 建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤: 1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测 试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序: (1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码: #include"" #include"" #include"" #include"" typedef struct node . . 示意图: head head head 心得体会: 本次实验使我们对链表的实质了解更加明确了,对链表的一些基本操作也更加熟练了。另外实验指导书上给出的代码是有一些问题的,这使我们认识到实验过程中不能想当然的直接编译执行,应当在阅读并完全理解代码的基础上再执行,这才是实验的意义所在。 实验2 实验题目:二叉树操作设计和实现 实验目的: 掌握二叉树的定义、性质及存储方式,各种遍历算法。 实验要求: 采用二叉树链表作为存储结构,完成二叉树的建立,先序、中序和后序以及按层次遍历 的操作,求所有叶子及结点总数的操作。 实验主要步骤: 1、分析、理解程序。 2、调试程序,设计一棵二叉树,输入完全二叉树的先序序列,用#代表虚结点(空指针), 如ABD###CE##F##,建立二叉树,求出先序、中序和后序以及按层次遍历序列,求 所有叶子及结点总数。 实验代码 #include"" #include"" #include"" #define Max 20 ertex=a; irstedge=NULL; irstedge; G->adjlist[i].firstedge=s; irstedge; R[i] 留在原位 2009级数据结构实验报告 实验名称:约瑟夫问题 学生姓名:李凯 班级:21班 班内序号:06 学号:09210609 日期:2010年11月5日 1.实验要求 1)功能描述:有n个人围城一个圆圈,给任意一个正整数m,从第一个人开始依次报数,数到m时则第m个人出列,重复进行,直到所有人均出列为止。请输出n个人的出列顺序。 2)输入描述:从源文件中读取。 输出描述:依次从显示屏上输出出列顺序。 2. 程序分析 1)存储结构的选择 单循环链表 2)链表的ADT定义 ADT List{ 数据对象:D={a i|a i∈ElemSet,i=1,2,3,…n,n≧0} 数据关系:R={< a i-1, a i>| a i-1 ,a i∈D,i=1,2,3,4….,n} 基本操作: ListInit(&L);//构造一个空的单链表表L ListEmpty(L); //判断单链表L是否是空表,若是,则返回1,否则返回0. ListLength(L); //求单链表L的长度 GetElem(L,i);//返回链表L中第i个数据元素的值; ListSort(LinkList [内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template 邻接矩阵的实现 1. 实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现2. 实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历3.设计与编码MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template int vertexNum, arcNum; }; #endif MGraph.cpp #include 班级::学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 二、实验容 定义一个包含学生信息(学号,,成绩)的顺序表和链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include typedef int Status; // 定义函数返回值类型 typedef struct { char num[10]; // 学号 char name[20]; // double grade; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; return OK; 实验一静态应变测量原理 在电阻应测量中,如在电桥中仅接入一个电阻应变片,则实际测量值中含有由于温度变化时构件产生的应变,这是实验中所不希望的,通过适当的接线方式,可消除温度的影响,在课本中有许多不同的接线方式,主要分为两大类,一是设置专门温度补偿片,这种方式又可分为公共补偿与单片补偿两种,二是通过工作片间互相补偿,称为互相补偿或自补偿,接线要有一定的技巧。掌握电阻应变测量中的温度补偿方式及不同接线方式的测量结果的区别是很重要的。 一、实验目的 1、熟悉电阻应变仪的操作规程; 2、掌握电阻应变仪测量的基本原理; 3、学会用电阻应变片作半桥测量的方法; 4、掌握温度补偿的基本原理。 二、实验设备及仪表 1、DH3819型静态电阻应变仪; 2、等强度梁; 3、电阻应变片,导线。 三、实验内容 进行两种电阻应变测量接线方法的实验,掌握电阻应变测量的不同接线基本原理,以及消除温度影响的方法,根据实验结果分析两种接线不同测量数值理论依据。 四、试验方法 1、1/4桥接线+公共补偿: 单片补偿接线方法:将应变片R1接于应变仪1组,Eg、接线柱,温度补偿片R2接于、0接线柱,则构成外半桥,另内半桥由应变仪内部两个标准电阻构成。输入应变片灵敏度系数,导线电阻,应变片电阻。 公共补偿接线方法:断开补偿组的连线,将公共补偿接线连接于该组,将等强度梁的上侧应变片R1接于1组的Eg、接线柱,将等强度梁下侧应变片R3接、0接线柱。 2、半桥接线 按应变仪的设计原理更换公共补偿端的接线方式,然后在每个测量桥路中接入两个电阻应变片。本试验中,在一个测量桥路中按半桥方式接入等强度梁的上下测应变片。 五、实验步骤 1、接上述接桥方法分别接通桥路; 2、将电阻应变仪调平衡; 3、作预加载1公斤,检查仪表和装置; 4、正式试验,每级加载1公斤,加三级,记取读数,重复三次。 六、试验报告 1、实验方案; 2、实验过程; 3、整理出实验数据,试验数据填入应变记录表。(表格见下表) 4、比较两种接线方法,分析原因,给出结论。 5、写出试验操作方法和体会。 6、回答后面的思考题。 数据结构实验报告 实验名称:实验1——线性表 学生姓名: 班级: 班内序号: 学号: 日期: 1.实验要求 1、实验目的:熟悉C++语言的基本编程方法,掌握集成编译环境的调试方法 学习指针、模板类、异常处理的使用 掌握线性表的操作的实现方法 学习使用线性表解决实际问题的能力 2、实验内容: 题目1: 线性表的基本功能: 1、构造:使用头插法、尾插法两种方法 2、插入:要求建立的链表按照关键字从小到大有序 3、删除 4、查找 5、获取链表长度 6、销毁 7、其他:可自行定义 编写测试main()函数测试线性表的正确性。 2. 程序分析 存储结构 带头结点的单链表 关键算法分析 1.头插法 a、伪代码实现:在堆中建立新结点 将x写入到新结点的数据域 修改新结点的指针域 修改头结点的指针域,将新结点加入链表中 b、代码实现: Linklist::Linklist(int a[],int n) 堆中建立新结点 b.将a[i]写入到新结点的数据域 c.将新结点加入到链表中 d.修改修改尾指针 b、代码实现: Linklist::Linklist(int a[],int n,int m)取链表长度函数 a、伪代码实现:判断该链表是否为空链表,如果是,输出长度0 如果不是空链表,新建立一个temp指针,初始化整形数n为0 将temp指针指向头结点 判断temp指针指向的结点的next域是否为空,如果不是,n加一,否 则return n 使temp指针逐个后移,重复d操作,直到temp指针指向的结点的next 域为0,返回n b 、代码实现 void Linklist::Getlength()Linklist(); cout< 2011~2012第一学期数据结构实验报告 班级:信管一班 学号:201051018 姓名:史孟晨 实验报告题目及要求 一、实验题目 设某班级有M(6)名学生,本学期共开设N(3)门课程,要求实现并修改如下程序(算法)。 1. 输入学生的学号、姓名和 N 门课程的成绩(输入提示和输出显示使用汉字系统), 输出实验结果。(15分) 2. 计算每个学生本学期 N 门课程的总分,输出总分和N门课程成绩排在前 3 名学 生的学号、姓名和成绩。 3. 按学生总分和 N 门课程成绩关键字升序排列名次,总分相同者同名次。 二、实验要求 1.修改算法。将奇偶排序算法升序改为降序。(15分) 2.用选择排序、冒泡排序、插入排序分别替换奇偶排序算法,并将升序算法修改为降序算法;。(45分)) 3.编译、链接以上算法,按要求写出实验报告(25)。 4. 修改后算法的所有语句必须加下划线,没做修改语句保持按原样不动。 5.用A4纸打印输出实验报告。 三、实验报告说明 实验数据可自定义,每种排序算法数据要求均不重复。 (1) 实验题目:《N门课程学生成绩名次排序算法实现》; (2) 实验目的:掌握各种排序算法的基本思想、实验方法和验证算法的准确性; (3) 实验要求:对算法进行上机编译、链接、运行; (4) 实验环境(Windows XP-sp3,Visual c++); (5) 实验算法(给出四种排序算法修改后的全部清单); (6) 实验结果(四种排序算法模拟运行后的实验结果); (7) 实验体会(文字说明本实验成功或不足之处)。 三、实验源程序(算法) Score.c #include "stdio.h" #include "string.h" #define M 6 #define N 3 struct student { char name[10]; int number; int score[N+1]; /*score[N]为总分,score[0]-score[2]为学科成绩*/ }stu[M]; void changesort(struct student a[],int n,int j) {int flag=1,i; struct student temp; while(flag) { flag=0; for(i=1;i 图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template 数据结构实验报告 (实验名称) 1.实验目标 熟练掌握线性表的顺序存储结构和链式存储结构。 熟练掌握顺序表和链表的有关算法设计。 根据具体问题的需要,设计出合理的表示数据的顺序和链式结构,并设计相关算法。 2.实验内容和要求 内容: <1>在第i个结点前插入值为x的结点。 实验测试数据基本要求: 第一组数据:线性表长度n≥10,x=100, i分别为5,n,n+1,0,1,n+2 第二组数据:线性表长度n=0,x=100,i=5 <2>删除线性表中第i个元素结点。 实验测试数据基本要求: 第一组数据:线性表长度n≥10,i分别为5,n,1,n+1,0 第二组数据:线性表长度n=0, i=5 <3>在一个递增有序的线性表L中插入一个值为x的元素,并保持其递增有 序特性。 实验测试数据基本要求: 线性表元素为(10,20,30,40,50,60,70,80,90,100), x分别为25,85,110和8 <4>求两个递增有序线性表L1和L2中的公共元素,放入新的顺序表L3中。 实验测试数据基本要求: 第一组 第一个线性表元素为(1,3,6,10,15,16,17,18,19,20) 第二个线性表元素为(1,2,3,4,5,6,7,8,9,10,18,20,30)第二组 第一个线性表元素为(1,3,6,10,15,16,17,18,19,20) 第二个线性表元素为(2,4,5,7,8,9,12,22) 第三组 第一个线性表元素为() 第二个线性表元素为(1,2,3,4,5,6,7,8,9,10) 要求:每个题目分别用顺序存储和链式存储实现; 实验程序有较好可读性,各运算和变量的命名直观易懂,符合软件工程要求; 程序有适当的注释。 3.数据结构设计 顺序表结构,链表结构。 4.算法设计 (除书上给出的基本运算(这部分不必给出设计思想),其它实验内容要给出算法设计思想) 按顺序插入:首先插入一个元素,表长加一,用do,while循环整个顺序表,从最后一位开始,比x大的都向后移一位,在第一个小于x的后面停止遍历,吧x插在比x小的第一个数的后面。 寻找两个顺序表中相同的元素:运用嵌套循环,最外层循环遍历第一个表里面的元素为母元素,内部循环遍历第二个表为子元素。在子元素中查找与母元素相同的元素,改变第一个表里面的元素,把相同的放进去,最后删除表一中除了新放进来的元素。 5.运行和测试 顺序表: 1: 2: 班级: 姓名: 学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入与删除等。 二、实验内容 定义一个包含学生信息(学号,姓名,成绩)的顺序表与链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号与成绩; (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include { char num[10]; // 学号 char name[20]; // 姓名 double grade; // 成绩 }student; typedef student ElemType; typedef struct LNode { ElemType data; // 数据域 struct LNode *next; //指针域 }LNode,*LinkList; Status InitList(LinkList &L) // 构造空链表L { L=(struct LNode*)malloc(sizeof(struct LNode)); L->next=NULL; return OK; } Status GetElem(LinkList L,int i,ElemType &e) // 访问链表,找到i位置的数据域,返回给 e { LinkList p; p=L->next; 福建农林大学计算机与信息学院 实验报告 课程名称:软件设计与体系结构 姓名:陈宇翔 系:软件工程系 专业:软件工程 年级:2007 学号:070481024 指导教师:王李进 职称:讲师 2009年12月16日 实验项目列表 福建农林大学计算机与信息学院实验报告 学院:计算机与信息学院专业:软件工程系年级:2007 姓名:陈宇翔 学号:070481024 课程名称:软件设计与体系结构实验时间:2009-10-28 实验室田实验室312、313计算机号024 指导教师签字:成绩: 实验1:ACME软件体系结构描述语言应用 一、实验目的 1)掌握软件体系结构描述的概念 2)掌握应用ACMESTUDIO工具描述软件体系结构的基本操作 二、实验学时 2学时。 三、实验方法 由老师提供软件体系结构图形样板供学生参考,学生在样板的指导下修改图形,在老师的指导下进行软件体系结构描述。 四、实验环境 计算机及ACMESTUDIO。 五、实验内容 利用ACME语言定义软件体系结构风格,修改ACME代码,并进行风格测试。 六、实验操作步骤 一、导入Zip文档 建立的一个Acme Project,并且命名为AcmeLab2。如下图: 接着导入ZIP文档,导入完ZIP文档后显示的如下图: 二、修改风格 在AcmeLab2项目中,打开families下的TieredFam.acme.如下图: 修改组件外观 1. 在组件类型中,双击DataNodeT; 在其右边的编辑器中,将产生预览;选择Modify 按钮,将打开外观编辑器对话框。 2. 首先改变图形:找到Basic shape section,在Stock image dropdown menu中选 择Repository类型. 3. 在Color/Line Properties section修改填充颜色为深蓝色。 4. 在颜色对话框中选择深蓝色,并单击 [OK]. 5. 修改图形的边框颜色为绿色 7. 单击Label tab,在Font Settings section, 设置字体颜色为白色,单击[OK] 产生的图形如下图: 云南大学 数据结构实验报告 第一次实验 学号: 姓名: 一、实验目的 1、复习变量、数据类型、语句、函数; 2、掌握函数的参数和值; 3、了解递归。 二、实验内容 1、(必做题)采用函数统计学生成绩:输入学生的成绩,计算并输出这些学生的最低分、最高分、平均分。 2、(必做题)采用递归和非递归方法计算k阶裴波那契序列的第n项的值,序列定义如下:f0=0, f1=0, …, fk-2=0, fk-1=1, fn= fn-1+fn-2+…+fn-k(n>=k) 要求:输入k(1<=k<=5)和n(0<=n<=30),输出fn。 3、(选做题)采用递归和非递归方法求解汉诺塔问题,问题描述如下:有三根柱子A、B、C,在柱子A上从下向上有n个从大到小的圆盘,在柱子B和C上没有圆盘,现需将柱子A上的所有圆盘移到柱子C上,可以借助柱子B,要求每次只能移动一个圆盘,每根柱子上的圆盘只能大的在下,小的在上。要求:输入n,输出移动步骤。 三、算法描述 (采用自然语言描述) 1、①先输入需统计的学生人数。 ②根据学生人数输入成绩,计算成绩总和和平均分。 ③比较成绩大小,得出最低分和最高分。 ④输出计算结果。 2、⑴①写出不同情况下求k阶裴波那契序列的第n项的值的递归函数。 ②输入k和n。 ③输出计算结果。 四、详细设计 (画出程序流程图) 1、 2、⑴ 五、程序代码 (给出必要注释) 1、 #include void main() {int i,x[N],a; int max,min; float ave,sum=0.0; printf("请输入不多于%d的学生人数:",N); scanf("%d",&a); /*输入学生数*/ for(i=0;i=max) {max=x[i];} if(x[i]<=min) {min=x[i];} } printf("平均分是:%f",ave); printf("最高分是:%d",min); printf("最低分是:%d",max);/*输出平均分,最低分,最高分*/ return 0; } 2、 ⑴ #include 数据结构实验报告格式
图形学实验报告
《数据结构》实验1实验报告
数据结构实验报告
数据结构实验报告全集
《建筑结构试验》实验报告
数据结构实验总结报告
数据结构实验报告-答案
数据结构实验报告模板
数据结构实验报告图实验
数据结构实验一 实验报告
工程结构试验与检测实验报告
数据结构实验一题目一线性表实验报告
数据结构实验报告及心得体会
数据结构实验报告图实验
数据结构实验报告一
数据结构实验一 实验报告
软件设计与体系结构实验报告
数据结构实验报告[1]