数据结构课程设计.docx

上传人:b****8 文档编号:9814843 上传时间:2023-05-21 格式:DOCX 页数:30 大小:125.45KB
下载 相关 举报
数据结构课程设计.docx_第1页
第1页 / 共30页
数据结构课程设计.docx_第2页
第2页 / 共30页
数据结构课程设计.docx_第3页
第3页 / 共30页
数据结构课程设计.docx_第4页
第4页 / 共30页
数据结构课程设计.docx_第5页
第5页 / 共30页
数据结构课程设计.docx_第6页
第6页 / 共30页
数据结构课程设计.docx_第7页
第7页 / 共30页
数据结构课程设计.docx_第8页
第8页 / 共30页
数据结构课程设计.docx_第9页
第9页 / 共30页
数据结构课程设计.docx_第10页
第10页 / 共30页
数据结构课程设计.docx_第11页
第11页 / 共30页
数据结构课程设计.docx_第12页
第12页 / 共30页
数据结构课程设计.docx_第13页
第13页 / 共30页
数据结构课程设计.docx_第14页
第14页 / 共30页
数据结构课程设计.docx_第15页
第15页 / 共30页
数据结构课程设计.docx_第16页
第16页 / 共30页
数据结构课程设计.docx_第17页
第17页 / 共30页
数据结构课程设计.docx_第18页
第18页 / 共30页
数据结构课程设计.docx_第19页
第19页 / 共30页
数据结构课程设计.docx_第20页
第20页 / 共30页
亲,该文档总共30页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

数据结构课程设计.docx

《数据结构课程设计.docx》由会员分享,可在线阅读,更多相关《数据结构课程设计.docx(30页珍藏版)》请在冰点文库上搜索。

数据结构课程设计.docx

数据结构课程设计

《空间数据结构基础》

课程实习报告(测绘10级)

 

姓名

班级

学号

 

环境与测绘学院

1C++面向对象程序设计基础

【实验简介】学会用算法语言C++描述抽象数据类型,使用模板建立数据结构。

理解数据结构的组成分为两部分,第一部分是数据集(数据元素),第二部分是在此数据集上的操作。

从面向对象的观点看,这两部分代表了对象的属性和方法。

掌握用C++描述数据结构的基本方法,即通过建立类来描述抽象数据类型。

类的数据成员提供对象属性,成员函数提供操作方法,方法是公共接口,用户通过调用方法实现对属性的访问。

【实验内容】

1.定义三维空间的坐标点TPoint

2.描述三维空间的球TBall,实现其主要操作(如计算体积和表面积,输出空间坐标等)。

【主要代码】

#include

usingnamespacestd;

doubleconstPI=3.14;

template

classTPoint{

protected:

Tx,y,z;

public:

TPoint(){

x=0;

y=0;

z=0;

}

TPoint(Ta,Tb,Tc){

x=a;

y=b;

z=c;

}

};

template

classTBall:

publicTPoint{

private:

Tr;

public:

TBall(){

r=0;

}

TBall(Ta,Tb,Tc,Td){

x=a;

y=b;

z=c;

r=d;

}

voidoutput_S();

voidoutput_V();

voidoutput_P();

};

template

voidTBall:

:

output_P(){

cout<<"球心的坐标"<

}

template

voidTBall:

:

output_S(){

cout<<"球的表面积"<<4*PI*r*r<

}

template

voidTBall:

:

output_V(){

cout<<"球的体积为"<

}

voidmain(){

inta,b,c,d;

cout<<"请输入球心坐标"<<"x=";

cin>>a;

cout<<"y=";

cin>>b;

cout<<"z=";

cin>>c;

cout<<"请输入半径"<<"r=";

cin>>d;

TBallball(a,b,c,d);

ball.output_S();

ball.output_V();

ball.output_P();

}

【实验过程】

首先定义一个点的类作为一个基类,在定义个球的类,并且公共继承点类

将球的类的公共函数作为一个调用类的私有成员的接口

具体公共函数的实现在类的外面。

使用公共模版类

【实验体会】

通过这次实验我掌握了点的类定义、空间中一个球体的定义和从点到球体公有继承的方法以及输入输出的方法!

实验里首先定义一个PI,接着在实验中就能很好的简化实验操作步骤和代码量!

2链表的建立、合并与拆分

【实验简介】链表是用链接存储的方式来表达线性表,它用指针表示结点间的逻辑关系,链表适用于插入或删除频繁,存储空间需求不定的情形。

【实验内容】定义一个链表存储的线性表,除已给出的表元素插入、删除、查找等基本操作外,再提供表的合并、拆分和逆置等操作。

在应用程序中建立两个整型的单链表对象A和B,应用线性表的基本操作对表的实例对象进行操作测试。

1.设线性链表A=(a1,a2,…,am),,B=(b1,b2,…bm),按下列规则合并A,B为线性表C的算法,即使得

C=(a1,b1,…,am,bm,b(m+1),…,bn)当m<=n

或C=(a1,b1,…,an,bn,a(n+1),…,am)当m>n

C表利用A表和B表中的结点空间构成。

2.将C表原地逆置。

3.将C表的中偶数和奇数分别链接为两个循环链表D和E。

说明:

每一次合并、拆分和逆置等操作的结果均要输出。

【主要代码】

#include

template//定义在"LinkedList.h"

structLinkNode//链表结点类的定义

{Tdata;//数据域

LinkNode*link;//链指针域

LinkNode(LinkNode*ptr=NULL)

{link=ptr;}//构造函数

LinkNode(constT&item,LinkNode*ptr=NULL)

{data=item;link=ptr;}//构造函数

};

template

classList//单链表类定义

{protected:

LinkNode*first;//表头指针

public:

List(){first=newLinkNode;}//构造函数

List(constT&x){first=newLinkNode(x);}

List(List&L);//复制构造函数

~List(){makeEmpty();}//析构函数

voidmakeEmpty();//将链表置为空表

intLength()const;//计算链表的长度

LinkNode*getHead()const{returnfirst;}

LinkNode*Search(Tx);//搜索含x元素

LinkNode*Locate(inti);//定位第i个元素

boolgetData(inti,T&x);//取出第i元素值

voidsetData(inti,T&x);//更新第i元素值

boolInsert(inti,T&x);//在第i元素后插入x

boolRemove(inti,T&x);//删除第i个元素,x返回该元素值

booluniom(List&A,List&B,List&C);//合并A,B为线性表C,C利用A和B的存储空间

voidchangeover();//将L链表原地逆转

voidclassify(List&C,List&D,List&E);//将C表的中偶数和奇数分别链接为两个循环链表D和E。

boolIsEmpty()const//判表空否

{returnfirst->link==NULL?

true:

false;}

voidSort();//排序

voidinput();

voidoutput();

List&operator=(List&L);

};

voidmain()

{ListA,B;

}

voidList:

:

classify(List&C,List&D,List&E)

{

D.makeEmpty();E.makeEmpty();//置空D、E链表

LinkNode*current=C.first;

LinkNode*p=current->link;

LinkNode*pd=D.first;

LinkNode*pe=E.first;

while(p!

=null)//循环地分别连接C中的结点到循环链表D和E中

{

current->link=p->link;//拿出p结点

if((p->data)%2==0)

{pd->link=p;//D链表存放偶数结点

pd=pd->link;

pd->link=D.first;}

else

{pe->link=p;//E链表存放奇数结点

pe=pe->link;

pe->link=E.first;}

p=current->link;//p结点后移一个

}

};

template

boolList:

:

changeover()

{

LinkNode*aq,*pr;

aq=first->link;

first->link=null;

while(aq!

=null)

{

pr=aq->link;

aq->link=first;

first=aq;

aq=pr;//把C转置

}

};

template

boolList:

:

uniom(List&A,List&B);

{

ListC=A;

intm,n,min,i=1,

min=(m<=n?

m:

n)

m=A.length();n=B.length();

LinkNode*p=A.first;

while(i<=min)

{

LinkNode*current=B.first;

LinkNode*aiq=current->link;

current->link=aiq->link;//拿出aiq结点

LinkNode*pt=A.locate(i);

aiq->link=pt->link;

pt->link=aiq;//把aiq结点插入到A的第i个结点后

i++;

}//A链表比B链表长的情况不用再调整

if(m<=n){aiq->link=B.first->link;}//B链表比A链表长的情况

if(C.length()=m+n)

returntrue;

else

returnfalse;

};

template

voidList:

:

makeEmpty()

{LinkNode*q;

while(first->link!

=NULL)

{q=first->link;//保存被删结点

first->link=q->link;//从链上摘下该结点

deleteq;//删除

}

};

template

intList:

:

Length()const{

ListNode*p=first->link;

intcount=0;

while(p!

=NULL)//逐个结点检测

{p=p->link;count++;}

returncount;

}

template

LinkNode*List:

:

Search(Tx){

//在表中搜索含数据x的结点,搜索成功时函数返该结点地址;否则返回NULL。

LinkNode*current=first->link;

while(current!

=NULL&¤t->data!

=x)current=current->link;

returncurrent;

};

template

LinkNode*List:

:

Locate(inti)

{//函数返回表中第i个元素的地址。

若i<0或i超出表中结点个数,则返回NULL。

if(i<0)returnNULL;//i不合理

LinkNode*current=first;intk=0;

while(current!

=NULL&&k

{current=current->link;k++;}

returncurrent;//返回第i号结点地址或NULL

};

template

boolList:

:

getData(inti,T&x)//取出链表中第i个元素的值

{if(i<=0)returnfalse;

LinkNode*current=Locate(i);

if(cunent==NULL)returnfalse;

else{x=current->data;returntrue;}

template

voidList:

:

setData(inti,T&x)//给链表中第i个元素的赋值x

{if(i<=0)return;

LinkNode*current=Locate(i);

if(cunent==NULL)return;

elsecurrent->data=x;}

template

boolList:

:

Insert(inti,T&x)

//将新元素x插入在链表中第i个结点之后。

{LinkNode*current=Locate(i);

if(current==NULL)returnfalse;//无插入位置

LinkNode*newNode=newLinkNode(x);

if(newNode==NULL)

{cerr<<"内存分配错误!

"<

(1);}

newNode->link=current->link;//链入

current->link=newNode;

returntrue;//插入成功

};

template

boolList:

:

Remove(inti,T&x)

//删除链表第i个元素,通过引用参数x返回元素值

{LinkNode*current=Locate(i-1);

if(current==NULL||current->link==NULL)

returnfalse;//删除不成功

LinkNode*del=current->link;

current->link=del->link;

x=del->data;deletedel;

returntrue;

};

template

voidList:

:

output()

{LinkNode*current=first->link;

while(current!

=NULL)

{cout<data<

current=current->link;

}

}

template

voidList:

:

inputFront(TendTag)

{LinkNode*newNode;Tval;

makeEmpty();

cin>>val;

while(val!

=endTag)

{newNode=newLinkNode(val);

if(newNode==NULL)

{cerr<<"内存分配错误!

"<

(1);}

newNode->link=first->link;//插在表前端

first->link=newNode;

cin>>val;

}

};

 

【实验过程】

对实验内容进行分析,由1)设线性链表A=(a1,a2,…,am),,B=(b1,b2,…bm),按下列规则合并A,B为线性表C的算法,即使得

C=(a1,b1,…,am,bm,b(m+1),…,bn)当m<=n

或C=(a1,b1,…,an,bn,a(n+1),…,am)当m>n设计出函数uniom;由2)将C表原地逆置,设计出了函数changeover;由3)将C表的中偶数和奇数分别链接为两个循环链表D和E设计出了函数classify。

然后再设计主函数,逐步进行调试。

 

【实验体会】

通过该实验,我能了解链表的概念、功能及应用。

链表是用链接存储的方式来表达线性表,它用指针表示结点间的逻辑关系,链表适用于插入或删除频繁,存储空间需求不定的情形。

6图元识别和替换(用队列实现)

【问题描述】对于点阵式的图,在程序中可以用二维数组来表示。

图中一片连续的具有相同颜色的点称为“图元”。

现给出的问题是,对图中指定的图元用另一种颜色来替换。

用队列实现。

输入输出界面与实验指导书中算法实现_程序3.1相同。

【主要代码】

#include

#include

#defineQMAX30//设栈空间最大为30单元

#defineM8//设方阵大小为8行8列

typedefstruct{//像素结构

introw;//像素的行下标

intcol;//像素的列下标

}Pixel;//像素类型名

Pixeloffset[4];//矩阵中四个方向的移动修正表

classStack{

private:

Pixelst[QMAX];//像素类型的栈空间

inttop;//栈顶

public:

Stack(){top=0;}

voidpush(Pixel&e);//像素e进栈

Pixelpop();//出栈一个像素

intIsEmpty();//判断栈是否为空,若空则返回1,否则返回0

};

voidStack:

:

push(Pixel&e){//像素e进栈

if(top==QMAX)exit(0);

st[top].row=e.row;

st[top].col=e.col;

top++;

}

PixelStack:

:

pop(){//出栈一个像素,由e返回

Pixele;

if(top==0)exit(0);

top--;

e.row=st[top].row;

e.col=st[top].col;

returne;

}

intStack:

:

IsEmpty(){//判断栈是否为空

if(top<=0)return1;

elsereturn0;

}

voidInit(Pixelpos[]){//初始化移动修正表数组,pos[]即offset[4]

pos[0].row=0;pos[0].col=1;//right

pos[1].row=1;pos[1].col=0;//down

pos[2].row=0;pos[2].col=-1;//left

pos[3].row=-1;pos[3].col=0;//up

}

intseekp(intarra[][8],intai,intaj,intx,inty){//使用栈的图元替换算法

Pixelnbr,here;//进栈变量和出栈变量

Stackms;//栈

inti,ni,nj;//工作变量,下一个工作点的行下标和列下标

cout<<"搜索到的图元像素:

"<

cout<

arra[ai][aj]=x;//替换

arra[ai][aj+1]=x;//替换

return1;

}

voidmain(){

intarra[8][8]={//存储图的数组初始化

0,0,0,0,0,0,0,0,

0,0,3,3,0,5,2,0,

0,0,3,3,0,0,2,0,

0,6,2,3,8,8,8,0,

0,0,2,3,8,0,0,0,

0,2,2,8,8,7,3,0,

0,0,2,5,8,3,3,0,

0,0,0,0,0,0,0,0

};//四周设一圈围墙(值为0)以保证数据处理的可靠性

inti,j,x,y;

Init(offset);//初始化移动修正表数组

cout<<"像素矩阵:

"<

for(i=0;i

for(j=0;j

cout<

cout<

}

cout<<"请输入指定图元的坐标和新像素值(ijx用空格分隔):

";

cin>>i>>j>>x;//输入数据用空格分隔

y=arra[i][j];//取指定像素的值

if(y!

=x){

seekp(arra,i,j,x,y);//进行图元替换

cout<<"替换后的像素矩阵:

"<

for(i=0;i

for(j=0;j

cout<

cout<

}

cout<<"图元替换完毕!

"<

}

elsecout<<"未做替换!

"<

}

实验成果:

【实验体会】

在二叉树中正确地理解和应用递归思想是很重要。

由于二叉树的结构的特殊性,所以能充分发挥递归函数的强大功能。

9字符串

【实验简介】字符串是由零个或多个字符的顺序排列所组成的数据结构,字符串在计算机处理中使用非常广泛。

通过本次实验理解字符串运算的原理,掌握主要算法的实现。

【实验内容】

建立字符串类,并实现求子串、字符串赋值、字符串连接等运算符重载函数,实现字符串的模式匹配功能。

编写一个能够统计字符串中各个字符出现频度的函数。

【主要代码】

#include

usingnamespacestd;

#include

intconstdefaultSize=128;//常量

classAString{

public:

AString();//构造函数

AString(constchar*init);//构造函数

AString(constAString&ob);//复制构造函数

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 人文社科 > 文化宗教

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2