文档库 最新最全的文档下载
当前位置:文档库 › 数据结构大型实验实验报告

数据结构大型实验实验报告

数据结构大型实验实验报告
数据结构大型实验实验报告

目录

第一部分实验内容分析及实验准备 (3)

1.问题描述 (3)

2实验目的 (3)

3.实验基本要求 (3)

4.开发环境 (4)

5.实验主要思路 (4)

主要程序 (4)

运算 (4)

6.基本数据结构、类 (4)

基本数据结构采用:链表(List)容器 (4)

链表类List的部分说明以及常用源码 (4)

大整数类BigInt说明以及部分源码 (6)

Cal类 (7)

BigInt类大数运算实现: (7)

7.程序流程图 (14)

第二部分实验验证分析及测试结果 (15)

1.程序所能达到的功能: (15)

2.输入形式和输入值范围 (15)

3.输出形式 (15)

4.测试数据 (16)

正确结果数据示例 (16)

错误信息输出的格式示例 (18)

第三部分调试分析 (19)

调试过程中的主要技术问题以及具体的解决方法 (19)

技术难点分析 (19)

印象最深刻的3个调试错误,及修正方法 (20)

第四部分附录 (20)

第一部分实验内容分析及实验准备

1.问题描述

密码学分为两类密码:对称密码和非对称密码。对称密码主要用于数据的加/解密,而非对称密码则主要用于认证、数字签名等场合。非对称密码在加密和解密时,是把加密的数据当作一个大的正整数来处理,这样就涉及到大整数的加、减、乘、除和指数运算等,同时,还需要对大整数进行输出。请采用相应的数据结构实现大整数的加、减、乘、除和指数运算,以及大整数的输入和输出。

2实验目的

1)掌握双向循环链表的设计以及逻辑特征;

2)掌握迭代器的设计以及操作;

3)能熟练通过迭代器完成双向循环链表的插入、删除、遍历以及其他复杂应用;

3.实验基本要求

1)要求采用链表来实现大整数的存储和运算,不允许使用标准模板类的链表类

(list)和函数。同时要求可以从键盘输入大整数,也可以文件输入大整数,大整数可以输出至显示器,也可以输出至文件。大整数的存储、运算和显示,可以同时支持二进制和十进制,但至少要支持十进制。大整数输出显示时,必须能清楚地表达出整数的位数。测试时,各种情况都需要测试,并附上测试截图;

2)要求大整数的长度可以不受限制,即大整数的十进制位数不受限制,可以为

十几位的整数,也可以为500多位的整数,甚至更长;

3)大整数的运算和显示时,只需要考虑正的大整数。如果可能的话,请以秒为

单位显示每次大整数运算的时间;

4)要求采用类的设计思路,不允许出现类以外的函数定义,但允许友元函数。

主函数中只能出现类的成员函数的调用,不允许出现对其它函数的调用。5)要求采用多文件方式:.h文件存储类的声明,.cpp文件存储类的实现,主函

数main存储在另外一个单独的cpp文件中。如果采用类模板,则类的声明和实现都放在.h文件中。

6)要求源程序中有相应注释;

7)不强制要求采用类模板,也不要求采用可视化窗口;

8)要求测试例子要比较详尽,各种极限情况也要考虑到,测试的输出信息要详

细易懂,表明各个功能的执行正确;

9)要求采用Visual C++ 6.0及以上版本进行调试;

4.开发环境

本次实验的开发环境为:

●操作系统:

–OS X 10.9.5

●IDE:

–X code version 6.1.1

●开发语言:

–C++(with C++11 Standard)

●实验报告绘图:

–Edraw Max V7.3

5.实验主要思路

主要程序

根据题目要求,此次需要实现一个list容器,然后再将封装一个类来实现大整数的存储,并实现一些基本操作;然后,再封装一个类来完成各种操作与检验。

运算

加减乘除加减乘除操作都采用模拟竖式的形式,对两个操作数进行逐位运算,最终得出结果。

幂运算采用二分法,配合乘除进行运算。

6.基本数据结构、类

基本数据结构采用:链表(List)容器

双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。本实验构造的是双向循环链表。

链表类List的部分说明以及常用源码

List 类大致设计思路图

1) Node 结点

struct Node {

public:

value_type _value; //存于结点的值 Node * _next = nullptr;// 后继指针 Node * _prev = nullptr;// 前驱指针 Node(){}

Node(value_type Val);

Node(value_type Val, Node* Prev, Node* Next) : };

2)结点插入与删除

加入或删除时,会对所在位置,以及其前后的元素的指针进行断开、连接,所以效率很高,之后的大整数也会利用这一特性来完成一些函数。

_front _back begin()

end()rbegin()

rend()

链表List 类成员中包括:

结点类:Node ();正向迭代器类:Iterator();

逆向迭代器类:ReverseIterator();

begin() //返回正向迭代器头

rend()//返回逆向迭代器尾(表头)

rbegin() //返回逆向迭代器头(表尾)

end()//返回正向迭代器尾

指向_front//表头

_back//指向表头尾间空结点

Node 结点

/*** 在末位添加一个元素Val ***/ void push_back(const value_type& Val) { iterator Iter = _back->_prev; iterator tmpIter=new Node(Val); Iter->_next = tmpIter; Iter->_next->_next = _back; Iter->_next->_prev = Iter; _back->_prev = Iter->_next; if (empty())

/*** 删除末位元素代码***/ void pop_back() {

assert(!empty())

iterator IterDel = _back->_prev; iterator Iter = _back->_prev->_prev; Iter->_next = _back; _back->_prev = Iter; if (IterDel == begin()) _front = _front->_next; delete IterDel;

3)迭代器

迭代器(iterator )是一种对象,它能够用来遍历标准模板库容器中的部分或全部元素,每个迭代器对象代表容器中的确定的地址。

List 中实现了正向和逆向迭代器,虽然只用正向就足够了,但是为了方便之后的大数实现,还是加入了逆向迭代器,逆向迭代器的自增、自减与正向迭代器正好相反,使之后的开发更好理解。 大整数类BigInt 说明以及部分源码

设计思想

用List类的数据成员myList 来存放大整数,每个结点存放一位十进制数字。并且重载+、-、*、/、%、^等运算符来实现大整数类的运算。此外,因为运算需要,还重载了==、>、<等比较运算符。

/*** 返回正向迭代头部 ***/ Iterator begin() { return iterator(_front); } /*** 返回正向迭代尾部 ***/ Iterator end() { return iterator(_back); } class BigInt //BigInt 类的声明 { public: void read(short int temp); //读取一个BigInt 对象 void display(ostream & out) const;//显示一个BigInt 的对象 BigInt operator+(BigInt addend2);//加法运算符 BigInt operator-(BigInt subtrahend);//减法运算符 BigInt operator*(BigInt multiplier);//乘法运算符 BigInt operator/(BigInt divisor);//除法运算符 BigInt operator^(BigInt divisor);//幂运算符 BigInt operator%(BigInt divisor);//取膜运算符 bool operator>(BigInt compare);//大数大小比较运算符 bool operator<(BigInt compare);//大数大小比较运算符 bool operator==(BigInt Right); //==运算符 BigInt removeZero(BigInt origin);//去除有效位数之前的0 private: List myList;

List类和BigInt类中常用成员部分关系图

Cal类

Cal主要用于从键盘读入表达式,并且识别运算符,左运算数和右运算数。然后调用重载的+、-、*、/、^等运算,并对运算结果进行取余操作。最后显示运算结果的位数,取余操作后的值已经运算时间。

Cal类成员图

BigInt类大数运算实现:

实现采用模拟竖式的方法,通过逐位的运算,来获取最终的结果。其中加法、减法以及乘法为基础的操作,无需依赖其他运算操作,同时这三个运算也有一个类似点,都是从后往前计算;而除法则是在有减法的前提下实现,与前三样不同,除法是从前往后进行运算;最后,幂运算是在有乘除的前提下,通过二分法来递归计算。接下来会给出具体的思路。

实现思路

加法使用一个逆向迭代器,从后往前对两个操作数进行逐位相加。定义两个临时变量,一个保存逐位相加结果的个位数字,压入链表;另一个保存进位,与下一轮的运算结果相加。

代码如下:

BigInt BigInt::operator+(BigInt addend2)

{

BigInt sum;

short int first, //第一个加数中的一位(这个对象)

second, //第二个加数中的一位(addend2)

result, //他们的和中的一位

carry = 0; //两位相加的进位

List::reverse_iterator //从右到左迭代

it1=myList.rbegin(), //第一个list

it2=addend2.myList.rbegin(); //第二个list while (it1 != myList.rend() || it2 != addend2.myList.rend())

{

if (it1 != myList.rend()) //如果前面没有数字,则first取0

{

first = *it1;

it1++ ;

}

else

first = 0;

if (it2 != addend2.myList.rend())//如果前面没有数字,则second取0

{

second = *it2;

it2++ ;

}

else

second = 0;

short int temp = first + second + carry; //临时变量保存两位数和进位

result = temp % 10;

carry = temp / 10;

sum.myList.push_front(result);

}

if (carry > 0)

sum.myList.push_front(carry); //将结果的十位数压入链表尾部return sum; //返回和

}

实现思路

减法与加法过程相似,一开始比较两个大整数判断,决定结果正负值,若为负值,交换减数被减数,递归调用减法,并且在值的第一位取负数。最后逐位判断时,是判断数字是否为负,如果是,则从前一位取1。如果结果有效位数之前为0,则将0删除。

代码如下:

BigInt BigInt::operator-(BigInt subtractor)

{

BigInt dif;

short int first, //被减数的一位(这个对象)

second, //减数的一位

carry = 0; //两位相加的退位

List::reverse_iterator //从右到左迭代

it1=myList.rbegin(), //第一个list

it2=subtractor.myList.rbegin(); //第二个list

while (it1 != myList.rend() || it2 != subtractor.myList.rend())

{

if (it1 != myList.rend())

{

first = *it1;

it1++ ;

}

else

first = 0;

if (it2 != subtractor.myList.rend())

{

second = *it2;

it2++ ;

}

else

second = 0;

if (*this>=subtractor) //如果被减数大于等于减数

{

short int temp=0;

if (first>second||((first==second)&&(carry==0)))

{ //被减数的位大于减数的,或者等于且之前没有退位

temp = first-second-carry;

carry=0; //不进行退位

}

else //被减数的其中一位小于减数,则需要退位

first+=10; //退位,当前位+10

temp = first -carry- second;

carry=1; //标记退位数1

}

dif.myList.push_front(temp);

}

else //如果被减数小于减数字

{

dif=subtractor-*this; //递归调用

*(--dif.myList.rend())=0-(*(--dif.myList.rend())); //第一位取负值}

}

return dif.removeZero(dif);

}

3.乘法

实现思路

乘法也是模拟竖式,从右到左迭代,使用两重循环,用第二个乘数的每一位逐个去乘第一个乘数的每一位。

代码如下:

// -----------------*的定义

BigInt BigInt::operator*(BigInt multiplier)

{

BigInt pro; //存乘积

BigInt tmp;

short int first, //第一个乘数中的一位(这个对象)

second, //第二个乘数中的一位(multiplier)

result, //他们的积中的一位

carry = 0; //两位相乘的进位

List::reverse_iterator //从右到左迭代

it1=myList.rbegin(), //第一个list

it2=multiplier.myList.rbegin(); //第二个list

while (it2 != multiplier.myList.rend())

{

if (it2 != multiplier.myList.rend())

{

second = *it2;

it2++;

}

second = 0;

while (it1 != myList.rend())

{

if (it1 != myList.rend())

{

first = *it1;

it1++ ;

}

else

first = 0;

short int temp = first * second + carry; //两位相乘,并加上进位

result = temp % 10;

carry = temp / 10;

tmp.myList.push_front(result); //将十位数压入链表;

}

if (carry > 0)

tmp.myList.push_front(carry);

for ( List::reverse_iterator it=multiplier.myList.rbegin()->_prev;it!=it2;it++)

{ //根据外层循环轮数,控制末尾补充的0数

tmp.myList.push_back(0);

}

carry=0; //里循环结束,carry归零

pro=pro+tmp;

tmp.myList.clear();

it1=myList.rbegin(); //第一个迭代器归位

}

return pro;//返回乘积

}

4.除法

实现思路

除法与前三种运算不同,是从左往右进行运算。先从被除数中截取与除数相同长度的数,然后进行减法运算,直到被减数小于右操作数时,从被除数中再取一位放入被减数的末位,继续运算,直到结束。

代码如下:

BigInt BigInt::operator/(BigInt divisor)

{

BigInt quo; //存商

BigInt tmp; //存被除数中截取到到与除数相同长度的数

if((*this)

{

quo.myList.push_back(0);

return quo;

}

List::iterator //从左到右迭代

it1=myList.begin(), //第一个list

it2=divisor.myList.begin(); //第二个list

while (it2!=divisor.myList.end()) //从被除数中截取和除数一样位数的tmp {

tmp.myList.push_back(*it1);

it1++;

it2++;

}

for(--it1;it1!=myList.end(); it1++)

{

int i=0;

while (tmp>divisor||tmp == divisor) //直到被减数小于等于右操作数

{

tmp =tmp-divisor;

i++;

}

tmp.myList.push_back(it1->_next->_value);//向后借位

quo.myList.push_back(i) ;

//移去开头的零以免比较时出问题tmp

tmp=tmp.removeZero(tmp) ;

}

quo=quo.removeZero(quo) ;

return quo;//返回商

}

510

55525552525255幂运算图解5.幂运算 实现思路

幂运算在有了乘法、除法的基础上,使用二分法实现,若n 为偶数,m n

=m n 2?m n 2

, 若n 为奇数,m n

=m n 2

?m n 2

?m ,

代码如下:

BigInt BigInt::operator^(BigInt divisor) {

BigInt bigInt2;

bigInt2.myList.push_back(2); //大整数类的2 BigInt bigInt1;

bigInt1.myList.push_back(1); //大整数类的1 BigInt bigInt0;

bigInt0.myList.push_back(0); //大整数类的0

if (divisor== bigInt2) //如果幂为2 return (*this)*(*this);

else if (divisor== bigInt1) //如果幂为1 return *this;

else if (divisor == bigInt0) //如果幂为0 return bigInt1; else //否则递归调用 {

int n = *(divisor.myList.rbegin()); if (n % 2 == 0) return

((*this)^(divisor/bigInt2))*((*this)^(divisor/bigInt2)); else

return

((*this)^(divisor/bigInt2))*((*this)^(divisor/bigInt2))*(*this); } }

第二部分实验验证分析及测试结果

1.程序所能达到的功能

本程序采用链表数据结构实现大整数的加、减、乘、除和指数运算,以及大整数的输入和输出。从键盘输入大整数,也可以文件输入大整数,大整数可以输出至显示器,也可以输出至文件。大整数的存储、运算和显示支持十进制。大整数输出显示时,能输出整数的位数。理论上大整数的长度可以不受限制,即大整数的十进制位数不受限制,可以为十几位的整数,也可以为500多位的整数,甚至更长;本程序只支持正的大整数和二元运算。支持请以秒为单位显示每次大整数运算的时间。

2.输入形式和输入值范围

1)理论上可输入无限大的数;

2)不可以输入负数;

3)仅支持一个运算符的表达式,即不支持a+b+c形式运算;

4)支持+、-、*、/、^、%6个操作符,需要在英文输入法下输入;

6)输入表达式以后,还需要输入m,2m为模数;

7)输入f直接从文件读取表达式,输入q退出程序;

3.输出形式

例如输入:7460620*10364627

128

输出:

取余操作下运算结果为:

77326543488740

原始计算结果为14位.

…计算耗时0 S.

结果同时输出到:

Expression.txt文件中

4.测试数据

正确结果数据示例加法运算结果:

减法运算结果:

乘法运算结果:

除法运算结果:

幂运算结果:

错误信息输出的格式示例输入:

7460620*eda

输出表达式非法!

输入:

7460620*10364627 eda

输出:输入非法。

m必须为整数!

第三部分调试分析

调试过程中的主要技术问题以及具体的解决方法

1.List类

List为本实验的核心部分,List中实现了正向和逆向迭代器,虽然只用正向就足够了,但是为了方便之后的大数实现,还是加入了逆向迭代器,逆向迭代器的自增、自减与正向迭代器正好相反,使之后的开发更好理解。

2. 大整数运算实现

BigInt类+、-、*、/、%、^的重载。实现采用模拟竖式的方法,通过逐位的运算,来获取最终的结果。本来参考教材551页长整数运算的算法思想,把长整数分成若干块,每块3位,存到链表的一个节点中。每个结点中数据部分采用short型。这样提高了运算效率但是后续实验中遇到了问题(比如乘法运算时候结果超出了short范围。除法运算时候取和除数一样长度的数时候遇到了技术问题)只好采用每个结点保存一位数的方法。

3. 整数读取与错误检测

大整数的读取。通过逐一读取字符串中的字符,保存到BigInt类的Number1中。遇到运算符保存到运算符变量。运算符后的字符保存到Number2中。错误检测部分虽然有做,但是做的不够好。

技术难点分析

1.List实现

最开始List并不是循环的,靠两个指针指向头尾,后来发现这样在实现迭代器会有一些麻烦,后来在同学们的帮助下,了解了STL中链表的形式,改成了循环链表,解决问题。关于此类说明前面已经给出说明。

2.减法运算

被减数小于减数时候,采用传统的竖式会出现问题,最后采用比较两个数大小(比较运算符重载),若被减数小于减数,则两数交换,再调用减法运算,并且在结果开头添加负号。有效位数之前的0全部删除。

.

3.幂运算实现

本打算使用循环方法,而且思路不是很清晰,而且效率太低;然后想到了二

分法,这样的时间复杂度就是O(LogN)了,大大提升了性能。具体实现方法前面已给出说明。

印象最深刻的3个调试错误,及修正方法

1.最早的程序参照参考教材551页长整数运算的算法思想,在重载输入操作符的时候(inline operator>>(istream in, BigInt number))忘记使用引用&符号。导致数字怎么也读不进去,当然随着程序复杂度增加和功能的不断改进,这种输入机制被淘汰。

2.在实现减法运算时,结果长整数的中间几位带着负号。例如12434-12-12。原先的算法是通过逐位相减。首先判断两数大小来确定退位,如果被减数此位大于等于减数的,则不退位。后来分析发现问题:如果前一位运算已经退位过了,则两位数相等的情况也需要退位。

最终算法:if (first>second||((first==second)&&(carry==0)))

其中Carry为退位数,first和second分别为两大整数该位的数字。

3.由于使用while循环来实现程序循环进行,直到用户输入q才终止程序的运行。那么导致在第二次运算以后结果出现了问题,即运算结果错误且严重偏大。

后来分析后发现。在第二轮循环以后,任然往BigInt类对象number1,number2中的链表插入数字。即原先的值没有删除。最后在一轮循环结束后将其清零,问题得以解决。

类似的调试错误还有很多,此处不再一一列举。

程序基本按照试验任务书要求完成,且运算结果正确,无明显bug,代码托管到https://https://www.wendangku.net/doc/494558310.html,/helloeda/code/BigInt。当然还有很多不完善的地方。比如可以学习使用更高效的求幂运算的算法,使用栈等容器来实现多元运算。此外不能很好使用调试工具导致Debug效率底下,这些日后后待提高。

第四部分附录

//

// main.cpp

//

#include

#include "List.h"

#include "BigInt.h"

#include "Cal.h"

#include

using namespace std;

int main(int argc, const char * argv[]) {

Cal start;

start.calculate();

}

// List.h

// List

#ifndef LIST

#define LIST

#include

#include

#include

using namespace std;

template

class List

{

/***节点类***/

private:

struct Node

{

public:

value_type _value;

Node * _next = nullptr;

Node * _prev = nullptr;

Node(){}

Node(value_type Val)

{

_value = Val;

}

Node(value_type Val, Node* Prev, Node* Next) :

_value(Val),

_prev(Prev),

_next(Next)

{ }

};

typedef Node* node_pointer;

数据结构实验报告格式

《数据结构课程实验》大纲 一、《数据结构课程实验》的地位与作用 “数据结构”是计算机专业一门重要的专业技术基础课程,是计算机专业的一门核心的关键性课程。本课程较系统地介绍了软件设计中常用的数据结构以及相应的存储结构和实现算法,介绍了常用的多种查找和排序技术,并做了性能分析和比较,内容非常丰富。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: (1)内容丰富,学习量大,给学习带来困难; (2)贯穿全书的动态链表存储结构和递归技术是学习中的重点也是难点; (3)所用到的技术多,而在此之前的各门课程中所介绍的专业性知识又不多,因而加大了学习难度; (4)隐含在各部分的技术和方法丰富,也是学习的重点和难点。 根据《数据结构课程》课程本身的技术特性,设置《数据结构课程实验》实践环节十分重要。通过实验实践内容的训练,突出构造性思维训练的特征, 目的是提高学生组织数据及编写大型程序的能力。实验学时为18。 二、《数据结构课程实验》的目的和要求 不少学生在解答习题尤其是算法设计题时,觉得无从下手,做起来特别费劲。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 为了帮助学生更好地学习本课程,理解和掌握算法设计所需的技术,为整个专业学习打好基础,要求运用所学知识,上机解决一些典型问题,通过分析、设计、编码、调试等各环节的训练,使学生深刻理解、牢固掌握所用到的一些技术。数据结构中稍微复杂一些的算法设计中可能同时要用到多种技术和方法,如算法设计的构思方法,动态链表,算法的编码,递归技术,与特定问题相关的技术等,要求重点掌握线性链表、二叉树和树、图结构、数组结构相关算法的设计。在掌握基本算法的基础上,掌握分析、解决实际问题的能力。 三、《数据结构课程实验》内容 课程实验共18学时,要求完成以下六个题目: 实习一约瑟夫环问题(2学时)

人事管理系统-软件工程实验报告

软件工程实验报告 课题:人事管理系统学生姓名: 学号: 专业班级: 指导教师: 同组成员:

需求分析 一、实验目的 掌握软件需求的结构化分析方法。 二、实验任务与实验要求 导出系统详细的逻辑模型,这里用数据流图来表示。 三、实验内容 (1)功能分析 经过初步分析“人事管理系统”应该具备以下主要功能。 1、职员个人信息资料的增加、修改和删除; 2、职员的考勤录入和查询; 3、职员工资结算和查询; 4、人事管理人员的变化和操作授权; 由于是使用计算机管理,就带来了新的功能:用户登陆、操作人员的管理、基本数据的维护、由数据安全产生的数据备份与恢复。 (2)、关系模式 在满足函数依赖和无损连接的基础上,使数据的设计更加合理。在本系统中只有3个实体,那就是普通员工、管理员、超级管理员,他们权限的不听通过角色来区分。在整个系统中超级管理员只有一人,管理员二人。一个人只可以在普通员工、管理员、超级管理员中处于一个角色,而不可以兼任。其具体的关系模式如下: 普通员工(员工号,密码,姓名,性别,出生年月,身份证号,联系电话,就职时间) 管理员(管理员号,密码,姓名,性别,出生年月,身份证号,联系电话,就职时间) 超级管理员(超级管理员号,密码,姓名,性别,出生年月,身份证号,联系电话,就职时间) 工资(员工号,时间,基本工资,提成,奖金) 考勤(员工号,时间,迟到,早退,管理员号) 注意:“”表示主码,“”表示既是主码又是外码。 E-R图如下所示

数据字典设计: 为了方便数据库的管理和维护,本系统只设计一个数据库workers.mdb,其中包含worker(员工信息表)、manager(考勤信息表)、booklist(工资信息表) 表1-1 worker(员工信息表)各字段设计 表1-2 monit (考勤信息表)各字段设计

数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 1.实验目的 (1)掌握使用Visual C++ 6.0上机调试程序的基本方法; (2)掌握线性表的基本操作:初始化、插入、删除、取数据元素等运算在顺序存储结构和链表存储结构上的程序设计方法。 2.实验要求 (1)认真阅读和掌握和本实验相关的教材内容。 (2)认真阅读和掌握本章相关内容的程序。 (3)上机运行程序。 (4)保存和打印出程序的运行结果,并结合程序进行分析。 (5)按照你对线性表的操作需要,重新改写主程序并运行,打印出文件清单和运行结果 实验代码: 1)头文件模块 #include iostream.h>//头文件 #include//库头文件-----动态分配内存空间 typedef int elemtype;//定义数据域的类型 typedef struct linknode//定义结点类型 { elemtype data;//定义数据域 struct linknode *next;//定义结点指针 }nodetype; 2)创建单链表

nodetype *create()//建立单链表,由用户输入各结点data域之值,//以0表示输入结束 { elemtype d;//定义数据元素d nodetype *h=NULL,*s,*t;//定义结点指针 int i=1; cout<<"建立一个单链表"<> d; if(d==0) break;//以0表示输入结束 if(i==1)//建立第一个结点 { h=(nodetype*)malloc(sizeof(nodetype));//表示指针h h->data=d;h->next=NULL;t=h;//h是头指针 } else//建立其余结点 { s=(nodetype*) malloc(sizeof(nodetype)); s->data=d;s->next=NULL;t->next=s; t=s;//t始终指向生成的单链表的最后一个节点

数据结构实验报告

数据结构实验报告 一.题目要求 1)编程实现二叉排序树,包括生成、插入,删除; 2)对二叉排序树进行先根、中根、和后根非递归遍历; 3)每次对树的修改操作和遍历操作的显示结果都需要在屏幕上用树的形状表示出来。 4)分别用二叉排序树和数组去存储一个班(50人以上)的成员信息(至少包括学号、姓名、成绩3项),对比查找效率,并说明在什么情况下二叉排序树效率高,为什么? 二.解决方案 对于前三个题目要求,我们用一个程序实现代码如下 #include #include #include #include "Stack.h"//栈的头文件,没有用上 typedefintElemType; //数据类型 typedefint Status; //返回值类型 //定义二叉树结构 typedefstructBiTNode{ ElemType data; //数据域 structBiTNode *lChild, *rChild;//左右子树域 }BiTNode, *BiTree; intInsertBST(BiTree&T,int key){//插入二叉树函数 if(T==NULL) { T = (BiTree)malloc(sizeof(BiTNode)); T->data=key; T->lChild=T->rChild=NULL; return 1; } else if(keydata){ InsertBST(T->lChild,key); } else if(key>T->data){ InsertBST(T->rChild,key); } else return 0; } BiTreeCreateBST(int a[],int n){//创建二叉树函数 BiTreebst=NULL; inti=0; while(i

实验报告格式范文

实验报告格式范文 实验一撰写可行性研究报告 一、实验目的 1、掌握可行性研究步骤; 2、学习编制可行性研究报告。 二、实验要求 硬件:Intel Pentium 120 或以上级别的CPU,大于16MB的内存。 软件:Win dows 95/98/2000 操作系统,Office 97/2000 软件 学时:2学时 写岀此项实验报告 三、实验内容 1、可行性研究(结构化分析)方法; 2、绘制数据流图,使用Word写实验报告。 四、实验步骤 1 ?引言 1.1 编写目的 可行性研究的目的是为了对问题进行研究,以最小的代价在最短的时间内确定问题是否可解。 经过对此项目进行详细调查研究,初拟系统实现报告,对软件开发中将要面临的问题及其解决方案进行初步设计及合理安排。明确开发风险及其所带来的经济效益。本报告经审核后,交软件经理审查。 1 . 2 项目背景 (1 )待开发的软件产品名称:旅行社机票预定系统。 (2)本项目的提岀者:冯剑。开发者:李翀。用户:旅行社 (3)本软件产品将用于旅行社的机票预定和费用的记录。

1 . 3术语说明 DFD (数据流图):一种描述书记变换的图形工具,是结构化分析方法最普遍采用的表示手段,但数据流图并不是结构化分析模型的全部,数据字典和小说明为数据流图提供了补充,并用以验证图形表示的正确性、一致性和完整性,三者共同构成了被建系统的模型。 1 . 4.系统参考文献 参考文献见附录 2?可行性研究的前提 2.1基本要求 ⑴功能 本软件实现的功能有:为游客提供机票预定服务,提高旅游局的服务质量和服务效率。 对航班数据库的查询和修改,对机票费用记帐数据库的查询和修改,记录旅客信息(姓名、性别、年龄、身份证号、单位、旅行时间、目的地)、航班时间和班次,打印机票和帐单。 (2) 性能 时间:提供的信息必须及时的反映在工作平台上。售票系统的定单必须无差错的存 储在机场的主服务器上。对服务器上的数据必须进行及时正确的刷新。一笔业务在一分钟内完成。空间:运行空间 2M。 (3) 系统的输入和输岀 输入:旅行社定票单。数据完整,详实。 输岀:机票、帐单。简捷,快速,实时。 (4) 处理流程 旅行社将定票信息输入定票系统,系统输岀机票和帐单给旅客。 5 )安全保密要求

数据结构实验报告-答案

数据结构(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] 留在原位

数据流图实验报告

数据流图实验报告 篇一:软件工程实验报告 篇二:需求分析实验报告 软件工程实践报告 计科12—1班 杨光敏 08123234 (一)软件需求分析 1.实验目的 学习图形工具软件VISIO,掌握结构化需求分析方法,熟练绘制数据流图;学习快速原型工具的使用。 2.基本要求 (1)针对银行ATM系统进行需求分析工作,了解银行ATM系统的功能、流程;(2)安装VISIOXX以上版本软件,熟练应用Visio绘制DFD图,绘制银行ATM系统数据流图,完成系统的软件逻辑模型; (3)安装Axure RP Pro 或者Balsamiq Mockups快速原型软件,学习绘制软件原型,完成银行ATM系统的软件原型。 3.系统概述 (1)ATM系统为银行提供一套高效稳定可靠的终端服务平台,为储户登录,

存款,取款,查询,打印凭条,转账,修改密码等操作提供便利。 图1 ATM工作流程 (2).用户特点 本软件的用户主要是银行的广大持卡人,大多都具有使用ATM经验。另外,我们的系统要实现的一个重要目标就是当储户取钱出现故障时能在下笔业务进行之前自动恢复。以此来方便用户和保障用户的利益。本系统还为用户提供了足够的界面友好性和易操作性。即使是一个对ATM系统完全陌生的客户,也可以在交易界面的提示下顺利完成交易。 另外一部分的用户是银行工作人员,本系统不予考虑。 4需求说明 (1) 基本描述 ATM终端可以接受一张可识别的银行储蓄卡,通过储户身份验证后,同储户进行各种交互,例如:查询、存款、取款、打印凭条等;处理储户相应的要求,执行对应操作,为储户服务。该系统要求须保持一定时间内的交易记录,系统应每天自动汇总各种交易数据与服务器进行对账。同时,在通讯失败或其他交易结果不确定的情况下,ATM要自动发起冲正交易,以保证账务的完整性。 本系统的实现需要记录一些相关信息,其中包括的信息有:用户信息和交易信息。

《数据结构》实验报告1

xxx 实验报告 一、实验目的 1.熟悉上机环境,进一步掌握语言的结构特点。 2.掌握线性表的顺序存储结构的定义及实现。 3.掌握线性表的链式存储结构——单链表的定义及实现。 4.掌握线性表在顺序存储结构即顺序表中的各种基本操作。 5.掌握线性表在链式存储结构——单链表中的各种基本操作。 二、实验内容 1.顺序线性表的建立、插入及删除。 2.链式线性表的建立、插入及删除。 三、实验步骤 1.建立含n个数据元素的顺序表并输出该表中各元素的值及顺序表的长度。 2.利用前面的实验先建立一个顺序表L={21,23,14,5,56,17,31},然后在第i 个位置插入元素68。 3.建立一个带头结点的单链表,结点的值域为整型数据。要求将用户输入的数据按尾插入法来建立相应单链表。 四、程序主要语句及作用 1)程序1的主要代码(附简要注释) #include using namespace std; #define MAXSIZE 1024 en>=MAXSIZE) { printf("the list is overflow\n"); return ERROR; } else if((i<1)||(i>(*L).len+1)) { printf("position is not corrent.\n"); return ERROR; } else{ for(j=(*L).len-1;j>=i-1;j--) ec[j+1]=(*L).vec[j]; ec[i]=x; len++;

部分的时间都用在了编程上,主要是因为C语言掌握的问题,C语言基础不好特别是对于C语言中链表的一些定义和基本操作不够熟练,导致在编程过程中还要不断的拿着c语言的教材查找,所以今后还要对C语言多练习,多动手,多思考。 2.数据结构有很强的逻辑性,因此我认为如果在上机之前先把逻辑搞清楚很重要,不管是对算法的设计还是对程序的调试都有很大帮助。 3.经过一次上机实践,我认为实践课很重要,上理论课只是纸上谈兵,只是被动地接受,而实践课上能将学过的知识利用起来,同时还有一些东西只能是自己上机实践才能慢慢探索出的。 所以我在做试验的时候特别费劲,特别吃力,这也是事出有因的。通过自我反省,总结不足之处后,我还是脚踏实地去查找资料,包括请教老师,上网搜索数据库线性表操作的优秀代码,经过不断的验证,修改和深入的研究,最终使得自己的程序得以运行,实现了实验的最终目的和要求。 也许每次实验都是有个过程的,虽然过程比较繁琐和艰难,但是我觉得只要认真的分析实验内容,积极搜索实验所需材料,再多多请教老师和同学,那么实验就不会困难重重。 自己要学习的地方太多,以后更要努力学习数据结构。

数据结构实验报告图实验

图实验一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10;

template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp

#include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e) { int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) {

数据结构实验报告模板

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&List) //单链表排序 ListClear(&L); //将单链表L中的所有元素删除,使单链表变为空表 ListDestroy(&L);//将单链表销毁 }ADT List 其他函数: 主函数; 结点类; 约瑟夫函数 2.1 存储结构

[内容要求] 1、存储结构:顺序表、单链表或其他存储结构,需要画示意图,可参考书上P59 页图2-9 2.2 关键算法分析 结点类: template class CirList;//声明单链表类 template class ListNode{//结点类定义; friend class CirList;//声明链表类LinkList为友元类; Type data;//结点的数据域; ListNode*next;//结点的指针域; public: ListNode():next(NULL){}//默认构造函数; ListNode(const Type &e):data(e),next(NULL){}//构造函数 Type & GetNodeData(){return data;}//返回结点的数据值; ListNode*GetNodePtr(){return next;}//返回结点的指针域的值; void SetNodeData(Type&e){data=e;}//设置结点的数据值; void SetNodePtr(ListNode*ptr){next=ptr;} //设置结点的指针值; }; 单循环链表类: templateclass CirList { ListNode*head;//循环链表头指针 public: CirList(){head=new ListNode();head->next=head;}//构造函数,建立带头节点的空循环链表 ~CirList(){CirListClear();delete head;}//析构函数,删除循环链表 void Clear();//将线性链表置为空表 void AddElem(Type &e);//添加元素 ListNode *GetElem(int i)const;//返回单链表第i个结点的地址 void CirListClear();//将循环链表置为空表 int Length()const;//求线性链表的长度 ListNode*ListNextElem(ListNode*p=NULL);//返回循环链表p指针指向节点的直接后继,若不输入参数,则返回头指针 ListNode*CirListRemove(ListNode*p);//在循环链表中删除p指针指向节点的直接后继,且将其地址通过函数值返回 CirList&operator=(CirList&List);//重载赋

实验分析数据流和绘制数据流图

实验报告课程名称_软件工程导论__________ 学院____计算机工程学院_________班级14软件1班 学号2014144141 姓名秦川 2016年11月8日

批阅教师时间实验成绩 课程名称软件工程 学号2014144141姓名秦川实验日期2016.11.8实验名称实验2分析数据流和绘制数据流图 实验目的: 1、掌握数据流的分析方法 2、掌握数据流图的绘制 实验内容: 任务一绘制数据流图 任务二分析数据流和绘制数据流图 案例一:总务办公管理系统 案例二:火车票预订系统 实验原理: 数据流图(DFD)是软件系统系统的逻辑模型,仅仅描绘数据在软件中流动(从输入移动到输出)的过程中所经受的变换(即加工处理)。 数据流图的绘制方法:根据数据流图的四种成分:源点或终点,处理,数据存储和数据流,从问题描述中提取数据流图的四种成分;然后依据“自顶向下、从左到右、由粗到细、逐步求精”的基本原则进行绘制。 基本符号如下:

实验过程与结果: 1.运行Microsoft Office Visio2007 运行Microsoft Office Visio2007 2.选择“软件和数据库”中的“数据流模型图”模板 选中数据流模型图模板

3.用鼠标选拉图标进行绘图 任务一绘制数据流图 试绘制工资管理系统的数据流图,根据数据流图的符号说明仔细理解下图含义: 这是学校教职工工资管理系统,教师根据课时表,职工根据任务表来确定个人工资情况,数据按以下方向传递: 首先,对课时表或任务表进行审核,审核后的数据经排序形成专用表格; 再进行一系列额外计算,包括个人所得说、住房公积金、保险费得出具体所发工资,并将工资表发给银行; 然后,向教职工展示工资所得明细; 最后,形成编制报表,更新分类表后,交于会计。 其中,人事科负责人事数据,教师与职工的工资由银行发放,会计做好报表的统计。

数据结构实验一 实验报告

班级::学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入和删除等。 二、实验容 定义一个包含学生信息(学号,,成绩)的顺序表和链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据进行查找,返回此学生的学号和成绩; (4) 根据指定的位置可返回相应的学生信息(学号,,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2

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;

数据结构实验报告及心得体会

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;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1; } for(i=0;ia[i+1].score[j]) { temp=a[i]; a[i]=a[i+1]; a[i+1]=temp; flag=1;

数据结构实验报告-答案.doc

数据结构实验报告-答案 数据结构(C语言版)实验报告专业班级学号姓名实验1实验题目:单链表的插入和删除实验目的:了解和掌握线性表的逻辑结构和链式存储结构,掌握单链表的基本算法及相关的时间性能分析。 实验要求:建立一个数据域定义为字符串的单链表,在链表中不允许有重复的字符串;根据输入的字符串,先找到相应的结点,后删除之。 实验主要步骤:1、分析、理解给出的示例程序。 2、调试程序,并设计输入数据(如:bat,cat,eat,fat,hat,jat,lat,mat,#),测试程序的如下功能:不允许重复字符串的插入;根据输入的字符串,找到相应的结点并删除。 3、修改程序:(1)增加插入结点的功能。 (2)将建立链表的方法改为头插入法。 程序代码:#include“stdio.h“#include“string.h“#include“stdlib.h“#include“ctype. h“typedefstructnode//定义结点{chardata[10];//结点的数据域为字符串structnode*next;//结点的指针域}ListNode;typedefListNode*LinkList;//自定义LinkList单链表类型LinkListCreatListR1();//函数,用尾插入法建立带头结点的单链表LinkListCreatList(void);//函数,用头插入法建立带头结点的单链表ListNode*LocateNode();//函数,按值查找结点voidDeleteList();//函数,删除指定值的结点voidprintlist();//函数,打印链表中的所有值voidDeleteAll();//函数,删除所有结点,释放内存

软件工程实验报告

软 件 工 程 实 验 报 告 班级:计算机科学与技术1102班 学号:1108030209 姓名:蒙雨茹

实验一:使用Microsoft Visio 1.1实验目的: (1)熟悉Visio的工作环境及组成。 (2)掌握Visio软件绘制图表的基本操作。 (3)掌握基本流程图的设计方法。 1.2实验内容: 绘制基本流程图 1.3实验步骤: (1)打开一个模板,,在主菜单中依次选择【文件】->【新建】->【选 择绘图类型】,出现“选择绘图类型”窗口,在【类别】下,单击 【流程图】,在【模板】下,单击【基本流程图】。 (2)添加形状,将【形状】窗口中模具上的自己需要的形状拖到绘图页 面中合适的位置。并添加文本、连接不同形状,使流程图完整的显 现出来。 1.4实验结果:

实验二:数据流图 2.1 实验目的 (1)熟悉Visio的工作环境及组成。 ⑵掌握Visio软件绘制图表的基本操作。 ⑶掌握数据流图的设计方法。 2.2 实验内容 习题3-3,3-4,3-5 2.3 实验步骤 (1)打开模板 ①在主菜单中,依次选择【文件】——【新建】——【选择绘图类型】,出现“选择绘图类型”窗口。 ②在左侧【类别】下,单击【软件】。 ③在右侧【模板】下,单击【数据流模型图】。 (2)绘制顶层图 ①在顶层进程页面中添加、移动图形元素并调整其大小。将所需要元素用鼠标拖动到模板里,添加所需的元素符号。 接口:输入源点或输出终点,其中注明源点或终点的名称。 进程:即处理,输入数据在此进行变换产生输出数据,其中注明进程的名称。数据存储:用于代表系统中存储的信息,其中注明信息的名称。 数据流:被加工的数据及其流向。流线上注明数据名称,箭头代表数据流动方向。 ②向图形元素中添加文本,并修改数据流图中的文字和格式。 连接图形元素。 ③使用“数据流”连接线将“接口”、“进程”和“数据存储”等形状互相连接起来。 逻辑连接:将数据流起点、终点拖拽到进程或接口中央位置,进程或接口被红色框包围时松开鼠标,这时可看到数据流符号相应端点为红色方框。拖动进程或接口,可看到流据流的端点随着进程或接口的移动而移动。

数据结构实验一 实验报告

班级: 姓名: 学号: 实验一线性表的基本操作 一、实验目的 1、掌握线性表的定义; 2、掌握线性表的基本操作,如建立、查找、插入与删除等。 二、实验内容 定义一个包含学生信息(学号,姓名,成绩)的顺序表与链表(二选一),使其具有如下功能: (1) 根据指定学生个数,逐个输入学生信息; (2) 逐个显示学生表中所有学生的相关信息; (3) 根据姓名进行查找,返回此学生的学号与成绩; (4) 根据指定的位置可返回相应的学生信息(学号,姓名,成绩); (5) 给定一个学生信息,插入到表中指定的位置; (6) 删除指定位置的学生记录; (7) 统计表中学生个数。 三、实验环境 Visual C++ 四、程序分析与实验结果 #include #include #include #include #define OK 1 #define ERROR 0 #define OVERFLOW -2 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; } Status GetElem(LinkList L,int i,ElemType &e) // 访问链表,找到i位置的数据域,返回给 e { LinkList p; p=L->next;

《数据结构》实验报告

《数据结构》实验报告 实验序号:4 实验项目名称:栈的操作

附源程序清单: 1. #include #define MaxSize 100 using namespace std; typedef int ElemType; typedef struct { ElemType data[MaxSize]; int top; }SqStack; void InitStack(SqStack *st) //初始化栈 { st->top=-1; } int StackEmpty(SqStack *st) //判断栈为空{ return (st->top==-1); } bool Push(SqStack *st,ElemType x) //元素进栈{ if(st->top==MaxSize-1)

{ return false; } else { st->top++; //移动栈顶位置 st->data[st->top]=x; //元素进栈 } return true; } bool Pop(SqStack *st,ElemType &e) //出栈 { if(st->top==-1) { return false; } else { e=st->data[st->top]; //元素出栈 st->top--; //移动栈顶位置} return true; } //函数名:Pushs //功能:数组入栈 //参数:st栈名,a->数组名,i->数组个数 bool Pushs(SqStack *st,ElemType *a,int i) { int n=0; for(;n数组名,i->数组个数 bool Pops(SqStack *st,ElemType *a,int i) { int n=0; for(;n

软件工程实验报告_学生成绩管理系统

软件工程实验报告 学生成绩管理系统的设计与实现 学生姓名 学号 班级 成绩 指导教师 年月日

目录 1 课题描述 (3) 2 可行性研究 (4) 2.1 编写目的 (4) 2.2 项目背景 (4) 2.3 定义(术语) (4) 2.4 数据流程和处理流程 (4) 2.5 可行性分析的前提 (5) 2.6 可行性分析 (5) 3 需求分析 (7) 3.1 学生成绩管理系统功能需求 (7) 3.2 学生成绩管理系统性能要求 (8) 3.3 数据流图 (8) 3.4 数据字典 (9) 3.5 学生信息管理系统逻辑结构图 (12) 3.6 用户信息实体关系图 (12) 4 概要设计 (13) 4.1 编写目的 (13) 4.2 项目背景 (13) 4.3 任务概述 (13) 4.4 总体设计 (13) 4.5接口设计 (17) 4.6数据结构设计 (17) 5 详细设计 (19) 5.1 系统程序流程图 (19) 5.2 界面设计 (21) 5.3 程序界面截图 (22) 5.4 程序源代码 (27) 6 软件测试 (58) 7 总结 (62)

1 课题描述 随着互联网的发展,利用INTERNET 技术来实现“无纸办公”这个概念已经深入人心,校园网作为学校信息化建设的一个平台在完成资源共享、互联网访问、教务管理、电子备课等方面发挥了重要作用。服务教学、提高教学水平和效果是校园网建设的核心目标和核心价值,本系统立足于校园实际,着眼于未来发展,建成符合标准化协议、通用性较强、实用的系统,以提高高校的现代化管理水平,实现信息资源的共享。该项目主要是服务于教学方面,进一步方便教师的工作和学生的学习,从而从侧面达到提高学校的教学方面‘软件’质量。可以说它适用于每一所高校,因此很有开发价值。我们不敢说该产品是所有该系列产品中最好的,但是我们这里要强调的是它具有使用范围广,实用性强,使用简单,所花经费少等优点。我们可以肯定的说它将在高校的使用过程中其优点将得到最充分的体现。 主要功能有三方面: 管理员,登陆,进入系统,可以进行管理员操作,进行学生信息、教师信息、课程信息的编辑、查询、删除、修改、添加、打印等操作。 学生,登陆,进入系统,可以进行查询、修改、打印等操作。 教师,登陆,进入系统,可以进行查询、学生成绩录入、修改、打印等操作。 软件系统目标: (1)本系统具有很强的可靠行,可以对录入的学生信息进行效验,对数据进行修改、删除,规定各种权限。 (2)本系统中的模块具有很强的可续性,可以方便管理人员的修改与维护。 (3)本系统操作方便、灵活、简单。 (4)本系统可高效、快速的查询到学生的基本信息。

数据结构实验报告--图实验

图实验 一,邻接矩阵的实现 1.实验目的 (1)掌握图的逻辑结构 (2)掌握图的邻接矩阵的存储结构 (3)验证图的邻接矩阵存储及其遍历操作的实现 2.实验内容 (1)建立无向图的邻接矩阵存储 (2)进行深度优先遍历 (3)进行广度优先遍历 3.设计与编码 MGraph.h #ifndef MGraph_H #define MGraph_H const int MaxSize = 10; template class MGraph { public: MGraph(DataType a[], int n, int e); ~MGraph(){ } void DFSTraverse(int v); void BFSTraverse(int v); private: DataType vertex[MaxSize]; int arc[MaxSize][MaxSize]; int vertexNum, arcNum; }; #endif MGraph.cpp #include using namespace std; #include "MGraph.h" extern int visited[MaxSize]; template MGraph::MGraph(DataType a[], int n, int e)

{ int i, j, k; vertexNum = n, arcNum = e; for(i = 0; i < vertexNum; i++) vertex[i] = a[i]; for(i = 0;i < vertexNum; i++) for(j = 0; j < vertexNum; j++) arc[i][j] = 0; for(k = 0; k < arcNum; k++) { cout << "Please enter two vertexs number of edge: "; cin >> i >> j; arc[i][j] = 1; arc[j][i] = 1; } } template void MGraph::DFSTraverse(int v) { cout << vertex[v]; visited[v] = 1; for(int j = 0; j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0) DFSTraverse(j); } template void MGraph::BFSTraverse(int v) { int Q[MaxSize]; int front = -1, rear = -1; cout << vertex[v]; visited[v] = 1; Q[++rear] = v; while(front != rear) { v = Q[++front]; for(int j = 0;j < vertexNum; j++) if(arc[v][j] == 1 && visited[j] == 0){ cout << vertex[j]; visited[j] = 1;

相关文档