数据库与数据结构实验含源代码.docx

上传人:b****4 文档编号:24473925 上传时间:2023-05-27 格式:DOCX 页数:67 大小:437.28KB
下载 相关 举报
数据库与数据结构实验含源代码.docx_第1页
第1页 / 共67页
数据库与数据结构实验含源代码.docx_第2页
第2页 / 共67页
数据库与数据结构实验含源代码.docx_第3页
第3页 / 共67页
数据库与数据结构实验含源代码.docx_第4页
第4页 / 共67页
数据库与数据结构实验含源代码.docx_第5页
第5页 / 共67页
点击查看更多>>
下载资源
资源描述

数据库与数据结构实验含源代码.docx

《数据库与数据结构实验含源代码.docx》由会员分享,可在线阅读,更多相关《数据库与数据结构实验含源代码.docx(67页珍藏版)》请在冰豆网上搜索。

数据库与数据结构实验含源代码.docx

数据库与数据结构实验含源代码

实验一一元稀疏多项式的表示及加法运算

一、需求分析

1.程序的功能:

(1)两个多项式以指数递增的顺序输入;(选做内容部分,多项式也可未按指数递增的顺序输入。

(2)设计的数据结构应有利于表示任意一元稀释多项式;

(3)输出原始多项式及两个多项式相加后的运算结果。

2.输入输出的要求:

分别输入一元多项式各项的系数和指数,系数以浮点数输入,指数以整型数输入。

输出为具体各个一元多项式的形式,如7+3*x+9*x^8+5*x^17。

3.测试数据:

(1)

(2)

(3)

二、概要设计

1.本程序所用的数据结构的定义:

本程序中主要用了单链表的线性结构,其数据结构的定义如下:

structlink

{

floatceof;//每项系数

intexp;//每项指数

link*next;//指针域

};

并构造了一个多项式类:

classPolynomial;类定义如下:

classPolynomial//多项式类定义

{

link*head;//头指针

public:

voidcreat();//输入每项系数和指数创建多项式

voidpaixu();//多项式按指数从小到大排序

voidshuchu();//输出多项式

voidaddtwo(link*ha,link*hb);//将两个多项式相连构成一个新的多项式,再通过排序和除去系数为0项

//实现两个多项式相加

voidqingling();//将多项式中系数为0的项消去

link*gethead();//取多项式的头结点

};

2.主程序的流程及各程序模块之间的层次关系:

主程序的具体代码如下:

#include"Polynomail.h"

usingnamespacestd;

voidmain()

{

PolynomialA,B,C;

cout<<"请输入多项式A:

"<

A.creat();

A.qingling();

A.paixu();

cout<<"请输入多项式B:

"<

B.creat();

B.qingling();

B.paixu();

cout<<"多项式A为:

"<

A.shuchu();

cout<<"多项式B为:

"<

B.shuchu();

cout<<"A和B相加为:

"<

C.addtwo(A.gethead(),B.gethead());

C.paixu();

C.qingling();

C.shuchu();

}

3.主程序流程如下:

三、详细设计

各模块算法如下:

1.创建多项式

voidPolynomial:

:

creat()//输入每项系数和指数创建多项式

{

link*p,*q,*s;

cout<<"请依次输入每项系数和指数,以空格分开,指数<0,输入完成!

"<

floatc;

inte;

cin>>c>>e;//输入系数和指数

p=q=newlink;

p->next=NULL;

while(e>=0)

{

s=newlink;

s->ceof=c;

s->exp=e;

q->next=s;

q=s;

cin>>c>>e;

}

q->next=NULL;

head=p;

}

2.多项式每项按指数由小到大排序

voidPolynomial:

:

paixu()//多项式按指数从小到大排序

{

link*p,*q;

floata;

intb;

p=head->next;

while(p!

=NULL)

{

q=p->next;

while(q!

=NULL)

{

if(p->exp>q->exp)//后面的某一项指数小于前面的某一项,将两

//项系数和指数值交换

{

a=p->ceof;

b=p->exp;

p->ceof=q->ceof;

p->exp=q->exp;

q->ceof=a;

q->exp=b;

q=q->next;

}

else

if(p->exp==q->exp)//两项指数相等,则系数相加,后面一项系数

//置为0

{

p->ceof=p->ceof+q->ceof;

q->ceof=0;

q=q->next;

}

elseq=q->next;

}

p=p->next;

}

}

3.将多项式中系数为0的项消去

voidPolynomial:

:

qingling()//将多项式中系数为0的项消去

{

link*p,*q;

p=head;

q=head->next;

while(q!

=NULL)

{

if(q->ceof==0)

{

p->next=q->next;

deleteq;

q=p->next;

}

else

{

p=p->next;

q=p->next;

}

}

}

4.输出多项式

voidPolynomial:

:

shuchu()//输出多项式

{

link*p;

p=head->next;

if(p==NULL)cout<<"0";

else

{

while(p->next!

=NULL)

{

if(p->exp==0){cout<ceof;}

else

if(p->exp==1){cout<ceof<<"X";}

else

{cout<ceof<<"X^"<exp;}

p=p->next;

if(p->ceof>0)cout<<"+";

}

if(p->exp==0)//输出最后一项

{cout<ceof;

}

else

if(p->exp==1)cout<ceof<<"X";

else

cout<ceof<<"X^"<exp;

}

cout<

}

5.将两个多项式相连构成一个新的多项式,再通过排序和除去系数为0项,实现两个多项式相加

voidPolynomial:

:

addtwo(link*ha,link*hb)//将两个多项式相连构成一个新的多项式,再通过排序和除去系数为0项,实现两个多项式相加

{

link*a,*b,*c;

link*p;

a=ha->next;

p=b=newlink;

while(a!

=NULL)//将A复制进C

{

c=newlink;

c->ceof=a->ceof;

c->exp=a->exp;

c->next=NULL;

b->next=c;

b=b->next;

a=a->next;

}

a=hb->next;

while(a!

=NULL)//将B复制进C,接在A后面

{

c=newlink;

c->ceof=a->ceof;

c->exp=a->exp;

c->next=NULL;

b->next=c;

b=b->next;

a=a->next;

}

b=NULL;

head=p;

}

四、调试分析

1.调试中遇到的问题及对问题的解决方法:

在调试中,将A、B两个多项式输入输出都没有问题,但是当将A、B相加时,运行出错,程序必须终止。

而在编译过程中又没有报错。

通过在DEBUG过程中的调试步骤,找到了出错点—addtwo(link*ha,link*hb)。

程序无法运行的原因是函数中定义了指针变量,但是未分配内存空间。

添加语句:

p=b=newlink;后,问题得到解决。

2.算法的时间复杂度和空间复杂度:

时间复杂度:

①paixu:

②qingling:

③shuchu:

④addtwo:

空间复杂度:

由于程序中运用单链表的数据结构,并且各个部分所用的空间均较小,因此总体的空间复杂度也较小。

五、使用说明及测试结果

运行程序后,结果提示先输入多项式A,分别输入每一项的系数和指数,以空格隔开,当输入完毕后,输入后一项的指数小于0,则多项式A输入完成。

接着同样输入多项式B。

当多项式B输入结束后,屏幕则会显示多项式A和B,以及A和B相加后的多项式。

(在输入多项式时,不需要按照指数从低到高的顺序输入,运行结果会自动排列,将多项式以指数从低到高的顺序输出。

测试结果界面如下:

六、源程序(带注释)

#include

usingnamespacestd;

structlink

{

floatceof;//每项系数

intexp;//每项指数

link*next;//指针域

};

classPolynomial//多项式类定义

{

link*head;//头指针

public:

voidcreat();//输入每项系数和指数创建多项式

voidpaixu();//多项式按指数从小到大排序

voidshuchu();//输出多项式

voidaddtwo(link*ha,link*hb);//将两个多项式相连构成一个新的多项式,再通过排序和除去系数为0项

//实现两个多项式相加

voidqingling();//将多项式中系数为0的项消去

link*gethead();//取多项式的头结点

};

link*Polynomial:

:

gethead()

{

link*p=head;

returnp;

}

voidPolynomial:

:

creat()//输入每项系数和指数创建多项式

{

link*p,*q,*s;

cout<<"请依次输入每项系数和指数,以空格分开,指数<0,输入完成!

"<

floatc;

inte;

cin>>c>>e;//输入系数和指数

p=q=newlink;

p->next=NULL;

while(e>=0)

{

s=newlink;

s->ceof=c;

s->exp=e;

q->next=s;

q=s;

cin>>c>>e;

}

q->next=NULL;

head=p;

}

voidPolynomial:

:

paixu()//多项式按指数从小到大排序

{

link*p,*q;

floata;

intb;

p=head->next;

while(p!

=NULL)

{

q=p->next;

while(q!

=NULL)

{

if(p->exp>q->exp)//后面的某一项指数小于前面的某一项,将两

//项系数和指数值交换

{

a=p->ceof;

b=p->exp;

p->ceof=q->ceof;

p->exp=q->exp;

q->ceof=a;

q->exp=b;

q=q->next;

}

else

if(p->exp==q->exp)//两项指数相等,则系数相加,后面一项系数

//置为0

{

p->ceof=p->ceof+q->ceof;

q->ceof=0;

q=q->next;

}

elseq=q->next;

}

p=p->next;

}

}

voidPolynomial:

:

qingling()//将多项式中系数为0的项消去

{

link*p,*q;

p=head;

q=head->next;

while(q!

=NULL)

{

if(q->ceof==0)

{

p->next=q->next;

deleteq;

q=p->next;

}

else

{

p=p->next;

q=p->next;

}

}

}

voidPolynomial:

:

shuchu()//输出多项式

{

link*p;

p=head->next;

if(p==NULL)cout<<"0";

else

{

while(p->next!

=NULL)

{

if(p->exp==0){cout<ceof;}

else

if(p->exp==1){cout<ceof<<"X";}

else

{cout<ceof<<"X^"<exp;}

p=p->next;

if(p->ceof>0)cout<<"+";

}

if(p->exp==0)//输出最后一项

{cout<ceof;

}

else

if(p->exp==1)cout<ceof<<"X";

else

cout<ceof<<"X^"<exp;

}

cout<

}

voidPolynomial:

:

addtwo(link*ha,link*hb)//将两个多项式相连构成一个新的多项式,再通过排序和除去系数为0项,实现两个多项式相加

{

link*a,*b,*c;

link*p;

a=ha->next;

p=b=newlink;

while(a!

=NULL)//将A复制进多项式C

{

c=newlink;

c->ceof=a->ceof;

c->exp=a->exp;

c->next=NULL;

b->next=c;

b=b->next;

a=a->next;

}

a=hb->next;

while(a!

=NULL)//将B复制进C,接在A后面

{

c=newlink;

c->ceof=a->ceof;

c->exp=a->exp;

c->next=NULL;

b->next=c;

b=b->next;

a=a->next;

}

b=NULL;

head=p;

}

 

#include"Polynomail.h"

usingnamespacestd;

voidmain()

{

PolynomialA,B,C;

cout<<"请输入多项式A:

"<

A.creat();

A.qingling();

A.paixu();

cout<<"请输入多项式B:

"<

B.creat();

B.qingling();

B.paixu();

cout<<"多项式A为:

"<

A.shuchu();

cout<<"多项式B为:

"<

B.shuchu();

cout<<"A和B相加为:

"<

C.addtwo(A.gethead(),B.gethead());

C.paixu();

C.qingling();

C.shuchu();

}

实验二四则混合运算表达式处理

一、需求分析

1.程序的功能:

(1)以逆波兰表示输入的算术表达式;

(2)输出表达式树的各种遍历形式;

(3)打印表达式树;

(4)删除表达式树。

2.输入输出的要求:

分别输入以逆波兰表示的算术表达式。

输出为表达式树的各种遍历形式,并且输出该表达式树的树形结构。

3.测试数据:

(1)

(2)

(3)

(4)

二、概要设计

1.本程序所用的数据结构的定义:

本程序中主要用了堆栈和二叉树的数据结构,构建了两个类—栈类和二叉树类,定义如下:

classstack//栈类

{

char*stacks;

inttop;//栈顶

intsz;

public:

stack()

{

sz=max;

stacks=newchar[sz];

top=-1;

}

charstackpop();//压栈

voidstackpush(charx);//出栈

};

structbitreenode

{

chardata;

bitreenode*lchild;

bitreenode*rchild;

};

classbitree//二叉树类

{

bitreenode*root;

public:

bitreenode*getRoot()//取二叉树根节点

{

if(root!

=NULL)returnroot;

else

returnNULL;

};

bitreenode*create(stack&s);//创建二叉树

voidpreorder(bitreenode*root);//先序遍历

voidinorder(bitreenode*root);//中序遍历

voidpostorder(bitreenode*root);//后序遍历

voiddeltree(bitreenode*root,int&count);//删除二叉树

voidoutput(bitreenode*root,intspace);//输出二叉树

};

2.主程序的流程及各程序模块之间的层次关系:

主程序的具体代码如下:

intmain()

{

stacks;//栈对象

cout<<"请输入一个表达式字符串,以#结尾!

"<

chara;

inti=0,j=0,k;

cin>>a;

while(a!

='#')

{

if(a>=97&&a<=122)//判断是否为字母

{

s.stackpush('0');//字母为叶子节点,

s.stackpush('0');//用压栈前先输入两个'0'字符

s.stackpush(a);//表示左右孩子为空!

i++;

}

else

{

if(a==42||a==43||a==45||a==47)//输入为运算符,直接压栈

{

s.stackpush(a);

j++;

}

}

cin>>a;

}

if(i!

=j+1)

{

cout<<"输入表达式有误!

"<

exit

(1);

}

k=i+j;

bitreetree;//二叉树对象

tree.create(s);//创建树

cout<<"先序遍历结果为:

"<

tree.preorder(tree.getRoot());

cout<

cout<<"中序遍历结果为:

"<

tree.inorder(tree.getRoot());

cout<

cout<<"后序遍历结果为:

"<

tree.postorder(tree.getRoot());

cout<

cout<<"打印二叉树结果为:

"<

tree.output(tree.getRoot(),0);

cout<

cout<<"删除二叉树?

(Y/N)"<

charb;

cin>>b;

if(b=='Y'||b=='y')

{

tree.deltree(tree.getRoot(),k);

cout<<"二叉树已删除!

"<

}

else

{

cout<<"二叉树未删除!

"<

}

return0;

}

主程序流程如下:

三、详细设计

各模块算法如下:

1.压栈:

voidstack:

:

stackpush(charx)

{

if(top==max-1)cout<<"栈满!

"<

else

{

top++;

stacks[top]=x;//栈未满,则压栈

}

}

2.出栈:

charstack:

:

stackpop()

{

if(top==-1)//如果栈为空

{

cout<<"栈为空!

"<

return0;

}

else

{

chara;

a=stacks[top];//弹出最上面的元素

top--;

returna;

}

}

3.建立二叉树:

bitreenode*bitree:

:

create(stack&s)

{

chara;

a=s.stackpop();

if(a!

='0')

{

bitreenode*q=newbitreenode;

q->data=a;

q->rchild=create(s);//输入是逆波兰表示法,

q->lchild=create(s);//则先创建右子树,再创建左子树

root=q;

returnroot;

}

else

returnNULL;

}

4.先序遍历二叉树:

voidbitree:

:

preorder(bitreenode*root)

{

if(root!

=NULL)

{

cout<data<<"";

preorder(root->lchild);

preorder(root->rchild);

}

}

5.中序遍历二叉树:

voidbitree:

:

inorder(bitreenode*root)

{

if(root!

=NULL)

{

inorder(root->lchild);

cout<data<<"";

inorder(root->rchild);

}

}

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

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1