桂林电子科技大学信息科技学院数据结构实验指导书文档格式.docx
《桂林电子科技大学信息科技学院数据结构实验指导书文档格式.docx》由会员分享,可在线阅读,更多相关《桂林电子科技大学信息科技学院数据结构实验指导书文档格式.docx(41页珍藏版)》请在冰豆网上搜索。
intmain()
{Students1;
//声明创建一个结构体变量s1
或者使用键盘输入
cin>
>
s1.num;
cin>
s1.x;
s1.name;
//为s1的数据子域提供数据
s1.num=1001;
s1.x=83;
strcpy(s1.name,“李明”);
//输出结构体变量s1的内容
cout<
<
“姓名:
”<
s1.name<
endl;
;
“学号:
s1.num<
endl:
“成绩:
”<
s1.x<
ednl;
_getch();
return0;
}
2.设计一维数组,每个数组元素是Student结构体类型,通过以下语句段可以说明结构体数组的一般用法:
通过“结构体数组名[下标].数据子域”访问数据域。
Studenta[5];
//声明创建一个结构体数组a
for(inti=0,i<
5,i++)
{cout<
“学号:
”;
cin>
a[i].num;
//输出数组元素a[i]的学号域
“姓名:
a[i].name;
//输出数组元素a[i]的姓名域
“成绩:
a[i].x;
//输出数组元素a[i]的成绩域
}
以上是关于结构体的基本概念和简单运用。
三、类的基本概念及运用
类的是面向对象程序的基本单位。
类是由数据成员和相关的函数成员组成。
从面向对象的角度考虑“学生”这个类,它不仅包括“学生”的一般属性:
学号、姓名、成绩等等,还应包括对于这些属性的操作:
输入/输出、听课、实验、等等。
类定义的一般格式:
class类名
{若干数据成员;
若干函数成员;
};
类的数据成员和函数成员均存在访问控制权限问题。
访问控制分为三种:
公有(public)、私有(private)和受护(protected)。
数据成员的定义和结构体中的数据域定义是相似的。
不同的是它们必须明确访问控制。
而公有数据成员,可以认为与结构体的数据域的访问权限相同。
成员函数的定义又和一般函数的定义基本相同。
不同的是类中成员函数也必须明确访问控制权限。
如果在类之中定义成员函数带函数体,并未有什么特殊之处。
如果在类之中仅有成员函数的原型声明,当在类定义之外定义函数体时,需要加上类限定标识“类名:
:
”。
下面是“学生”类的定义:
classStudents//定义类结构体Students
{private:
//私有成员
longnum;
public:
//公有成员
Students();
~Students(){};
voidSetDat(longn,intx0,char*na0)
{num=n;
x=x0;
strcpy(name,na0);
voidPrintOut();
//输出函数的原型声明
…….;
};
voidStudents:
:
PrintOut()//输出函数前加Students:
{cout<
“姓名:
name<
num<
x<
在主程序中运用类Students。
{Studentss;
//声明创建一个类对象s,调用构造函数
s.PrintOut();
//输出s的内容
longm;
inty;
charxname[10];
“输入学号,成绩,姓名:
”;
cin>
m>
y>
xname;
s.SetDat(m,y,xname);
//修改对象s数据
s.PrintOut();
//输出改变后s的内容
运行结果:
姓名:
O
学号:
成绩:
0
输入学号,成绩,姓名:
100190WangMing
姓名:
WangMing
1001
90
这个例题中数据成员全部定义为私有(private),以便保证数据安全性。
而函数成员全部定义为公有(public)成员函数,可以作为类对外部的的接口。
通过s.SetDat(m,y,xname);
直接访公有函数成员SetDat(),将实参(主函数的局部变量m,y,xname)的数据赋给私有数据成员num,x,name。
通过s.PrintOut();
直接访公有函数成员PrintOut(),间接访问输出私有成员num,x,name。
四、结构体在类中的使用
1.结构体数组做类的数据成员
constintMAXSIZE=100;
//数组的容量
structElemType//数据元素的类型
{intnumb;
charname[20];
longtel;
};
classSqlist
{private:
ElemTypeelem[MAXSIZE];
//结构体ElemType类型的数组elem[]做数据成员
intlength;
public:
Sqlist(void);
~Sqlist(){};
//其他函数……
2.结构体指针变量做类的数据成员
structNodeType//结点的结构定义
{intdata;
//数据域
NodeType*next;
//指针域
};
classLink//类声明
{private:
NodeType*Head;
//指向结构构体NodeType的指针变量Head做数据成员
public:
Link(){Head=newNodeType;
//为头结点申请空间
Head->
next=Head;
//头结点Head形成空环
};
~Link(){};
voidcreat();
voidouts();
第2部分上机实验
上机实验要求及规范
一、实验目的、要求和任务
数据结构课程具有比较强的理论性,同时也具有较强的可应用性和实践性。
上机实验是一个重要的教学环节。
一般情况下学生能够重视实验环节,对于编写程序上机练习具有一定的积极性。
但是容易忽略实验的总结,忽略实验报告的撰写。
对于一名大学生必须严格训练分析总结能力、书面表达能力。
需要逐步培养书写科学实验报告以及科技论文的能力。
拿到一个题目,一般不要急于编程。
按照面向过程的程序设计思路(关于面向对象的训练将在其它后继课程中进行),正确的方法是:
首先理解问题,明确给定的条件和要求解决的问题,然后按照自顶向下,逐步求精,分而治之的策略,逐一地解决子问题。
具体实习步骤如下:
1.问题分析与系统结构设计
上机实验是针对一个具体的实际问题,进行程序设计以便解决问题。
首先需要充分地分析和理解问题本身,弄清要求做什么(而不是怎么做),限制条件是什么。
按照面向对象技术的原则,考虑所需设计的类是什么?
在主函数中如何使用类对象,如何实现问题的解决。
具体来讲,搞清实际问题的若干数据元素的逻辑结构(是线性表还是树、图?
),确定数据的存储结构(是顺序结构还是链表结构?
),设计哪些有关操作的函数。
将数据存储结构和算法对应的函数封装成为一个类,一些重要的典型的算法往往以类的成员函数形式出现。
要求绘制简明扼要的系统结构图,主要描述主函数系统结构。
对于复杂重要的算法,也要绘制该函数的流程图。
2.详细设计和编码
详细设计是对函数(模块)的进一步求精,用伪高级语言或自然语言写出算法框架,这时不必确定很多结构和变量。
编码,即程序设计。
就是对详细设计结果的进一步求精,即用某种高级语言(如C++语言)表达出来。
尽量多设一些注释语句,清晰易懂。
尽量临时增加一些输出语句,便于差错矫正,在程序成功后再删去它们。
3.上机准备
熟悉高级语言用法,如C++语言。
熟悉机器(即操作系统),基本的常用命令。
静态检查主要有两条路径,一是用一组测试数据手工执行程序(或分模块进行);
二是通过阅读或给别人讲解自己的程序而深入全面地理解程序逻辑,在这个过程中再加入一些注释和断言。
如果程序中逻辑概念清楚,后者将比前者有效。
4.上机调试程序
上机调试程序应该分步骤分层次进行。
程序由简到繁、规模由小到大、数据量由少到多,逐步完成。
比如,针对一个类它可能有许多函数,建议首先仅仅调试类的构造函数和输入/出函数,这一步比较简单容易。
即使如此,实验数据的规模也从少量几个开始(1-3个),程序调通之后,再用大量数据(十个到几十个或者更多)实验。
此时,还可以排除一些错误。
通过这一阶段,可以排除数据结构设计、构造函数和输入/输出函数设计的错误。
然后,再把体现重要算法的函数加入到源程序之中,这包括:
类代码中的函数原型声明、函数实现的程序代码以及对它的调用语句等等。
此时,实验数据规模也从少量几个开始,以便检查算法设计的正确性,程序基本调通之后,再用大量数据进行实验。
本阶段还可进一步排除一些错误。
但是,出现错误的范围往往集在新加入的代码段之中。
5.整理实习报告
在上机实开始之前要充分准备实验数据,在上机实践过程中要及时记录实验数据,在上机实践完成之后必须及时总结分析。
写出实验报告,实验报告的书写格式。
二、实验基本内容及学时分配
为了达到实验目的,本课程安排了五个实验单元,训练的重点在于基本的数据结构,而不是强调面面俱到。
各实验单元与教科书的各章只具有粗略的对应关系,一个实验题常常涉及到几部分教学内容。
总学时:
12学时。
1、线性表(2学时)
(1)熟悉线性表的基本运算在两种存储结构(顺序结构和链式结构)上的实现;
(2)以线性表的各种操作(建立、插入、删除等)的实现为重点;
(3)通过本次实验帮助学生提高C语言的编程能力(特别是函数参数、指针类型、链表的使用)。
2、栈和队列及其应用(4学时)
(1)掌握栈和队列这两种特殊的线性表,熟悉它们的特性,在实际问题背景下灵活运用它们;
(2)训练的要求是掌握“栈”的基本特点及其典型用法;
问题求解的状态表示及其递归算法;
由递归程序到非递归程序的转化方法。
3、串及其应用(2学时)
(1)熟悉串类型的实现方法和文本模式;
(2)串的模式匹配算法;
(3)熟悉一般文字处理软件的设计方法,较为复杂问题的分解、求精方法。
4、树、图及其应用(4学时)
(1)树和图是两种非线性数据结构,广义表的实质是树结构,而稀疏矩阵的十字链表存储结构也是图的一种存储结构,故本单元是本课的实习重点;
(2)要求学生熟悉各种存储结构的特性,以及如何应用树和图结构求解具体问题;
(3)训练的要点是:
递归算法的设计方法;
表达式的求值技术;
哈夫曼方法及其编译码技术;
完整的应用系统的用户界面设计和操作定义方法;
矩阵乘法的特殊操作顺序;
路径遍历(树、图的遍历)技术。
5、查找和排序(4学时)
本次实验旨在集中对几个专门的问题做较为深入的探讨和理解。
散列技术与实际问题关系密切,哈希函数的选择和冲突解决方法的选用都带有较强的技巧性和经验性;
学生在实习中体会这一有效技术在查找和内部排序实习中,理解开发高效率算法的可能性和寻找、构造高效算法的方法。
三、说明
1、该课程采用理论与实践相结合的教学方法,集知识性与趣味性于一体,达到良好的教学效果。
2、硬件要求:
在多媒体教室讲解及演示。
为保证教学顺利进行,要求实验室提供PII及以上的微机。
3、学生每次上机实验都必须遵守实验室的有关规定。
四、实验报告规范(详见附录1)
五、如何提高上机效率
为了提高上机的效率,真正达到实验目的,要求同学做好实验前的准备工作,写好实验预习报告,即实验报告规范中的1)、2)、3)、4)部分,编写好程序,并用一组测试数据手工执行程序静态检查程序是否有错,通过阅读、执行程序或给别人讲解自己的程序而深入全面地理解程序逻辑,提高程序的正确性。
对C,C++语言程序不熟悉的同学,上机时最好带上C,C++语言程序设计的教材,以备查询。
调试中遇到问题,应认真分析,确定可疑点,设置调试断点或输出断点处变量的值,以便发现问题,迅速排除问题,加快调试速度。
实验一线性表
一、实验目的
1.了解线性表的逻辑结构特性,以及这种特性在计算机内的两种存储结构。
2.重点是线性表的基本操作在两种存储结构上的实现;
其中以链表的操作为侧重点;
并进一步学习结构化的程序设计方法。
3.掌握使用C++面向对象的程序设计技术,设计数据结构源程序的方法。
二、实验内容
1.线性表的顺序存储表示(结构)及实现。
阅读下列程序请注意几个问题。
(1)关于线性表的顺序存储结构的本质是:
在逻辑上相邻的两个数据元素ai-1,ai,在存储地址中也是相邻的,既地址连续。
顺序存储结构也称“向量(vector)”。
在下列类设计中,采用静态一维数组elem[]表示向量,同时用length表示线性表长度。
ElemTypeelem[MAXSIZE];
(2)在上机实验时,需要将数据结构的类定义(包括成员函数的定义)的程序代码,写入源程序。
同时用户必须自己编写一段主函数main(),在主函数中创建声明类的具体对象,通过这些对象调用类的公有函数。
以便将一个典型数据结构类运用到实际问题中去。
●源称序结构:
见本资料的第1页。
●数据结构类定义(包括成员函数的定义)的程序代码
对于小型程序,这部分代码可以直接放入源称序之中,如上图所示。
对于复杂较大的程序,这部分代码可以生成一个头文件(例如Sqlistc.h)与源程序文件存储在同一个文件夹中。
再在源程序之中写入一个语句,如下:
#include“Sqlistc.h”;
●主函数
在学生没有学习可视化图形界面之前,建议在主函数中简单设计一个“菜单”(do-while循环内嵌套一个switch结构)。
随着学习的深入,应该学会熟练使用“菜单”技术,这样会明显提高编程和运行效率。
一个主函数一般样式如下:
intmain()
{//声明程序所需要的一般变量
inti,k;
ElemTypee,x;
//声明和创建类对象,这个类往往是典型数据结构类
Sqlistas;
cout<
"
\n线性表顺序存储结构演示"
do{//显示菜单内容
\n\n"
cout<
\n\n1.初步建立一个线性表"
\n\n2.插入一个数据元素"
\n\n3.删除一个元素,返回其值"
\n\n4.结束程序"
\n********************************"
\n请输入你的选择(1,2,3,4)"
k;
//接收用户的选择
//根据k值,转向对应的case分支程序段执行
switch(k)
{case1:
{as.SetData();
as.PrintOut();
}break;
case2:
{cout<
\n插入的位置,数据i,e=?
i>
e;
as.Insert(i,e);
}break;
case3:
\n删除第几个元i=?
i;
x=as.Delet(i);
\n元素数值="
x;
as.PrintOut();
}break;
default:
break;
}//switch
}while(k>
=1&
&
k<
4);
//
\n再见!
\n按任意键,返回。
_getch();
}//-----------------------------------------------
要求:
使用线性表实现一个通讯录,通讯录内容包含学号、姓名、电话三项数据。
完成通讯录数据的建立,记录插入和删除功能。
参考程序:
iomanip.h>
//--------------------------------------------------------------------
structElemType//数据元素的类型
{
intnumb;
charname[20];
inttel;
{
private:
Sqlist(void);
~Sqlist(){};
voidSetData();
voidInsert(inti,ElemTypee);
intDelet(inti,ElemType&
e);
voidPrintOut();
//-------------------------------------------------------------
Sqlist:
Sqlist(){length=0;
voidSqlist:
SetData()//初步建立一个通讯录
\n输入人数length="
length;
for(inti=0;
i<
i++)
{
\n输入学号:
cin>
elem[i].numb;
\n输入姓名:
elem[i].name;
\n输入电话号:
="
elem[i].tel;
Insert(inti,ElemTypee)//请完成此函数
//程序填空1
intSqlist:
Delet(inti,ElemType&
e)//删除成功返回1,否则返回0
//程序填空2
return1;
PrintOut()//输出
\n通讯录总人数:
\nPrintOutData:
\n"
setw(16)<
学号"
setw(20)<
姓名"
电话号"
for(intk=0;
k<
k++)
elem[k].numb<
elem[k].name<
elem[k].tel<
//--------------------------------------------------
{inti,k,x;
ElemTypee,w;
Sqlistas;
\n通讯录演示"
do{
\n\n1.初步建立一个通讯录(线性表)"
switch(k)
case1:
{as.SetData();
case2:
\n插入的位置,i=?
\n插入的数据编号=?
e.numb;
\n插入的数据姓名=?
e.name;
\n插入的数据电话号=?
e.tel;
as.Insert(i,e);
case3:
\n删除第几个