【数据结构算法】实验1 线性表应用-多项式计算(附源代码)

【数据结构算法】实验1 线性表应用-多项式计算(附源代码)
【数据结构算法】实验1 线性表应用-多项式计算(附源代码)

浙江大学城市学院实验报告

课程名称数据结构与算法

实验项目名称实验一线性表应用---多项式计算

实验成绩指导老师(签名)日期

一.实验目的和要求

1.进一步掌握线性表的的基本操作。

2.掌握线性表的典型应用----多项式表示与计算。

二. 实验内容

1.设用线性表( (a1, e1), (a2, e2), ……, (am, em) ) 表示多项式P(x) = a1*x e1 + a2*x e2+…+ am*x em,其中:a1~am为非零系数,0≤e1<e2<…..<em,请编写用链式存储结构(带表头附加结点的单链表)存储该多项式时,多项式基本操作的实现函数。多项式基本操作应包括初始化多项式、清除多项式、输出多项式、插入一项、删除一项、多项式求值、多项式相加等。要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在头文件Linkpoly.h中,主函数存放在主文件test6_1.cpp中,在主函数中通过调用Linkpoly.h中的函数进行测试。

2.选做:编写用顺序存储结构存储多项式时,多项式基本操作的实现函数。要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Seqpoly.h中,在主文件test6_1.cpp中增加测试语句对Seqpoly.h中的函数进行测试。

3.填写实验报告,实验报告文件取名为report1.doc。

4.上传实验报告文件report1.doc与源程序文件test6_1.cpp及Linkpoly.h、Seqpoly.h(若有)到Ftp服务器上自己的文件夹下。

三. 函数的功能说明及算法思路

包括每个函数的功能说明,及一些重要函数的算法实现思路

※注1:除了[多项式求值]与[多项式相加]两个函数外,线性表的基本操作函数,大部分沿用上学期[线性表的链式/顺序表示和实现]两个实验中的函数。※注2:选作部分函数功能与思路与非选作部分基本一致,略去思路描述

函数:void InitList(LNode *&H)

功能:初始化单链表

思路:使用附带头结点的方式初始化单链表

函数:int LengthList (LNode *H)

功能:求单链表长度

思路:遍历整个单链表,设置变量记录并返回它的长度

函数:bool EmptyList (LNode *H)

功能:判断单链表是否为空表

思路:判断头结点的后一结点是否为空,若空则为空表

函数:void TraverseList(LNode *H)

功能:遍历单链表

思路:遍历整个单链表,输出所含所有元素

函数:bool InsertList ( LNode *&H, ElemType item, int pos)

功能:向单链表插入一个元素

思路:创建新结点,根据pos的值来确定位置并向单链表中插入新元素。pos为0,按顺序向线性表插入元素;pos=-1,于表末插入元素;pos为其他值,在pos 位置插入元素。

函数:ElemType GetList (LNode *H, int pos)

功能:取单链表第pos 位置上的元素

思路:遍历单链表至第pos个元素将其返回,若超出范围则提示

函数:bool DeleteList ( LNode *&H, ElemType &item, int pos)

功能:从单链表中删除一个元素

思路:根据pos的值来确定删除方式并删除单链表中的相应元素。pos为0,按item提供的值查找删除;pos为-1,查找表尾结点并删除;pos为其他值,删除在pos位置上的元素。

函数:void ClearList(LNode *&H)

功能:清除单链表

思路:遍历整个单链表,按顺序依次释放每个结点的空间,并将头结点的连接下一结点的指针指向空。

函数:double PolySum(LNode *H, double x)

功能:多项式求值

思路:遍历线性表的每一项,每次将当前项的系数乘以x的指数次方,所得到的结果累加至变量sum,最后返回sum即多项式的值

函数:LNode* PolyAdd(LNode *&La, LNode *&Lb)

功能:多项式相加

思路:新建一个多项式,同时遍历两个多项式,每次拿出两个当前项进行对比,将指数值小的项加入新多项式中,若指数相同,则进行系数相加并判断加完后系数是否为0(为0则不用加入),直到其中一个多项式遍历完毕,则把剩下没有遍历完的多项式剩余部分加入新多项式中,最后返回新多项式作为结果。

[选作部分]

函数:void SeqInitList(SeqList &L)

功能:初始化线性表

函数:bool SeqDeleteList(SeqList &L, int pos){

功能:从线性表中删除一个元素

函数:bool SeqInsertList(SeqList &L,ElemType item,int pos)

功能:按给定条件pos向线性表插入一个元素

函数:void SeqTraverseList(SeqList L)

功能:遍历线性表

函数:int SeqLengthList(SeqList L)

功能:求线性表长度

函数:ElemType SeqGetList(SeqList L, int pos)

功能:在线性表L中求序号为pos的元素,该元素作为函数值返回

函数:void SeqClearList(SeqList &L)

功能:清除线性表

函数:double SeqPolySum(SeqList &L, double x)

功能:多项式求值

函数:SeqList SeqPolyAdd(SeqList La, SeqList Lb)

功能:多项式相加

四. 实验结果与分析

包括运行结果截图等

测试数据(课件中给出的):

结果分析:

·多项式相加结果正确,如课件图中所给

·多项式求值使用两种方法得出的答案一致,应该是正确的·删除元素、添加元素结果均正确

测试数据(输入时乱序):

·[La]: (5,0),(-1,8),(-30,10),(6,16),(-2,29),(17,32),(3,40) ·[Lb]: (-11,0),(8,10),(-26,17),(9,29),(10,30),(-7,35)

·[x]: 2

·[删除元素序号]: 4

·[添加的元素]: (22,10)

结果分析:

·多项式相加结果正确

·多项式求值使用两种方法得出的答案一致,应该是正确的

·删除元素、添加元素结果均正确

测试数据(输入时乱序): ·[La]: (-2,2),(10,25)

·[Lb]: (13,1),(4,4),(-3,7),(1,8) ·[x]: 3

·[删除元素序号]: 6 ·[添加的元素]: (10,20) 结果分析:

·多项式相加结果正确

·多项式求值使用两种方法得出的答案一致,应该是正确的 ·删除元素、添加元素结果均正确

五. 心得体会

记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等。

【附录----源程序】

※注3:由于采用了上学期实验中使用的基础函数,可能有部分注释不合题意,但不影响程序运行

[Test6_1.cpp]

#include

#include

#include

#include

typedef struct{

double coef;

int exp;

}ElemType;

#include "Linkpoly.h"

#include "Seqpoly.h"

void main()

{

ElemType item;

int i,pos;

double coef,x;

LNode *La,*Lb,*Lc;

InitList(La);

InitList(Lb);

cout<<"线性表初始化成功!"<

cout<<"------------------------------------------"<

cout<<"请输入La,以0结尾"<

cin>>coef;

while(coef!=0){

item.coef = coef;

cin>>item.exp;

InsertList(La,item,0);

cin>>coef;

}

cout<<"请输入Lb,以0结尾"<

cin>>coef;

while(coef!=0){

item.coef = coef;

cin>>item.exp;

InsertList(Lb,item,0);

cin>>coef;

}

cout<<"请输入x,用于多项式求值: ";

cin>>x;

cout<<"La : ";

TraverseList(La);

printf("Value : %.2f\n",PolySum(La,x));

cout<<"Lb : ";

TraverseList(Lb);

printf("Value : %.2f\n",PolySum(Lb,x));

Lc = PolyAdd(La,Lb);

cout<<"Lc : ";

TraverseList(Lc);

printf("Value : %.2f\n",PolySum(Lc,x));

cout<<"------------------------------------------"<

cout<

cin>>pos;

DeleteList(Lc,item,pos);

cout<<"Afte Delete : ";

TraverseList(Lc);

cout<

cin>>item.coef>>item.exp;

InsertList(Lc,item,0);

cout<<"Afte Insert : ";

TraverseList(Lc);

ClearList(La);

ClearList(Lb);

ClearList(Lc);

cout<

SeqList SeqLa, SeqLb, SeqLc;

SeqInitList(SeqLa);

SeqInitList(SeqLb);

cout<<"线性表初始化成功!"<

cout<<"------------------------------------------"<

cin>>coef;

while(coef!=0){

item.coef = coef;

cin>>item.exp;

SeqInsertList(SeqLa,item,0);

cin>>coef;

}

cout<<"请输入Lb,以0结尾"<

cin>>coef;

while(coef!=0){

item.coef = coef;

cin>>item.exp;

SeqInsertList(SeqLb,item,0);

cin>>coef;

}

cout<<"请输入x,用于多项式求值: ";

cin>>x;

cout<<"La : ";

SeqTraverseList(SeqLa);

printf("Value : %.2f\n",SeqPolySum(SeqLa,x));

cout<<"Lb : ";

SeqTraverseList(SeqLb);

printf("Value : %.2f\n",SeqPolySum(SeqLb,x)); SeqLc = SeqPolyAdd(SeqLa,SeqLb);

cout<<"Lc : ";

SeqTraverseList(SeqLc);

printf("Value : %.2f\n",SeqPolySum(SeqLc,x));

cout<<"------------------------------------------"<>pos;

SeqDeleteList(SeqLc,pos);

cout<<"Afte Delete : ";

SeqTraverseList(SeqLc);

cout<>item.coef>>item.exp;

SeqInsertList(SeqLc,item,0);

cout<<"Afte Insert : ";

SeqTraverseList(SeqLc);

SeqClearList(SeqLa);

SeqClearList(SeqLb);

SeqClearList(SeqLc);

}

[Linkpoly.h]

typedef struct Node {

ElemType data;

struct Node* next;

}LNode;

//初始化单链表

void InitList(LNode *&H)

{

H=(LNode *)malloc(sizeof(LNode)); // 产生头结点H if (!H){

cout<<"初始化错误!退出"<

exit(0); // 存储分配失败,退出系统}

H->next=NULL; // 指针域为空

}

//求单链表长度

int LengthList (LNode *H)

{

int i=0;

while(H->next!=NULL){

i++;

H=H->next;

}

return i;

}

//判断线性表是否为空

bool EmptyList (LNode *H)

{

if (H->next==NULL){

cout<<"线性表为空!"<

return true;

}

else return false;

}

//遍历单链表

void TraverseList(LNode *H)

{

if (EmptyList(H)) return;

H=H->next;

cout<<"(";

while(H->next!=NULL){

cout<<"("<data.coef<<","<data.exp<<")"<<",";

H=H->next;

}

cout<<"("<data.coef<<","<data.exp<<"))"<

}

//从单链表中删除一个元素

bool DeleteList(LNode *&H, ElemType &item, int pos){

//单链表为空,无法删除,返回假

if (H->next==NULL){

cerr<<"单链表为空表!"<

return false;

}

//pos值小于-1返回假

if (pos<-1){

cout<<"pos值无效!"<

return false;

}

//寻找被删除的元素结点

LNode * cp=H->next;

LNode * ap=H;

if (pos==0) { //按值查找

while(cp!=NULL){

if (item.exp == cp->data.exp && item.coef == cp->data.coef) break;

else{

ap=cp;

cp=cp->next;

}

}

if(cp==NULL){

cout<<"单链表中没有相应的结点可删除!"<

return false;

}

}

else { //按序号查找

int i=0;

while(cp!=NULL){

i++;

if(i==pos) break;

else {

ap=cp;

cp=cp->next;

}

}

if (cp==NULL){

cout<<"pos值无效!"<

}

}

//删除cp所指向的结点

ap->next=cp->next;

item=cp->data;

delete cp;

return true;

}

//向单链表插入一个元素

bool InsertList ( LNode *&H, ElemType item, int pos) {

//pos值小于-1返回假

if (pos<-1){

cout<<"pos值无效!"<

return false;

}

//为item元素建立新结点

LNode * newptr;

newptr=new LNode;

newptr->data=item;

//寻找新结点的插入位置

LNode * cp=H->next;

LNode * ap=H;

if (pos==0){

while (cp!=NULL){

if (item.expdata.exp) break;

else {

ap=cp;

cp=cp->next;

}

}

}

else if (pos==-1)

while (cp!=NULL) { ap=cp; cp=cp->next; }

else {

int i=0;

while (cp!=NULL){

i++;

if (i==pos) break;

else {

ap=cp;

cp=cp->next;

}

}

if (cp==NULL && i+1

cout<<"pos值超出单链表长度加1!"<

return false;

}

}

if (item.exp == ap->data.exp){

ap->data.coef += item.coef;

if (ap->data.coef == 0){

DeleteList(H,ap->data,0);

}

return true;

}

//完成新结点插入操作

newptr->next=cp;

ap->next=newptr;

return true;

}

//取单链表第pos 位置上的元素

ElemType GetList (LNode *H, int pos)

{

if (pos<1){

cerr<<"pos is out range!"<

exit(1);

}

int i=0;

H=H->next;

while(H!=NULL){

i++;

if (i==pos) break;

H=H->next;

}

if (H!=NULL)

return H->data;

else {

cerr<<"pos is out range!"<

exit(1);

}

}

//清除单链表

void ClearList(LNode *&H)

{

LNode *cp;

LNode *np;

cp=H->next;

while(cp!=NULL){

np=cp->next;

delete cp;

cp=np;

}

H->next=NULL;

}

//多项式求值

double PolySum(LNode *H, double x){

double sum = 0;

while (H->next != NULL){

sum += H->next->data.coef * pow(x,H->next->data.exp);

H = H->next;

}

return sum;

}

//多项式相加

LNode* PolyAdd(LNode *La, LNode *Lb){ int i=1,j=1,La_len,Lb_len;

ElemType a,b;

LNode *Lc;

InitList(Lc);

La_len=LengthList(La);

Lb_len=LengthList(Lb);

while((i<=La_len) && (j<=Lb_len)){

a=GetList(La,i);

b=GetList(Lb,j);

if (a.exp < b.exp) {

InsertList(Lc,a,-1);

i++;

}

else if (a.exp > b.exp) {

InsertList(Lc,b,-1);

j++;

}

else{

a.coef +=

b.coef;

if (a.coef != 0 ){

InsertList(Lc,a,-1);

}

i++;

j++;

}

}

while(i<=La_len){

a=GetList(La,i++);

InsertList(Lc,a,-1);

}

while(j<=Lb_len){

b=GetList(Lb,j++);

InsertList(Lc,b,-1);

}

return Lc;

}

[Seqpoly.h]

typedef struct List{

ElemType * list;

int size;

int MaxSize;

}SeqList;

//初始化线性表

void SeqInitList(SeqList &L)

{

L.MaxSize=10;;

L.list=new ElemType[L.MaxSize];

if (L.list==NULL){

cout<<"动态可分配的存储空间用完,退出运行!"<

exit(1);

}

L.size=0;

}

//从线性表中删除一个元素

bool SeqDeleteList(SeqList &L, int pos){

if (pos<-1 || pos>L.size+1){

cout<<"pos值无效!"<

return false;

}

int i;

for (i = pos; i < L.size; i++){

L.list[i-1] = L.list[i];

}

L.size--;

return true;

}

//按给定条件pos向线性表插入一个元素

bool SeqInsertList(SeqList &L,ElemType item,int pos)

{

if (pos<-1 || pos>L.size+1){

cout<<"pos值无效!"<

return false;

}

int i;

if (pos==0){

for (i=0;i

if (item.exp

pos=i+1;

}

else if (pos==-1) pos=L.size+1;

if (L.size==L.MaxSize){

int k=sizeof(ElemType);

L.list=(ElemType*)realloc(L.list,2*L.MaxSize*k);

if (L.list==NULL){

cout<<"动态可分配的存储空间用完,退出运行!"<

exit(1);

}

L.MaxSize=2*L.MaxSize;

}

if (L.list[pos-2].exp == item.exp){

L.list[pos-2].coef += item.coef;

if (L.list[pos-2].coef == 0){

SeqDeleteList(L, pos-1);

}

return true;

}

for (i=L.size-1;i>=pos-1;i--)

L.list[i+1]=L.list[i];

L.list[pos-1]=item;

L.size++;

return true;

}

//遍历线性表

void SeqTraverseList(SeqList L)

{

for(int i=0;i

cout<<"("<

cout<<"("<

}

//求线性表长度

int SeqLengthList(SeqList L)

{

return L.size;

}

//在线性表L中求序号为pos的元素,该元素作为函数值返回ElemType SeqGetList(SeqList L, int pos)

{

if (pos<1 || pos>L.size){

cout<<"pos is out range!"<

exit(1);

}

return L.list[pos-1];

}

//清除线性表

void SeqClearList(SeqList &L)

{

if (L.list!=NULL){

delete []L.list;

L.list=NULL;

}

L.MaxSize=0;

L.size=0;

}

//多项式求值

double SeqPolySum(SeqList &L, double x){ double sum = 0;

int i;

for (i = 0; i < L.size; i++){

sum += L.list[i].coef * pow(x, L.list[i].exp);

}

return sum;

}

//多项式相加

SeqList SeqPolyAdd(SeqList La, SeqList Lb){ int i=1,j=1,La_len,Lb_len;

ElemType a,b;

SeqList Lc;

SeqInitList(Lc);

La_len=SeqLengthList(La);

Lb_len=SeqLengthList(Lb);

while((i<=La_len) && (j<=Lb_len)){

a=SeqGetList(La,i);

b=SeqGetList(Lb,j);

if (a.exp < b.exp) {

SeqInsertList(Lc,a,-1);

i++;

}

else if (a.exp > b.exp) {

SeqInsertList(Lc,b,-1);

j++;

}

else{

a.coef +=

b.coef;

if (a.coef != 0 ){

SeqInsertList(Lc,a,-1);

}

i++;

j++;

}

}

while(i<=La_len){

a=SeqGetList(La,i++);

SeqInsertList(Lc,a,-1);

}

while(j<=Lb_len){

b=SeqGetList(Lb,j++);

SeqInsertList(Lc,b,-1);

}

return Lc;

}

数据结构课程实验指导书

数据结构实验指导书 一、实验目的 《数据结构》是计算机学科一门重要的专业基础课程,也是计算机学科的一门核心课程。本课程较为系统地论述了软件设计中常用的数据结构以及相应的存储结构与实现算法,并做了相应的性能分析和比较,课程内容丰富,理论系统。本课程的学习将为后续课程的学习以及软件设计水平的提高打下良好的基础。 由于以下原因,使得掌握这门课程具有较大的难度: 1)理论艰深,方法灵活,给学习带来困难; 2)内容丰富,涉及的知识较多,学习有一定的难度; 3)侧重于知识的实际应用,要求学生有较好的思维以及较强的分析和解决问题的能力,因而加大了学习的难度; 根据《数据结构》课程本身的特性,通过实验实践内容的训练,突出构造性思维训练的特征,目的是提高学生分析问题,组织数据及设计大型软件的能力。 课程上机实验的目的,不仅仅是验证教材和讲课的内容,检查自己所编的程序是否正确,课程安排的上机实验的目的可以概括为如下几个方面: (1)加深对课堂讲授内容的理解 实验是对学生的一种全面综合训练。是与课堂听讲、自学和练习相辅相成的必不可少的一个教学环节。通常,实验题中的问题比平时的习题复杂得多,也更接近实际。实验着眼于原理与应用的结合点,使学生学会如何把书上学到的知识用于解决实际问题,培养软件工作所需要的动手能力;另一方面,能使书上的知识变" 活" ,起到深化理解和灵活掌握教学内容的目的。 不少学生在解答习题尤其是算法设计时,觉得无从下手。实验中的内容和教科书的内容是密切相关的,解决题目要求所需的各种技术大多可从教科书中找到,只不过其出

现的形式呈多样化,因此需要仔细体会,在反复实践的过程中才能掌握。 (2) 培养学生软件设计的综合能力 平时的练习较偏重于如何编写功能单一的" 小" 算法,而实验题是软件设计的综合训练,包括问题分析、总体结构设计、用户界面设计、程序设计基本技能和技巧,多人合作,以至一整套软件工作规范的训练和科学作风的培养。 通过实验使学生不仅能够深化理解教学内容,进一步提高灵活运用数据结构、算法和程序设计技术的能力,而且可以在需求分析、总体结构设计、算法设计、程序设计、上机操作及程序调试等基本技能方面受到综合训练。实验着眼于原理与应用的结合点,使学生学会如何把书本上和课堂上学到的知识用于解决实际问题,从而培养计算机软件工作所需要的动手能力。 (3) 熟悉程序开发环境,学习上机调试程序一个程序从编辑,编译,连接到运行,都要在一定的外部操作环境下才能进行。所谓" 环境" 就是所用的计算机系统硬件,软件条件,只有学会使用这些环境,才能进行 程序开发工作。通过上机实验,熟练地掌握程序的开发环境,为以后真正编写计算机程序解决实际问题打下基础。同时,在今后遇到其它开发环境时就会触类旁通,很快掌握新系统的使用。 完成程序的编写,决不意味着万事大吉。你认为万无一失的程序,实际上机运行时可能不断出现麻烦。如编译程序检测出一大堆语法错误。有时程序本身不存在语法错误,也能够顺利运行,但是运行结果显然是错误的。开发环境所提供的编译系统无法发现这种程序逻辑错误,只能靠自己的上机经验分析判断错误所在。程序的调试是一个技巧性很强的工作,尽快掌握程序调试方法是非常重要的。分析问题,选择算法,编好程序,只能说完成一半工作,另一半工作就是调试程序,运行程序并得到正确结果。 二、实验要求 常用的软件开发方法,是将软件开发过程划分为分析、设计、实现和维护四个阶段。虽然数据结构课程中的实验题目的远不如从实际问题中的复杂程度度高,但为了培养一个软件工作者所应具备的科学工作的方法和作风,也应遵循以下五个步骤来完成实验题目: 1) 问题分析和任务定义 在进行设计之前,首先应该充分地分析和理解问题,明确问题要求做什么?限制条件是什么。本步骤强调的是做什么?而不是怎么做。对问题的描述应避开算法和所涉及的数据类型,而是对所需完成的任务作出明确的回答。例如:输入数据的类型、值的范围以及输入的

数据结构习题(456章)

第四章串 一.选择题 1.若串S='software',其子串的数目是() A.8 B.37 C.36 D.9 2.设有两个串p和q,求q在p中首次出现的位置的运算称作() A.连接B.模式匹配C.求串长D.求子串 3.设字符串S1=“ABCDEFG”,S2=“PQRST”,则运算: S=CONCAT(SUBSTR(S1,2,LEN(S2));SUBSTR(S1,LEN(S2),2));后的串值为() A.A BCDEF B.BCDEFG C.BCDPQRST D. BCDEFEF 4.下面的说法中,只有()是正确的 A.串是一种特殊的线性表B.串的长度必须大于零 C.串中元素只能是字母D.空串就是空白串 5.两个字符串相等的条件是() A.两串的长度相等 B.两串包含的字符相同 C.两串的长度相等,并且两串包含的字符相同 D.两串的长度相等,并且对应位置上的字符相同 二.填空题 1.串“ababcbaababd”的next函数值为,nextval函数值为。2.子串的长度为。 第五章数组和广义表 一.选择题 1.设有数组A[i,j],数组的每个元素长度为3字节,i的值为1 到8 ,j的值为1 到10,数组从内存首地址BA开始顺序存放,当用以列为主存放时,元素A[5,8]的存储首地址为( ) A. BA+141 B. BA+180 C. BA+222 D. BA+225 2.假设以行序为主序存储二维数组A=array[1..100,1..100],设每个数据元素占2个存储单元,基地址为10,则LOC[5,5]=() A. 808 B. 818 C. 1010 D. 1020 3.对稀疏矩阵进行压缩存储目的是() A.便于进行矩阵运算B.便于输入和输出C.节省存储空间D.降低运算的时间复杂度 4.假设以三元组表表示稀疏矩阵,则与如图所示三元组表对应的4×5的稀疏矩阵是(注:矩阵的行列下标均从1开始)()

(完整版)数据结构实验报告全集

数据结构实验报告全集 实验一线性表基本操作和简单程序 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 始终指向生成的单链表的最后一个节点

数据结构实验报告代码

线性表 代码一 #include "stdio.h" #include "malloc.h" #define OK 1 #define ERROR 0 #define OVERFLOW -2 #define LIST_INIT_SIZE 100 #define LISTINCREMENT 10 typedef struct { int * elem; int length; int listsize; }SqList; int InitList_Sq(SqList *L) { L->elem = (int*)malloc(LIST_INIT_SIZE*sizeof(int)); if (!L->elem) return ERROR; L->length = 0; L->listsize = LIST_INIT_SIZE; return OK; } int ListInsert_Sq(SqList *L, int i,int e) { int *p,*newbase,*q; if (i < 1 || i > L->length+1) return ERROR; if (L->length >= L->listsize) { newbase = (int *)realloc(L->elem,(L->listsize+LISTINCREMENT)*sizeof (int)); if (!newbase) return ERROR; L->elem = newbase; L->listsize += LISTINCREMENT; } q = &(L->elem[i-1]); //插入后元素后移for(p=&(L->elem[L->length-1]);p>=q;p--) *(p+1)=*p; *q=e; L->length++; return OK; } int ListDelete_Sq(SqList *L, int i, int *e) {

数据结构实验8实验报告

暨南大学本科实验报告专用纸 课程名称数据结构实验成绩评定 实验项目名称习题6.37 6.38 6.39 指导教师孙世良 实验项目编号实验8 实验项目类型实验地点实验楼三楼机房学生姓名林炜哲学号2013053005 学院电气信息学院系专业软件工程 实验时间年月日午~月日午温度℃湿度(一)实验目的 熟悉和理解二叉树的结构特性; 熟悉二叉树的各种存储结构的特点及适用范围; 掌握遍历二叉树的各种操作及其实现方式。 理解二叉树线索化的实质是建立结点与其在相应序列中的前去或后继之间的直接联系,熟练掌握二叉树的线索化的过程以及在中序线索化树上找给定结点的前驱和后继的方法。 (二)实验内容和要求 6.37试利用栈的基本操作写出先序遍历的非递归形式的算法。 6.38同题6.37条件,写出后序遍历的非递归算法(提示:为分辨后序遍 历时两次进栈的不同返回点需在指针进栈时同时将一个标志进栈)。 6.39假设在二叉链表的结点中增设两个域:双亲域以指示其双亲结点; 标志域以区分在遍历过程中到达该结点时应继续向左或向右或访问该节点。试以此存储结构编写不用栈进行后序遍历的递推形式的算法。(三)主要仪器设备 实验环境:Microsoft Visual Studio 2012 (四)源程序

6.37: #include #include #define STACK_INIT_SIZE 100 #define STACKINCREMENT 10 #define TRUE 1 #define FALSE 0 typedef struct bitnode{ char data; struct bitnode *lchild,*rchild; }bitnode,*bitree; void create(bitree &T){ char t; t=getchar(); if(t==' ') T=NULL; else{ if( !( T=(bitnode*)malloc(sizeof(bitnode)) ) ) exit(0); T->data=t; create(T->lchild); create(T->rchild); } } typedef struct{ bitree *base; bitree *top; int stacksize; }sqstack; void initstack(sqstack &S){ S.base=(bitree*)malloc(STACK_INIT_SIZE *sizeof(bitree)); if(!S.base) exit(0); S.top=S.base; S.stacksize=STACK_INIT_SIZE; } void Push(sqstack &s,bitree e){ if(s.top - s.base >= s.stacksize){ s.base =

实验指导-数据结构B教案资料

实验指导-数据结构B

附录综合实验 1、实验目的 本课程的目标之一是使得学生学会如何从问题出发,分析数据,构造求解问题的数据结构和算法,培养学生进行较复杂程序设计的能力。本课程实践性较强,为实现课程目标,要求学生完成一定数量的上机实验。从而一方面使得学生加深对课内所学的各种数据的逻辑结构、存储表示和运算的方法等基本内容的理解,学习如何运用所学的数据结构和算法知识解决应用问题的方法;另一方面,在程序设计方法、C语言编程环境以及程序的调试和测试等方面得到必要的训练。 2、实验基本要求: 1)学习使用自顶向下的分析方法,分析问题空间中存在哪些模块,明确这些模块之间的关系。 2)使用结构化的系统设计方法,将系统中存在的各个模块合理组织成层次结构,并明确定义各个结构体。确定模块的主要数据结构和接口。 3)熟练使用C语言环境来实现或重用模块,从而实现系统的层次结构。模块的实现包括结构体的定义和函数的实现。 4)学会利用数据结构所学知识设计结构清晰的算法和程序,并会分析所设计的算法的时间和空间复杂度。 5)所有的算法和实现均使用C语言进行描述,实验结束写出实验报告。

3、实验项目与内容: 1、线性表的基本运算及多项式的算术运算 内容:实现顺序表和单链表的基本运算,多项式的加法和乘法算术运算。 要求:能够正确演示线性表的查找、插入、删除运算。实现多项式的加法和乘法运算操作。 2、二叉树的基本操作及哈夫曼编码译码系统的实现 内容:创建一棵二叉树,实现先序、中序和后序遍历一棵二叉树,计算二叉树结点个数等操作。哈夫曼编码/译码系统。 要求:能成功演示二叉树的有关运算,实现哈夫曼编码/译码的功能,运算完毕后能成功释放二叉树所有结点占用的系统内存。 3、图的基本运算及智能交通中的最佳路径选择问题 内容:在邻接矩阵和邻接表两种不同存储结构上实现图的基本运算的算法,实现图的深度和宽度优先遍历算法,解决智能交通中的路径选择问题。设有n 个地点,编号为0~n-1,m条路径的起点、终点和代价由用户输入提供,寻找最佳路径方案(例如花费时间最少、路径长度最短、交通费用最小等,任选其一即可)。 要求:设计主函数,测试上述运算。 4、各种内排序算法的实现及性能比较 内容:验证教材的各种内排序算法。分析各种排序算法的时间复杂度。 要求:使用随机数产生器产生较大规模数据集合,运行上述各种排序算法,使用系统时钟测量各算法所需的实际时间,并进行比较。

约瑟夫问题数据结构实验报告汇总.

中南民族大学管理学院学生实验报告 实验项目: 约瑟夫问题 课程名称:数据结构 年级: 专业:信息管理与信息系统 指导教师: 实验地点:管理学院综合实验室 完成日期: 小组成员: 2012 学年至2013 学年度第1 学期

一、实验目的 (1)掌握线性表表示和实现; (2)学会定义抽象数据类型; (3)学会分析问题,设计适当的解决方案; 二、实验内容 【问题描述】:编号为1,2,…,n的n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值m,从第一个人开始按顺时针方向自 1 开始顺序报数,报到m 时停止报数。报m 的人出列,将他的密码作为新的m 值,从他在顺时针方向上的下一个人开始重新从1 报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。 【基本要求】:利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 【测试数据】:m 的初值为20;密码:3,1,7,2,4,8,4(正确的结果应为6,1,4,7,2,3,5)。 三、实验步骤 (一)需求分析 对于这个程序来说,首先要确定构造链表时所用的插入方法。当数到m 时一个人就出列,也即删除这个节点,同时建立这个节点的前节点与后节点的联系。由于是循环计数,所以才采用循环列表这个线性表方式。 程序存储结构利用单循环链表存储结构存储约瑟夫数据(即n个人的编码等),模拟约瑟夫的显示过程,按照出列的顺序显示个人的标号。编号为1,2,…,n 的 n 个人按顺时针方向围坐一圈,每人持有一个密码(正整数)。一开始任选一个正整数作为报数上限值 m,从第一个人开始按顺时针方向自1 开始顺序报数,报到 m 时停止报数。报 m 的人出列,将他的密码作为新的 m 值,从他在顺时针方向上的下一个人开始重新从 1 报数,如此下去,直至所有人全部出列为止。试设计一个程序求出出列顺序。基本要求是利用单向循环链表存储结构模拟此过程,按照出列的顺序印出各人的编号。 程序执行的命令(1)构造单向循环链表。 (2)按照出列的顺序引出各个人的标号。 测试数据 m 的初值为 20;密码:3,1,7,2,4,8,4(正确的结果应为 6,1,4,7,2,3,5) (1)、插入:在把元素插入到循环链表中时,由于是采用的头插法,所以我保留了front头结点。在每加入一个节点时,都会直接连接在front后面,从而保证一开始就赋值的rear尾节点不用修改。 伪代码阐释如下:

数据结构实验一的源代码

#include #include typedef struct Node { int key;//密码 int num;//编号 struct Node *next;//指向下一个节点 } Node, *Link; void InitList(Link &L) //创建一个空的链表{ L = (Node *)malloc(sizeof(Node)); if (!L) exit(1); L->key = 0; L->num = 0; L->next = L; } void Creatlinklist(int n, Link &L) //初始化链表{ Link p, q; q = L; for (int i = 1; i <= n; i++) { p = (Node *)malloc(sizeof(Node)); if (!p) exit(1); scanf("%d", &p->key); p->num = i; L->next = p; L = p; } L->next = q->next; free(q); } Link Locate_m(Link &p, int m)//找到第m个 { Link q; for (int j = 1; jnext; q = p->next; m = q->key;

return q; } void Delete_m(Link &L, Link p, Link q)//删除第m个{ p->next = q->next; free(q); } void main() { Link L, p, q; int n, m; L = NULL; InitList(L);//构造出一个只有头结点的空链表 printf("请输入初始密码人数每个人的密码:\n"); scanf("%d", &m);//初始密码为m scanf("%d", &n);// Creatlinklist(n, L);//构建 p = L; for (int i = 1; i <= n; i++) { q = Locate_m(p, m);//找到第m个 printf("%d", q->num); Delete_m(L, p, q);//删除第m个 } system("pause"); }

数据结构实验报告(四)

《数据结构》实验报告 班级: 学号: 姓名:

实验四二叉树的基本操作实验环境:Visual C++ 实验目的: 1、掌握二叉树的二叉链式存储结构; 2、掌握二叉树的建立,遍历等操作。 实验内容: 通过完全前序序列创建一棵二叉树,完成如下功能: 1)输出二叉树的前序遍历序列; 2)输出二叉树的中序遍历序列; 3)输出二叉树的后序遍历序列; 4)统计二叉树的结点总数; 5)统计二叉树中叶子结点的个数; 实验提示: //二叉树的二叉链式存储表示 typedef char TElemType; typedef struct BiTNode{ TElemType data; struct BiTNode *lchild,*rchild; }BiTNode,*BiTree;

一、程序源代码 #include #include #define MAXSIZE 30 typedef char ElemType; typedef struct TNode *BiTree; struct TNode { char data; BiTree lchild; BiTree rchild; }; int IsEmpty_BiTree(BiTree *T) { if(*T == NULL) return 1; else return 0;

} void Create_BiTree(BiTree *T){ char ch; ch = getchar(); //当输入的是"#"时,认为该子树为空 if(ch == '#') *T = NULL; //创建树结点 else{ *T = (BiTree)malloc(sizeof(struct TNode)); (*T)->data = ch; //生成树结点 //生成左子树 Create_BiTree(&(*T)->lchild); //生成右子树 Create_BiTree(&(*T)->rchild); } } void TraverseBiTree(BiTree T) { //先序遍历 if(T == NULL) return;

《数据结构》实验指导

《数据结构》实验指导 (计算机信息大类适用) 实验报告至少包含以下内容: 实验名称 实验目的与要求: 实验内容与步骤(需要你进行细化): 实验结果(若顺利完成,可简单说明;若实验过程中遇到问题,也请在此说明) 收获与体会(根据个人的实际情况进行说明,不得空缺) 实验1 大整数加法(8课时) 目的与要求: 1、线性表的链式存储结构及其基本运算、实现方法和技术的训练。 2、单链表的简单应用训练。 3、熟悉标准模版库STL中的链表相关的知识。 内容与步骤: 1、编程实现单链表的基本操作。 2、利用单链表存储大整数(大整数的位数不限)。 3、利用单链表实现两个大整数的相加运算。 4、进行测试,完成HLOJ(https://www.360docs.net/doc/1511766402.html,) 9515 02-线性表大整数A+B。 5、用STL之list完成上面的任务。 6、尝试完成HLOJ 9516 02-线性表大菲波数。 实验2 栈序列匹配(8课时) 目的与要求 1、栈的顺序存储结构及其基本运算、实现方法和技术的训练。 2、栈的简单应用训练。 3、熟悉标准模版库STL中的栈相关的知识。 内容与步骤: 1、编程实现顺序栈及其基本操作。 2、对于给出的入栈序列和出栈序列,判断2个序列是否相容。即:能否利用栈 将入栈序列转换为出栈序列。 3、进行测试,完成HLOJ 9525 03-栈与队列栈序列匹配。 4、用STL之stack完成上面的任务。 5、尝试完成HLOJ 9522 03-栈与队列胡同。

实验3 二叉排序树(8课时) 目的与要求 1、二叉树的链式存储结构及其基本运算、实现方法和技术的训练。 2、二叉树的遍历方法的训练。 3、二叉树的简单应用。 内容与步骤: 1、编程实现采用链式存储结构的二叉排序树。 2、实现插入节点的操作。 3、实现查找节点的操作(若查找失败,则将新节点插入二叉排序树)。 4、利用遍历算法对该二叉排序树中结点的关键字按递增和递减顺序输出,完成 HLOJ 9576 07-查找二叉排序树。 5、尝试利用二叉排序树完成HLOJ 9580 07-查找Let the Balloon Rise。 实验4 最小生成树(8课时) 目的与要求 1、图的邻接矩阵存储结构及其相关运算的训练。 2、掌握最小生成树的概念。 3、利用Prim算法求解最小生成树。 实验背景: 给定一个地区的n个城市间的距离网,用Prim算法建立最小生成树,并计算得到的最小生成树的代价。要求显示得到的最小生成树中包括了哪些城市间的道路,并显示得到的最小生成树的代价。 内容与步骤: 1、建立采用邻接矩阵的图。 2、编程实现Prim算法,求解最小生成树的代价。 3、尝试利用Prim算法完成:HLOJ 9561 06-图最小生成树。

数据结构停车场问题实验报告汇总

数据结构课程设计 ——停车场管理问题 姓名: 学号: 问题描述 设有一个可以停放n辆汽车的狭长停车场,它只有一个大门可以供车辆进出。车辆按到达停车场时间的早晚依次从停车场最里面向大门口处停放(最先到达的第一辆车放在停车场的最里面)。如果停车场已放满n辆车,则后来的

车辆只能在停车场大门外的便道上等待,一旦停车场内有车开走,则排在便道上的第一辆车就进入停车场。停车场内如有某辆车要开走,在它之后进入停车场的车都必须先退出停车场为它让路,待其开出停车场后,这些车辆再依原来的次序进场。每辆车在离开停车场时,都应根据它在停车场内停留的时间长短交费。如果停留在便道上的车未进停车场就要离去,允许其离去,不收停车费,并且仍然保持在便道上等待的车辆的次序。编制一程序模拟该停车场的管理。 二、实现要求 要求程序输出每辆车到达后的停车位置(停车场或便道上),以及某辆车离开停车场时应交纳的费用和它在停车场内停留的时间。 三、实现提示 汽车的模拟输入信息格式可以是:(到达/离去,汽车牌照号码,到达/离去的时刻)。例如,(‘A',,1,5)表示1号牌照车在5这个时刻到达,而(‘ D ',,5,20)表示5号牌照车在20这个时刻离去。整个程序可以在输入信息为(‘ E ',0,0)时结束。本题可用栈和队列来实现。 四、需求分析 停车场采用栈式结构,停车场外的便道采用队列结构(即便道就是等候队列)。停车场的管理流程如 下 ①当车辆要进入停车场时,检查停车场是否已满,如果未满则车辆进栈(车辆进入停车场);如果停车场已满,则车辆进入等候队列(车辆进入便道等候)。 ②当车辆要求出栈时,该车到栈顶的那些车辆先弹出栈(在它之后进入的车辆必须先退出车场为它让路),再让该车出栈,其他车辆再按原次序进栈(进入车场)。当车辆出栈完毕后,检查等候队列(便道) 中是否有车,有车则从队列头取出一辆车压入栈中。

数据结构实验程序

顺序表的基本操作 #include using namespace std; typedef int datatype; #define maxsize 1024 #define NULL -1 typedef struct { datatype *data; int last; }sequenlist; void SETNULL(sequenlist &L) { L.data=new datatype[maxsize]; for(int i=0;i>https://www.360docs.net/doc/1511766402.html,st; cout<<"请输入"<>L.data[i]; } int LENGTH(sequenlist &L) { int i=0; while(L.data[i]!=NULL) i++; return i; } datatype GET(sequenlist &L,int i) { if(i<1||i>https://www.360docs.net/doc/1511766402.html,st) { cout<<"error1"<

int j=0; while(L.data[j]!=x) j++; if(j==https://www.360docs.net/doc/1511766402.html,st) { cout<<"所查找值不存在!"<=maxsize-1) { cout<<"overflow"; return NULL; } else if(i<1||(i>https://www.360docs.net/doc/1511766402.html,st)) { cout<<"error2"<=i-1;j--) L.data[j+1]=L.data[j]; L.data[i-1]=x; https://www.360docs.net/doc/1511766402.html,st++; } return 1; } int DELETE(sequenlist &L,int i) { int j; if((i<1)||(i>https://www.360docs.net/doc/1511766402.html,st+1)) { cout<<"error3"<

数据结构实验二叉树

实验六:二叉树及其应用 一、实验目的 树是数据结构中应用极为广泛的非线性结构,本单元的实验达到熟悉二叉树的存储结构的特性,以及如何应用树结构解决具体问题。 二、问题描述 首先,掌握二叉树的各种存储结构和熟悉对二叉树的基本操作。其次,以二叉树表示算术表达式的基础上,设计一个十进制的四则运算的计算器。 如算术表达式:a+b*(c-d)-e/f 三、实验要求 如果利用完全二叉树的性质和二叉链表结构建立一棵二叉树,分别计算统计叶子结点的个数。求二叉树的深度。十进制的四则运算的计算器可以接收用户来自键盘的输入。由输入的表达式字符串动态生成算术表达式所对应的二叉树。自动完成求值运算和输出结果。四、实验环境 PC微机 DOS操作系统或 Windows 操作系统 Turbo C 程序集成环境或 Visual C++ 程序集成环境 五、实验步骤 1、根据二叉树的各种存储结构建立二叉树; 2、设计求叶子结点个数算法和树的深度算法; 3、根据表达式建立相应的二叉树,生成表达式树的模块; 4、根据表达式树,求出表达式值,生成求值模块; 5、程序运行效果,测试数据分析算法。 六、测试数据 1、输入数据:*(+)3 正确结果: 2、输入数据:(1+2)*3+(5+6*7);

正确输出:56 七、表达式求值 由于表达式求值算法较为复杂,所以单独列出来加以分析: 1、主要思路:由于操作数是任意的实数,所以必须将原始的中缀表达式中的操作数、操作符以及括号分解出来,并以字符串的形式保存;然后再将其转换为后缀表达式的顺序,后缀表达式可以很容易地利用堆栈计算出表达式的值。 例如有如下的中缀表达式: a+b-c 转换成后缀表达式为: ab+c- 然后分别按从左到右放入栈中,如果碰到操作符就从栈中弹出两个操作数进行运算,最后再将运算结果放入栈中,依次进行直到表达式结束。如上述的后缀表达式先将a 和b 放入栈中,然后碰到操作符“+”,则从栈中弹出a 和b 进行a+b 的运算,并将其结果d(假设为d)放入栈中,然后再将c 放入栈中,最后是操作符“-”,所以再弹出d和c 进行d-c 运算,并将其结果再次放入栈中,此时表达式结束,则栈中的元素值就是该表达式最后的运算结果。当然将原始的中缀表达式转换为后缀表达式比较关键,要同时考虑操作符的优先级以及对有括号的情况下的处理,相关内容会在算法具体实现中详细讨论。 2、求值过程 一、将原始的中缀表达式中的操作数、操作符以及括号按顺序分解出来,并以字符串的 形式保存。 二、将分解的中缀表达式转换为后缀表达式的形式,即调整各项字符串的顺序,并将括 号处理掉。 三、计算后缀表达式的值。 3、中缀表达式分解 DivideExpressionToItem()函数。分解出原始中缀表达式中的操作数、操作符以及括号,保存在队列中,以本实验中的数据为例,分解完成后队列中的保存顺序如下图所示:

2017数据结构实验指导书

《数据结构》实验指导书 贵州大学 电子信息学院 通信工程

目录 实验一顺序表的操作 (3) 实验二链表操作 (8) 实验三集合、稀疏矩阵和广义表 (19) 实验四栈和队列 (42) 实验五二叉树操作、图形或网状结构 (55) 实验六查找、排序 (88) 贵州大学实验报告 (109)

实验一顺序表的操作 实验学时:2学时 实验类型:验证 实验要求:必修 一、实验目的和要求 1、熟练掌握线性表的基本操作在顺序存储和链式存储上的实现。 2、以线性表的各种操作(建立、插入、删除等)的实现为重点。 3、掌握线性表的动态分配顺序存储结构的定义和基本操作的实现。 二、实验内容及步骤要求 1、定义顺序表类型,输入一组整型数据,建立顺序表。 typedef int ElemType; //定义顺序表 struct List{ ElemType *list; int Size; int MaxSize; }; 2、实现该线性表的删除。 3、实现该线性表的插入。 4、实现线性表中数据的显示。 5、实现线性表数据的定位和查找。 6、编写一个主函数,调试上述算法。 7、完成实验报告。 三、实验原理、方法和手段 1、根据实验内容编程,上机调试、得出正确的运行程序。 2、编译运行程序,观察运行情况和输出结果。 四、实验条件 运行Visual c++的微机一台 五、实验结果与分析 对程序进行调试,并将运行结果进行截图、对所得到的的结果分析。 六、实验总结 记录实验感受、上机过程中遇到的困难及解决办法、遗留的问题、意见和建议等,并将其写入实验报告中。

【附录----源程序】 #include #include using namespace std; typedef int ElemType; struct List { ElemType *list; int Size; int MaxSize; }; //初始化线性表 bool InitList(List &L) { L.MaxSize=20; L.list=new ElemType[L.MaxSize]; for(int i=0;i<20&&L.list==NULL;i++) { L.list=new ElemType[L.MaxSize]; } if(L.list==NULL) { cout<<"无法分配内存空间,退出程序"<L.Size+1||pos<1) { cout<<"位置无效"<

数据结构实验报告

数据结构实验报告 一.题目要求 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

数据结构实验指导书及答案(徐州工程学院)

《数据结构实验》实验指导书及答案

信电工程学院计算机科学和技术教研室编 2011.12 数据结构实验所有代码整理 作者郑涛 声明:在这里我整理了数据结构实验的所有代码,希望能对大家的数据结构实验的考试有所帮助,大家可以有选择地浏览,特别针对一些重点知识需要加强记忆(ps:重点知识最好让孙天凯给出),希望大家能够在数据结构实验的考试中取得令人满意的成绩,如果有做的 不好的地方请大家谅解并欢迎予以指正。 实验一熟悉编程环境 实验预备知识: 1.熟悉本课程的语言编译环境(TC或VC),能够用C语言编写完整的程序,并能够发现和改正错误。 2.能够灵活的编写C程序,并能够熟练输入C程序。 一、实验目的 1.熟悉C语言编译环境,掌握C程序的编写、编译、运行和调试过程。 2.能够熟练的将C程序存储到指定位置。 二、实验环境 ⒈硬件:每个学生需配备计算机一台。 ⒉软件:Windows操作系统+Turbo C; 三、实验要求 1.将实验中每个功能用一个函数实现。 2.每个输入前要有输入提示(如:请输入2个整数当中用空格分割:),每个输出数据都要求有内容说明(如:280和100的和是:380。)。 3.函数名称和变量名称等用英文或英文简写(每个单词第一个字母大写)形式说明。 四、实验内容 1.在自己的U盘中建立“姓名+学号”文件夹,并在该文件夹中创建“实验1”文件夹(以后每次实验分别创建对应的文件夹),本次实验的所有程序和数据都要求存储到本文件夹中(以后实验都按照本次要求)。

2.编写一个输入某个学生10门课程成绩的函数(10门课程成绩放到结构体数组中,结构体包括:课程编号,课程名称,课程成绩)。 3.编写一个求10门成绩中最高成绩的函数,输出最高成绩和对应的课程名称,如果有多个最高成绩,则每个最高成绩均输出。 4.编写一个求10门成绩平均成绩的函数。 5.编写函数求出比平均成绩高的所有课程及成绩。 #include #include struct subject { int subject_id; char subject_name[20]; double subject_grades; }; struct subject sub[10]; void input() { int i; printf("please input:\n"); for(i=0;i<10;i++) { scanf("%d %s %lf",&sub[i].subject_id,&sub[i].subject_name,&sub[i].subject_g rades); } printf("you just input:\n"); for(i=0;i<3;i++) { printf("%d %s %lf\n",sub[i].subject_id,sub[i].subject_name,sub[i].subject_g rades); } } void subject_max() { int i,flag; double max=sub[0].subject_grades; for(i=0;i<10;i++) { if(sub[i].subject_grades>max)

数据结构上机实验线性表单链表源代码

#include template class LinearList { public: virtual bool IsEmpty()const=0; virtual int Length()const=0; virtual bool Find(int i,T& x)const=0; virtual int Search(T x)const=0; virtual bool Insert(int i,T x)=0; virtual bool Update(int i,T x)=0; virtual bool Delete(int i)=0; virtual void Output(ostream& out)const=0; protected: int n; }; #include "linearlist" template class SeqList:public LinearLisr { public: SeqList(int mSize); ~SeqList(){delete [] elements;} bool IsEmpty()const; bool Find(int i,T& x)const; int Length()const; int Search(T x)const; bool Insert(int i,T x); bool Update(int i,T x); bool Delete(int i); void Output(ostream& out)const; private: int maxLength; T *elements; }; template SeqList::SeqList(int mSize) { maxLength=mSize;

相关文档
最新文档