《应用数据结构》实验指导书2013
- 格式:doc
- 大小:185.50 KB
- 文档页数:34
1 / 34 《应用数据结构》实验指导书 课程编号:4170159110 课程名称:应用数据结构/Applied Data Structure 实验学时:16 适应专业:工科类 承担实验室:管理学院实验中心
一、实验目的和任务 1.实验教学的目的 本课程的教学要求之一是训练学生进行复杂程序设计的技能和培养良好程序设计的习惯,其重要程度绝不亚于知识传授。实验的作用在于帮助学生深入理解教材内容,巩固基本概念,促使学生在动手过程中进一步体会C语言中数据结构的运用技巧,并锻炼学生在调试过程中分析和发现问题的能力。 2.实验教学的要求 学生应掌握C语言基本编程能力并运用数据结构的原理和方法解决具体问题。除按时上机外,学生应具备构造算法并用程序实现的能力;在程序调试过程中,学生应能正确解读程序的错误提示并找到有效的解决办法。此外,规范书写算法也是一个值得高度重视的问题,教师有责任在教学过程中提醒学生,避免形成一系列难以纠正且贻害无穷的程序设计坏习惯。此外,本门课程设计的算法比较多,要求教师熟练掌握C语言和数据结构各类算法,并能准确理解和回答学生提出的编程问题。 二、实验项目及学时分配
序号 实 验 项 目 名 称 实验学时 实验类型 开出要求 1 线性数据结构算法验证 4 验证及演示 必做 2 非线性数据结构算法验证 4 验证及演示 必做 3 查找及排序 4 验证及演示 必做 4 综合算法设计 4 综合 必做
三、参考资料 李业丽、郑良斌编著,数据结构(C)实验教程,北京理工大学出版社,2005年12月出版 严蔚敏,吴伟民编著,数据结构习题集(C语言版),清华大学出版社,1999年2月出版。 2 / 34
四、单项实验的内容和要求(包括实验所用的主要仪器设备,实验所需主要耗材) 实验一 线性数据结构算法验证 1.实验目的与意义 1) 熟悉C语言的上机环境,进一步掌握C语言的结构特点 2) 掌握线性表的顺序存储结构的定义及C语言实现 3) 掌握线性表的链式存储结构——单链表的定义及C语言实现 4) 掌握线性表在顺序存储结构——即顺序表中的各种基本操作 5) 掌握线性表在链式存储结构——单链表中的各种基本操作 6) 掌握栈的顺序表示和实现 7) 掌握栈的链式表示和实现 8) 掌握队列顺序表示和实现 9) 掌握队列链式表示和实现
2.基本原理和方法 本实验涉及各类线性数据结构——线性表、栈和队列等。 单链表的各种操作,包括单链表的建立,结点的查找、插入、删除等基本运算。链表中插入结点的指针变化和删除p所指结点的指针变化参见讲义。 栈的顺序存储结构简称为顺序栈,它是运算受限的顺序表。 对于顺序栈,入栈时,首先判断栈是否为满,栈满的条件为p->top==MAXNUM-1,栈满时,不能入栈;否则出现空间溢出,引起错误,这种现象称为上溢。 出栈和读栈顶元素操作,先判栈是否为空,为空时不能操作,否则产生错误。通常栈空作为一种控制转移的条件。 注意: ① 顺序栈中元素用向量存放。 ② 栈底位置是固定不变的,可设置在向量两端的任意一个端点。 ③ 栈顶位置是随着进栈和退栈操作而变化的,用一个整型量top(通常称top为栈顶指针)来指示当前栈顶位置。 队列的顺序存储结构称为顺序队列,顺序队列实际上是运算受限的顺序表。 入队时,将新元素插入rear所指的位置,然后将rear加1,出队时,删去front所指的元素,然后将front加1并返回被删除元素。 顺序队列中的溢出现象: ① “下溢”现象。当队列为空时,做出队运算产生的溢出现象。“下溢”是正常现象,常用作程序控制转移的条件。 ② “真上溢”现象。当队列满时,做进找运算产生空间溢出的现象。“真上溢”是一种出错状态,应设法避免。 ③ “假上溢”现象。由于入队和出队操作中,头尾指针只增加不减小,致使被删元素的空间永远无法重新利用。当队列中实际的元素个数远远小于向量空闻的规模时,也可能由于尾指针己超越向量空间的上界而不能做入队操作。该现象称为“假上溢”现象。 3 / 34
3.主要仪器设备及耗材 安装有Turbo C++ 3.0或Visual Studio 2012运行环境的电脑,无耗材要求。 4.实验方案或技术路线 本实验含有三部分内容——线性表、栈和队列。 A.线性表部分 采取建立学生成绩表的方法实现。即建立学生成绩单链表,链表中每个结点由4个域组成,分别为:学号、姓名、成绩、存放下一个结点地址的next域、要求完成的四项功能可写成四个函数,登记学生成绩对应建立学生单链表的功能,后三个功能分别对应单链表的查询、插入与删除三大基本操作。 该系统中的数据采用线性表中的链式存储结构即单链表来存储,用结构体类型定义每个学生记录,故该单链表中每个结点的结构可描述为: #define MAXLEN 100 typedef struct node { int num;//学号 char name[MAXLEN];//姓名 float score;//成绩 struct node *next; }linklist; B.栈部分 此部分的算法独立性较强,因此可直接采用教材或讲义上的算法实现,但教材或讲义上的算法并非可执行的算法,故学生须自行进行算法上的转换。 C.队列部分 本实验主要由教师课堂演示,以一个具体的实例——机场事件模拟来实现。
5.实验内容及步骤 A.线性表部分——学生成绩管理是学校教务管理的重要组成部分,其处理信息量很大,本实验是对学生的成绩管理作一个简单的模拟,用菜单选择操作方式完成下列功能: ① 登记学生成绩 ② 查询学生成绩 ③ 插入学生成绩 ④ 删除学生成绩 【参考程序】 /*头文件hh.h的内容*/ #include #include #include #define MAXLEN 100 typedef struct node { int num; char name[MAXLEN]; int score; struct node *next; }list; 4 / 34
/*头文件creat.h的内容*/ #include"hh.h" list *create() { list *head, *p, *r; int i, n; head=(list *)malloc(sizeof(list)); head->next=NULL; r=head; printf("请输入学生人数:\n"); scanf("%d",&n); for(i=l; i<=n; i++) { p=(list *)malloc(sizeof(list)); printf("输入学生的学号:\n"); scanf("%d", &p->num); printf("输入学生的姓名:\n"); scanf("%s", p->name); printf("输人李生的成绩:\n"); scanf("%d", &p->score); p->next=NULL; r->next=p; r=r->next; } return(head); } /*以下是头文件insert.h的内容*/ list *insert(list *h) { list *p,*q,*r,*head; head=r=h; p=h->next; q=(list *)malloc(sizeof(list)); printf("输入待插入学生的学号:\n"); scanf("%d",&q->num); printf("输入姓名:\n); scanf("%s", q->name); printf("输入成绩:\n"); scanf("%d, &q->score); q->next=NULL; while(p) { r=p; p=p->next; } r->next=q; r=r->next; return(head); } /*以下是头文件find.h的内容*/ 5 / 34
void find(list *h) { int k; list *p; p=h->next; printf("输入要查找学生的学号:\n"); scanf("%d", &k); while(p&&p->num!=k) p=p->next; if(p) { printf("学号\t姓名\t成绩\n"); printf("%d\t%s\t%d\n",p->num,p->name,p->score); } else printf("没找到!\n"); } /*以下是头文件del.h的内容*/ list *del(list *h) { int k; list *p, *q; q=h; p=h->next; printf("请输入待删除学生的学号:\n"); scanf("%d",&k); while(p&&p->num!=k) { q=p; p=p->next; } if(p) { q->next=p->next; free(p); } else printf("没有这个学生成绩,无法删除!\n"); return(h); } /*以下是头文件output.h的内容*/ void output(list *h) { list *p; p=h->next; while(p!=NULL) { printf("学号\t姓名\t成绩\t\n"); printf("%d\t%s\t%d\n",p->num,p->name,p->score); p=p->next; } } /*以下是主程序*/ #include"creat.h" #include"find.h" #include"insert.h" #include"output.h" #include"del.h" main() { list *p;