线性表提高实验.docx
《线性表提高实验.docx》由会员分享,可在线阅读,更多相关《线性表提高实验.docx(17页珍藏版)》请在冰豆网上搜索。
线性表提高实验
云南大学软件学院实验报告
课程:
数据结构实验学期:
2014-2015学年第一学期任课教师:
专业:
信息安全学号:
姓名:
成绩:
实验2线性表提高实验
一、实验目的
1.掌握线性表的链式存储结构及其基本操作(以一元多项式为例)。
二、实验软硬件环境(CPU、OS、IDE):
三、实验任务(要求写出核心代码,并对运行结果截图)
1.一元多项式的表示(必做);
实验测试数据基本要求:
以指数递降的方式输入、输出多项式非零系数和指数,数字间以空格分隔。
数据1:
34,-52,61,-20(代表3x4-5x2+6x-2,下同)
数据2:
520,-74,31
实验代码:
#include
#include
typedefintdatatype;//使用typedef目的是给变量一个易记且意义明确的新名字和简化一些比较复杂的类型声明。
typedefstructpolynode{//用结构体定义结点。
datatypecoef;
datatypeexpon;
structpolynode*link;
}polynode,*polynomial;
polynode*p,*p1,*p2;//声明指针。
voidcreatepolyn()//创建链表。
{
intk,a,b,m;
p=p1=(polynode*)malloc(sizeof(polynode));//创建头结点和首元结点。
if(p==NULL||p1==NULL)exit(0);//判断新结点是否创建成功,若不成功则退出。
printf("请输入在这个多项式中共有几个项:
");
scanf("%d",&m);
printf("\n");
for(k=0;k{
p2=(polynode*)malloc(sizeof(polynode));//创建一个新结点。
if(p2==NULL)exit(0);//判断新结点是否创建成功,若不成功则退出。
printf("请输入第%d项的系数和指数(中间空格隔开):
",k+1);
scanf("%d",&a);
scanf("%d",&b);
p2->coef=a;
p2->expon=b;
p1->link=p2;
p1=p2;//结点存输入数的系数和指数的值。
}
p1->link=NULL;//尾结点的指针域为空。
printf("\n");
}
intprintpolyn()//定义输出函数。
{
intj,k;
p1=p;
printf("输出这个多项式(请输入在这个多项式中共有几个项):
");
scanf("%d",&j);
printf("\n");
for(k=0;k{
p1=p1->link;
printf("输出的第%d项的系数和指数分别为:
",k+1);
printf("%d%d",p1->coef,p1->expon);
printf("\n");
}
}
intmain()
{
createpolyn();//创建链表函数的调用。
printpolyn();//输出函数的调用。
printf("\n");
return0;
}
程序运行结果截图:
2.一元多项式的加法(必做);
实验测试数据基本要求:
实验代码:
#include
#include
typedefintdatatype;//使用typedef目的是给变量一个易记且意义明确的新名字和简化一些比较复杂的类型声明。
typedefstructpolynode{//用结构体定义结点。
datatypecoef;
datatypeexpon;
structpolynode*link;
}polynode,*polynomial;
polynode*p,*p1,*p2,*p3,*p4,*q,*q1,*q2,*q3;//声明指针。
voidcreatepolyn1()//创建链表1。
{
intk,a,b,m;
p1=p=(polynode*)malloc(sizeof(polynode));//创建头结点和首元结点。
if(p==NULL||p1==NULL)exit(0);//判断新结点是否创建成功,若不成功则退出。
printf("请输入在这个多项式中共有几个项:
");
scanf("%d",&m);
printf("\n");
for(k=0;k{
p2=(polynode*)malloc(sizeof(polynode));//创建一个新结点。
if(p2==NULL)exit(0);//判断新结点是否创建成功,若不成功则退出。
printf("请输入第%d项的系数和指数(中间空格隔开):
",k+1);
scanf("%d",&a);
scanf("%d",&b);
p2->coef=a;
p2->expon=b;
p1->link=p2;
p1=p2;//结点存输入数的系数和指数的值。
}printf("\n");
p1->link=NULL;//尾结点的指针域为空。
}
voidcreatepolyn2()//创建链表2,同链表1。
{
intk,a,b,m;
q=q1=(polynode*)malloc(sizeof(polynode));
printf("请输入在这个多项式中共有几个项:
");
scanf("%d",&m);
printf("\n");
for(k=0;k{
q2=(polynode*)malloc(sizeof(polynode));
printf("请输入第%d项的系数和指数(中间空格隔开):
",k+1);
scanf("%d",&a);
scanf("%d",&b);
q2->coef=a;
q2->expon=b;
q1->link=q2;
q1=q2;
}printf("\n");
q1->link=NULL;
}
voidaddpolyn()//定义两个多项式相加函数。
{
p3=p;//初始化指针。
p1=p;
q1=q;
p1=p1->link;
q1=q1->link;
while(p1!
=NULL&&q1!
=NULL)//循环条件是当P1,q1两个结点都不为空时,就执行循环体。
{
if((p1->expon)==(q1->expon))//两个指数相等时就把系数相加,指数不变,用p3指向这个结点。
{
(p1->coef)=(p1->coef)+(q1->coef);
p1->expon=p1->expon;
p3->link=p1;
p3=p3->link;
p1=p1->link;
q1=q1->link;
}
elseif((p1->expon)>(q1->expon))//p1指数大于q1时,p3指向p1,p1指向后一个结点。
{
p3->link=q1;
p3=p3->link;
q1=q1->link;
}
elseif((p1->expon)<(q1->expon))//p1的指数小于q1时,p3指向q1,q1指向后一个结点。
{
p3->link=p1;
p3=p3->link;
p1=p1->link;
}
}
while(p1==NULL&&q1!
=NULL)//当p1为空,q1不为空时,p3指向q1,q1后移直到为空时。
{
p3->link=q1;
p3=q1;
q1=q1->link;
}
while(p1!
=NULL&&q1==NULL)//当q1为空,p1不为空时,p3指向p1,p1后移直到为空时。
{
p3->link=p1;
p3=p1;
p1=p1->link;
}
p3->link=NULL;//尾结点的指针域为空。
}
intprintpolyn()//定义输出函数。
{
intj,k;
p3=p;//p3初始化为头指针。
printf("输出相加后多项式的系数和指数:
\n");
while(p3->link!
=NULL)//判断结点不为空时输出该结点存的系数和指数
{
p3=p3->link;
printf("%d%d",p3->coef,p3->expon);
printf("\n");
}
}
intmain()//主函数以及各个函数的调用。
{
createpolyn1();
createpolyn2();
addpolyn();
printpolyn();
printf("\n");
return0;
}
实验截图:
3.一元多项式求导(选做);
实验测试数据基本要求:
自己设计数据。
实验代码:
#include
#include
typedefintdatatype;//使用typedef目的是给变量一个易记且意义明确的新名字和简化一些比较复杂的类型声明。
typedefstructpolynode{//用结构体定义结点。
datatypecoef;
datatypeexpon;
structpolynode*link;
}polynode,*polynomial;
polynode*p,*p1,*p2,*p3;//声明指针。
voidcreatepolyn()//创建链表。
{
intk,a,b,m;
p=p1=(polynode*)malloc(sizeof(polynode));//创建头结点和首元结点。
if(p==NULL||p1==NULL)exit(0);//判断新结点是否创建成功,若不成功则退出。
printf("请输入在这个多项式中共有几个项:
");
scanf("%d",&m);
for(k=0;k{
p2=(polynode*)malloc(sizeof(polynode));//创建一个新结点。
if(p2==NULL)exit(0);//判断新结点是否创建成功,若不成功则退出。
printf("请输入第%d项的系数和指数(中间空格隔开):
",k+1);
scanf("%d",&a);
scanf("%d",&b);
p2->coef=a;
p2->expon=b;
p1->link=p2;
p1=p2;//结点存输入数的系数和指数的值。
}
p1->link=NULL;//尾结点的指针域为空。
}
voidderivationpolyn()//定义求导函数。
{
p3=p1=p;
p1=p1->link;
while(p1!
=NULL)//该结点不为空时执行循环体。
{
if(p1->expon==0)//如果指数为0,则跳过这一个结点并释放这一个结点。
{
p3->link=p1->link;
p3=p;
p2=p1;
p1=p1->link;
free(p2);
}
if(p1->expon!
=0)//如果指数不为0,则指数乘以系数存在p3的系数域,指数减一存在p3的指数域。
{
p1->coef=(p1->coef)*(p1->expon);
p1->expon=p1->expon-1;
p3->link=p1;
p3=p1;
p1=p1->link;
}
}
p3->link=NULL;
}
intprintpolyn()//定义输出函数。
{
p3=p;//p3初始化为头指针。
printf("输出求导后多项式的系数和指数:
\n");
while(p3->link!
=NULL)//判断结点不为空时输出该结点存的系数和指数
{
p3=p3->link;
printf("%d%d",p3->coef,p3->expon);
printf("\n");
}
}
intmain()//主函数以及各个函数的调用。
{
createpolyn();
derivationpolyn();
printpolyn();
printf("\n");
return0;
}
实验截图:
4.两个一元多项式的乘法(选做);
实验测试数据基本要求:
自己设计数据。
实验代码:
#include
#include
typedefintdatatype;//使用typedef目的是给变量一个易记且意义明确的新名字和简化一些比较复杂的类型声明。
typedefstructpolynode{//用结构体定义结点。
datatypecoef;
datatypeexpon;
structpolynode*link;
}polynode,*polynomial;
polynode*p,*p1,*p2,*p3,*p4,*p5,*q,*q1,*q2,*q3;//声明指针。
voidcreatepolyn1()//创建链表1。
{
intk,a,b,m;
p=p1=(polynode*)malloc(sizeof(polynode));//创建头结点和首元结点。
if(p==NULL||p1==NULL)exit(0);//判断新结点是否创建成功,若不成功则退出。
printf("请输入在乘数这个多项式中共有几个项:
");
scanf("%d",&m);
printf("\n");
for(k=0;k{
p2=(polynode*)malloc(sizeof(polynode));//创建一个新结点。
if(p2==NULL)exit(0);//判断新结点是否创建成功,若不成功则退出。
printf("请输入第%d项的系数和指数(中间空格隔开):
",k+1);
scanf("%d",&a);
scanf("%d",&b);
p2->coef=a;
p2->expon=b;
p1->link=p2;
p1=p2;//结点存输入数的系数和指数的值。
}
p1->link=NULL;//尾结点的指针域为空。
printf("\n");
}
voidcreatepolyn2()//创建链表2。
{
intk,a,b,m;
q=q1=(polynode*)malloc(sizeof(polynode));
if(q==NULL||q1==NULL)exit(0);
printf("请输入在被乘数这个多项式中共有几个项:
");
scanf("%d",&m);
printf("\n");
for(k=0;k{
q2=(polynode*)malloc(sizeof(polynode));
if(q2==NULL)exit(0);
printf("请输入第%d项的系数和指数(中间空格隔开):
",k+1);
scanf("%d",&a);
scanf("%d",&b);
q2->coef=a;
q2->expon=b;
q1->link=q2;
q1=q2;
}
q1->link=NULL;
printf("\n");
}
voidmultipolyn()//定义两个多项式相乘函数。
{
p3=p4=(polynode*)malloc(sizeof(polynode));
if(p3==NULL||p4==NULL)exit(0);
p1=p;
p1=p1->link;
while(p1!
=NULL)//p1结点不为空时。
{
q1=q;
while(q1->link!
=NULL)//q1结点的后一个不为空时。
{
q1=q1->link;
p5=(polynode*)malloc(sizeof(polynode));//申请一个新的结点来存放相乘结果。
if(p5==NULL)exit(0);
p5->coef=(p1->coef)*(q1->coef);
p5->expon=(p1->expon)+(q1->expon);
p3->link=p5;
p3=p5;
}
p1=p1->link;
}
p3->link=NULL;
}
voidadjust()//调整乘积多项式的相同指数的合并,并指数从小到大输出。
{
p3=p4;//初始化指针。
p3=p3->link;
while(p3->link!
=NULL)//首元结点不为空时执行循环体。
{
p1=p3->link;//p1为首元结点的后一个结点。
while(p1!
=NULL)
{
if(p1->exponexpon)//p1的指数小于p3时,将p1与p3互换位置。
{
p2->coef=p1->coef;
p2->expon=p1->expon;
p1->coef=p3->coef;
p1->expon=p3->expon;
p3->coef=p2->coef;
p3->expon=p2->expon;
q=p1;
p1=p1->link;
}
elseif(p1->expon>p3->expon)//p1的指数大于p3时,p1直接指向下一个结点。
{
q=p1;
p1=p1->link;
}
elseif(p1->expon==p3->expon)//两个指数相等时,指数相加存在p3里,并跳过结点p1。
{
p3->coef=p1->coef+p3->coef;
p3->expon=p3->expon;
p5=p1;//用于释放结点。
q->link=p1->link;
q=p1;//q指向p1结点,用于以后跳过结点。
p1=p1->link;
free(p5);
}
}
p3=p3->link;//p3指向后一个结点。
}p3->link=NULL;
}
voidprintpolyn()//定义输出函数。
{
p3=p4;//p3初始化为头指针。
p3=p4->link;
printf("输出相乘后结果多项式的系数和指数:
\n");
while(p3!
=NULL)//判断结点不为空时输出该结点存的系数和指数
{
printf("%d%d",p3->coef,p3->expon);
p3=p3->link;
printf("\n");
}
}
intmain()//主函数以及各个函数的调用。
{
createpolyn1();
createpolyn2();
multipolyn();
adjust();
printpolyn();
printf("\n");
return0;
}
实验截图:
测试数据可以为任意数据。
四、实验总结与收获
●本次实验中,学会了不少,在多项式的加法上花了好久的时间,最开始是写好了程序,但是在输入数据的时候有时候是对的,有时候又突然中断,找了很多原因,修改了很多次,后来才发现是少写了两个else,以后一定记住else在if语句中的重要性。
●大一写C语言程序的时候出现的情况就是错误很多,一步一步地去跟着提示寻找还能发现哪儿错了,现在写程序就是错误为0,但是在输入数据进去后既不执行也不退出,或者直接退出,都是逻辑上的错误,需要细心一点去一步一步检查程序。
●本次实验中,学会了对线性链表的运用,可以用来计算多项式,学会了怎样运用线性链表进行多多项式的四则运算,对线性链表的了解进步加深。
●这次实验学会了怎样设置断点并调试程序,怎样一步一步去检查哪句出了问题,以后的实验一定要多注意逻辑问题。
●开始第四个实验多项式的乘法没注意到结果有的多项式没有合并,而且没有按照指数从小到大输出,然后修改建立了一个adjust函数才得以实现。