空间数据结构课程设计报告.docx
- 文档编号:8371919
- 上传时间:2023-01-30
- 格式:DOCX
- 页数:30
- 大小:96.82KB
空间数据结构课程设计报告.docx
《空间数据结构课程设计报告.docx》由会员分享,可在线阅读,更多相关《空间数据结构课程设计报告.docx(30页珍藏版)》请在冰豆网上搜索。
空间数据结构课程设计报告
《空间数据结构基础》
课程实习报告
(测绘09级)
姓名李冬伟
班级采矿09-9班
学号07092951
矿业与工程学院
三维空间球
【实验目的】
了解复合数据结构的描述方法。
球是一个包含坐标点的复合数据结构,在C++程序中将坐标点和球分别定义为具有继承关系的两个类,即定义球类Tball为Point的派生类。
使用派生类的形式定义一个数据结构,其主要目的是提高基类的代码利用率,并使派生类的结构得到简化。
基类和派生类的定义体现了C++继承机制的运用,最大程度地提高了数据结构的利用率。
【问题描述】定义三维空间的坐标点TPoint并且描述三维空间的球Tball。
【数据结构】定义Tpoint类和Tball类。
【主要功能】实现其主要操作:
计算体积和表面积,输出空间坐标等。
【程序代码】
#include
constdoublePI=3.14159;
classTPoint
{
protected:
doublex;
doubley;
doublez;
public:
TPoint(){x=0;y=0;z=0;}
TPoint(doublepx,doublepy,doublepz){x=px;y=py;z=pz;}
doubleGetx(){returnx;}
doubleGety(){returny;}
doubleGetz(){returnz;}
voidMove(doublemx,doublemy,doublemz);
voidShow(){cout<<"x="< }; classTBall: publicTPoint { doubler; public: TBall(doublea): TPoint(){r=a;} TBall(doubleb,doublec,doubled,doublee): TPoint(b,c,d){r=e;} doubleArea(){return4*PI*r*r;} doubleVolume(){return4*PI*r*r*r/3;} voidShow(); voidinput(); }; voidTBall: : Show() { cout<<"球的球心坐标为: "<<"("< cout<<"球的体积为: "< cout<<"球的表面积为: "< } voidmain() { TBallB1(1,2,3,4); TBallB2(4); B1.Show(); B2.Show(); } 【实现界面】 【实践体会】 三维空间球的程序代码我原本是仅由原有代码稍加修改后得到的,但在执行时,输出的数据出现了错误,球的面积和体积计算出的结果出现了负数,所以我对原有的程序代码进行了简化和修改,重新进行了编辑。 链表的建立、合并、逆转和拆分 【实验目的】本例给出了较完整的顺序表的抽象数据类型定义,通过C++类模板的应用体现了数据抽象原理。 【问题描述】定义一个链表存储的线性表,除已给出的表元素插入、删除、查找等基本操作外,再提供表的合并、拆分和逆置等操作。 在应用程序中建立两个整型的单链表对象A和B,应用线性表的基本操作对表的实例对象进行操作测试。 【数据结构】定义一个链表结点类LinkNode和一个线性链表类List,提供表元素的插入、删除、查找和以下操作。 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>nC表利用A表和B表中的结点空间构成。 2.将C表原地逆置。 3.将C表的中偶数和奇数分别链接为两个循环链表D和E。 【主要功能】可以输入一个单链表,实现单链表的合并、拆分和逆置等操作,且每次结果均可输出。 【程序代码】 #include #include template structLinkNode { Tdata; LinkNode LinkNode(LinkNode LinkNode(constT&item,LinkNode { data=item; link=ptr; } }; template classList { public: List(){h=newLinkNode List(constT&x){h=newLinkNode List(List ~List(){makeEmpty();} voidmakeEmpty(); intLength()const; LinkNode LinkNode LinkNode boolgetData(inti,T&x)const; voidsetData(inti,T&x); boolInsert(inti,T&x); boolRemove(inti,T&x); boolIsEmpty()const {returnh->link==NULL? true: false;} boolIsFull()const{returnfalse;} voidreverse(); voidinput(TendTag); voidoutput(); List protected: LinkNode }; template List : List(List { Tvalue; LinkNode LinkNode while(srcptr->link! =NULL) { value=srcptr->link->data; desptr->link=newLinkNode desptr=desptr->link; srcptr=srcptr->link; } desptr->link=NULL; } template voidList : makeEmpty() { LinkNode while(h->link! =NULL) { q=h->link; h->link=q->link; deleteq; } } template intList : Length()const { LinkNode intcount=0; while(p! =NULL) {p=p->link;count++;} returncount; } template LinkNode : Search(Tx) { LinkNode while(current! =NULL) if(current->data==x)break; elsecurrent=current->link; returncurrent; } template LinkNode : Locate(inti) { if(i<0)returnNULL; LinkNode intk=0; while(current! =NULL&&k {current=current->link;k++;} returncurrent; } template boolList : getData(inti,T&x)const { if(i<=0)returnNULL; LinkNode if(current==NULL)returnfalse; else{x=current->data;returnture;} } template voidList : setData(inti,T&x) { if(i<=0)return; LinkNode if(current==NULL)return; elsecurrent->data=x; } template boolList : Insert(inti,T&x) { LinkNode if(current==NULL)returnfalse; LinkNode if(newNode==NULL) {cerr<<"存储分配错误! "< (1);} newNode->link=current->link; current->link=newNode; returntrue; } template boolList : Remove(inti,T&x) { LinkNode if(current==NULL||current->link==NULL)returnfalse; LinkNode current->link=del->link; x=del->data; deletedel; returntrue; } template voidList : output() { LinkNode cout< while(current! =NULL) { cout< current=current->link; } cout< } template List : operator=(List { Tvalue; LinkNode LinkNode while(srcptr->link! =NULL) { value=srcptr->link->data; desptr->link=newLinkNode desptr=desptr->link; srcptr=srcptr->link; } desptr->link=NULL; return*this; } template voidList : input(TendTag) { LinkNode Tval; makeEmpty(); cout<<"输入单链表的数据(输入零结束)"< cin>>val; last=h; while(val! =endTag) { newNode=newLinkNode if(newNode==NULL) {cerr<<"存储分配错误! "< (1);} last->link=newNode; last=newNode; cin>>val; } last->link=NULL; } template voidList : reverse() { LinkNode last=h->link; led=h->link; while(last->link! =NULL) { last=last->link; } while(last! =led) { q=led; led=led->link; h->link=led; q->link=last->link; last->link=q; } } voidUnion(List { intm=A.Length(); intn=B.Length(); LinkNode LinkNode LinkNode LinkNode if(m>n) { while(q! =NULL) { destptr->link=q->link; q->link=p->link; p->link=q; p=p->link->link; q=destptr->link; } } else { for(inti=1;i { destptr->link=q->link; q->link=p->link; p->link=q; p=p->link->link; q=destptr->link; } while(q! =NULL) { destptr->link=q->link; q->link=p->link; p->link=q; q=destptr->link; p=p->link; } } } voidSplit(List { intvalue; List List LinkNode LinkNode LinkNode while(led->link! =NULL) { value=led->link->data; if(value%2==0) { scrptr->link=newLinkNode scrptr=scrptr->link; } elseif(value%2==1) { destptr->link=newLinkNode destptr=destptr->link; } led=led->link; } scrptr->link=NULL; destptr->link=NULL; cout<<"原链表拆分成D、E两个链表"< cout<<"D表元素全为偶数,依次是: "< D.output(); cout<<"E表元素全为奇数,依次是: "< E.output(); } voidmain() { List List A.input(0); B.input(0); Union(A,B); List cout<<"两链表合成后,单链表的元素依次是: "< C.output(); C.reverse(); cout<<"链表逆转后的元素依次是: "< C.output(); Split(C); } 【实现界面】 【实践体会】 程序的代码在编辑时,在链表的合并和拆分上,程序的逻辑结构我没有分析明了,开始设计代码时没有成功,之后参考了同学的算法设计才编出代码,同时在主函数的编辑时,有关函数的调用我还是不很清楚,也是询问同学后编译出的。 中缀转后缀 【实验目的】中缀转后缀问题可借助栈来处理。 本实验题有助于掌握栈的应用技术。 【问题描述】表达式转换。 输入的中缀表达式为字符串,转换得到的后缀表达式存入字符数组中并输出。 例如: a*(x+y)/(b-x)转换后得: axy+*bx-/ 【数据结构】定义一个暂时存放运算符的转换工作栈opst。 中缀表达式字符串char*infix;后缀表达式字符串char*postfix; 【主要功能】输入一个中缀表达式,输出的是该算法的后缀表达式。 【程序代码】 #include #include #include constintstackIncreament=20; template classOpst { public: Opst(intsz=50); ~Opst(){delete[]elements;} voidPush(constT&x); boolPop(T&x); boolgetTop(T&x); boolIsEmpty()const{return(top==-1)? true: false;} boolIsFull()const{return(top==maxSize-1)? true: false;} intgetSize()const{returntop+1;} voidmakeEmpty(){top=-1;} friendostream&operator<<(ostream&os,Opst private: T*elements; inttop; intmaxSize; voidoverflowProcess(); }; template Opst : Opst(intsz): top(-1),maxSize(sz) { elements=newT[maxSize]; assert(elements! =NULL); } template voidOpst : overflowProcess() {*newArray=newT[maxSize+stackIncreament]; if(newArray=NULL){cerr<<"存贮分配失败! "< (1);} for(inti=0;i<=top;i++)newArray[i]=elements[i]; maxSize=maxSize+stackIncreament; delete[]elements; elements=newArray; } template voidOpst : Push(constT&x) {if(IsFull()==true)overflowProcess(); elements[++top]=x; } template boolOpst : Pop(T&x) {if(IsEmpty()==true)returnfalse; x=elements[top--]; returntrue; } template boolOpst : getTop(T&x) { if(IsEmpty()==true)returnfalse; x=elements[top]; returntrue; } template ostream&operator<<(ostream&os,Opst { os<<"top="< for(inti=0;i<=s.top;i++) os< "< returnos; } intisdigit(charch) { switch(ch) { case'+': case'-': case'*': case'/': case'(': case')': return0; break; default: return1;break; } } intisp(charch) { switch(ch) { case'#': return0;break; case'(': return1;break; case'*': return5;break; case'/': return5;break; case'%': return5;break; case'+': return3;break; case'-': return3;break; case')': return6;break; default: break; } } inticp(charch) {switch(ch) { case'#': return0;break; case'(': return6;break; case'*': return4;break; case'/': return4;break; case'%': return4;break; case'+': return2;break; case'-': return2;break; case')': return1;b
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 空间 数据结构 课程设计 报告
![提示](https://static.bdocx.com/images/bang_tan.gif)