冯数据结构实验.docx
《冯数据结构实验.docx》由会员分享,可在线阅读,更多相关《冯数据结构实验.docx(15页珍藏版)》请在冰豆网上搜索。
![冯数据结构实验.docx](https://file1.bdocx.com/fileroot1/2022-12/11/af6ea7d4-436b-4c7b-b338-55034a029320/af6ea7d4-436b-4c7b-b338-55034a0293201.gif)
冯数据结构实验
实验报告
课程名称:
数据结构
班级:
实验日期:
姓名:
学号:
指导教师:
实验序号:
一
实验成绩:
一、实验名称
线性表及其应用
二、实验目的及要求
1、熟悉链表的创建,链表结点查找、插入和删除;
2、理解链表用于存储线性表的优势和劣势;
3、掌握利用链表存储一元多项式的数据结构,及其运算操作。
三、实验环境
VisualC++6.0
四、实验内容
1、输入并建立多项式;
2、输出多项式,输出形式为整数序列:
n,c1,e1,c2,e2,….,cn,en,其中n是多项式的项数,ci和ei分别是第I项的系数和指数,序列按照指数降序排列;
3、多项式a和b相加,建立多项式a+b;
4、多项式a和b相减,建立多项式a-b。
五、算法描述及实验步骤
使用链表存储一元多项式c1Xe1+c2Xe2+…+cnXen如下图所示:
如何实现这种线性链表表示的多项式的加法运算?
根据一元多项式相加的运算规则:
对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄到“和”多项式中去。
实验步骤:
1、
2、
3、
六、调试过程及实验结果
七、总结
多项式系数小的
八、附录
#pragmaonce
#include
structnode
{
intexp;//指数
doublecoef;//系数
node*next;//指针域
};
classpoly
{
private:
node*head;
public:
poly();
voidin1poly();
voidin2poly(int,int[],double[]);
voiddelpoly();
voidprtpoly();
polyoperator+(poly&);
/*~poly(void);*/
};
#include"StdAfx.h"
#include"poly.h"
#include"iostream"
usingnamespacestd;
poly:
:
poly()
{
head=NULL;
return;
}
voidpoly:
:
in1poly()
{
node*p,*k;
inte;
doublec;
k=NULL;
cout<<"输入:
系数指数。
输入-1结束"<cin>>c>>e;
while(e>=0)
{
p=newnode;
p->exp=e;
p->coef=c;
p->next=NULL;
if(k==NULL)
head=p;
else
k->next=p;
k=p;
cin>>c>>e;
}
return;
}
voidpoly:
:
in2poly(intn,inte[],doublec[])
{
intk;
node*p;
for(k=n-1;k>=0;k--)
{
p=newnode;
p->coef=c[k];p->exp=e[k];
p->next=head;
head=p;
}
return;
}
voidpoly:
:
delpoly()
{
node*p,*q;
q=head;
while(q!
=NULL)
{
p=q->next;
deleteq;
q=p;
}
head=NULL;
return;
}
voidpoly:
:
prtpoly()
{
node*k;
if(head==NULL)
cout<<"空表"<k=head;
while(k!
=NULL)
{
cout<<"("<coef<<","<exp<<")"<k=k->next;
}
return;
}
polypoly:
:
operator+(poly&p2)
{
polyp;
node*k,*q,*m,*n;
inte;
doublec;
k=NULL;
m=head;
n=p2.head;
while((m!
=NULL)&&(n!
=NULL))
{
if(m->exp==n->exp)
{
c=m->coef+n->coef;
e=m->exp;
m=m->next;
n=n->next;
}
elseif(m->exp>n->exp)
{
c=n->coef;
e=n->exp;
n=n->next;
}
else
{
c=m->coef;
e=m->exp;
m=m->next;
}
if(c!
=0)
{
q=newnode;
q->exp=e;
q->coef=c;
q->next=NULL;
if(k==NULL)
p.head=q;
else
k->next=q;
k=q;
}
}
while(m!
=NULL)
{
c=m->coef;
e=m->exp;
m=m->next;
q=newnode;
q->exp=e;
q->coef=c;
q->next=NULL;
if(k==NULL)
p.head=q;
else
k->next=q;
k=q;
}
while(n!
=NULL)
{
c=n->coef;
e=n->exp;
q=newnode;
q->exp=e;
q->coef=c;
q->next=NULL;
if(k==NULL)
p.head=q;
else
k->next=q;
k=q;
}
return(p);
}
//poly:
:
~poly(void)
//{
//delete[]
//}
#include"stdafx.h"
#include"poly.h"
#include"iostream"
usingnamespacestd;
#include"cmath"
int_tmain(intargc,_TCHAR*argv[])
{
polyp1,p2,add_p;
intpe1[4]={0,1,8,17};
doublepc1[3]={7,3,9};
intpe2[3]={1,7,8};
doublepc2[3]={8,22,-9};
p1.in2poly(3,pe1,pc1);
p2.in2poly(3,pe2,pc2);
add_p=p1+p2;
cout<<"欢迎使用多项式相加程序!
"<cout<<"多项式1为:
"<p1.prtpoly();
cout<<"多项式2为:
"<p2.prtpoly();
cout<<"两多项式相加和为:
"<add_p.prtpoly();
return0;
}
邢台学院数学与信息技术学院
实验报告
课程名称:
班级:
实验日期:
姓名:
学号:
指导教师:
实验序号:
二
实验成绩:
一、实验名称
栈及其应用
二、实验目的及要求
1、熟悉栈的原理和实现方式;
2、理解使用栈消除函数递归调用的原理;
3、掌握后缀表达式计算的方法。
三、实验环境
VisualC++6.0
四、实验内容
1、栈实现阶乘函数;
2、栈实现后缀表达式的计算。
五、算法描述及实验步骤
函数调用栈的结构如下:
第n层调用
(当前函数局部变量空间)
第n-1层调用
(当前函数的主调函数变量空间)
…
第1层调用
主函数局部变量空间
函数调用的栈空间
使用栈消去递归的算法框架如下:
初始化栈;
将完整问题参数压栈;
while(栈非空)
{
取出栈顶元素所描述的问题
如果可以直接解决,则直接解决
否则分解为子问题压栈
}
后缀表达式是运算符在运算数之后的一种表达式存储的数据结构,不需要比较运算符优先级别,只需要每次读到运算数时压栈,读到运算符时将运算数出栈,将结果压栈即可。
最后的运算结果存放在栈底。
实验步骤
1、
2、
3、
六、调试过程及实验结果
七、总结
八、附录
#include"stdafx.h"
#defineSElemTypeint
classstack
{
public:
SElemType*base;
SElemType*top;
stack()
{
base=newSElemType[100];
top=base;
}
voidPush(SElemTypen)
{
*top=n;
top++;
}
SElemTypePop()
{
SElemTypee;
e=*(--top);
returne;
}
};
//实现阶乘运算
intJC(intn)
{
stacks;
intsum=1;
//将?
数簓据Y循-环·压1入?
栈?
中D
while(n)
{
s.Push(n);
n--;
}
while(s.top!
=s.base)
{
intb=s.Pop();
sum*=b;
}
returnsum;
}
//用栈实现后缀表达式
intCount(charb[])
{
stacks1;
intsum=0;
inti=0;
while(b[i]!
='\0')
{
if(b[i]!
='+'&&b[i]!
='*'&&b[i]!
='-'&&b[i]!
='/')
s1.Push(b[i]-'0');
else
{
if(b[i]=='+')
{
inta=s1.Pop();
intb=s1.Pop();
sum=a+b;
}
elseif(b[i]=='*')
{
inta=s1.Pop();
intb=s1.Pop();
sum=a*b;
}
elseif(b[i]=='-')
{
inta=s1.Pop();
intb=s1.Pop();
sum=b-a;
}
elseif(b[i]=='/')
{
inta=s1.Pop();
intb=s1.Pop();
sum=b/a;
}
s1.Push(sum);
}
i++;
}
returnsum;
}
intmain(intargc,char*argv[])
{
intm=6;
inta=JC(m);
printf("%d的阶乘计算结果为a:
阰",m);
printf("%d\n",a);
printf("\n\n");
printf("后缀表达式计算:
");
charc[10]={'5','5','5','+','*'};
intb=Count(c);
printf("%d",b);
return0;
}