线性表提高实验Word文档格式.docx
- 文档编号:16977252
- 上传时间:2022-11-27
- 格式:DOCX
- 页数:17
- 大小:244.02KB
线性表提高实验Word文档格式.docx
《线性表提高实验Word文档格式.docx》由会员分享,可在线阅读,更多相关《线性表提高实验Word文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
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);
\n"
for(k=0;
k<
m;
k++)
{
p2=(polynode*)malloc(sizeof(polynode));
//创建一个新结点。
if(p2==NULL)exit(0);
//判断新结点是否创建成功,若不成功则退出。
请输入第%d项的系数和指数(中间空格隔开):
k+1);
scanf("
a);
b);
p2->
coef=a;
expon=b;
p1->
link=p2;
p1=p2;
//结点存输入数的系数和指数的值。
}
p1->
link=NULL;
//尾结点的指针域为空。
}
intprintpolyn()//定义输出函数。
intj,k;
p1=p;
printf("
输出这个多项式(请输入在这个多项式中共有几个项):
j);
for(k=0;
j;
{
p1=p1->
link;
输出的第%d项的系数和指数分别为:
"
%d%d"
p1->
coef,p1->
expon);
printf("
}
intmain()
createpolyn();
//创建链表函数的调用。
printpolyn();
//输出函数的调用。
printf("
return0;
程序运行结果截图:
2.一元多项式的加法(必做);
polynode*p,*p1,*p2,*p3,*p4,*q,*q1,*q2,*q3;
voidcreatepolyn1()//创建链表1。
p1=p=(polynode*)malloc(sizeof(polynode));
//创建头结点和首元结点。
if(p2==NULL)exit(0);
}printf("
voidcreatepolyn2()//创建链表2,同链表1。
q=q1=(polynode*)malloc(sizeof(polynode));
q2=(polynode*)malloc(sizeof(polynode));
q2->
q1->
link=q2;
q1=q2;
q1->
voidaddpolyn()//定义两个多项式相加函数。
p3=p;
//初始化指针。
q1=q;
p1=p1->
q1=q1->
while(p1!
=NULL&
&
q1!
=NULL)//循环条件是当P1,q1两个结点都不为空时,就执行循环体。
if((p1->
expon)==(q1->
expon))//两个指数相等时就把系数相加,指数不变,用p3指向这个结点。
{
(p1->
coef)=(p1->
coef)+(q1->
coef);
expon=p1->
expon;
p3->
link=p1;
p3=p3->
p1=p1->
q1=q1->
}
elseif((p1->
expon)>
(q1->
expon))//p1指数大于q1时,p3指向p1,p1指向后一个结点。
link=q1;
}
expon)<
expon))//p1的指数小于q1时,p3指向q1,q1指向后一个结点。
while(p1==NULL&
=NULL)//当p1为空,q1不为空时,p3指向q1,q1后移直到为空时。
{
p3->
p3=q1;
q1==NULL)//当q1为空,p1不为空时,p3指向p1,p1后移直到为空时。
p3=p1;
p3->
//p3初始化为头指针。
输出相加后多项式的系数和指数:
while(p3->
link!
=NULL)//判断结点不为空时输出该结点存的系数和指数
p3=p3->
%d%d"
p3->
coef,p3->
intmain()//主函数以及各个函数的调用。
createpolyn1();
createpolyn2();
addpolyn();
实验截图:
3.一元多项式求导(选做);
自己设计数据。
//使用typedef目的是给变量一个易记且意义明确的新名字和简化一些比较复杂的类型声明。
polynode*p,*p1,*p2,*p3;
voidderivationpolyn()//定义求导函数。
p3=p1=p;
while(p1!
=NULL)//该结点不为空时执行循环体。
{
if(p1->
expon==0)//如果指数为0,则跳过这一个结点并释放这一个结点。
link=p1->
p3=p;
p2=p1;
free(p2);
}
expon!
=0)//如果指数不为0,则指数乘以系数存在p3的系数域,指数减一存在p3的指数域。
p1->
coef=(p1->
coef)*(p1->
expon-1;
输出求导后多项式的系数和指数:
derivationpolyn();
4.两个一元多项式的乘法(选做);
实验测试数据基本要求:
polynode*p,*p1,*p2,*p3,*p4,*p5,*q,*q1,*q2,*q3;
//声明指针。
请输入在乘数这个多项式中共有几个项:
voidcreatepolyn2()//创建链表2。
if(q==NULL||q1==NULL)exit(0);
请输入在被乘数这个多项式中共有几个项:
if(q2==NULL)exit(0);
voidmultipolyn()//定义两个多项式相乘函数。
p3=p4=(polynode*)malloc(sizeof(polynode));
if(p3==NULL||p4==NULL)exit(0);
=NULL)//p1结点不为空时。
while(q1->
=NULL)//q1结点的后一个不为空时。
p5=(polynode*)malloc(sizeof(polynode));
//申请一个新的结点来存放相乘结果。
if(p5==NULL)exit(0);
p5->
coef)*(q1->
expon=(p1->
expon)+(q1->
link=p5;
p3=p5;
voidadjust()//调整乘积多项式的相同指数的合并,并指数从小到大输出。
p3=p4;
p3=p3->
=NULL)//首元结点不为空时执行循环体。
p1=p3->
//p1为首元结点的后一个结点。
while(p1!
=NULL)
if(p1->
expon<
expon)//p1的指数小于p3时,将p1与p3互换位置。
{
coef=p1->
coef;
coef=p3->
expon=p3->
p3->
coef=p2->
expon=p2->
q=p1;
elseif(p1->
expon>
expon)//p1的指数大于p3时,p1直接指向下一个结点。
}
expon==p3->
expon)//两个指数相等时,指数相加存在p3里,并跳过结点p1。
coef+p3->
p5=p1;
//用于释放结点。
q->
//q指向p1结点,用于以后跳过结点。
free(p5);
}
}
//p3指向后一个结点。
}p3->
}
voidprintpolyn()//定义输出函数。
p3=p4->
输出相乘后结果多项式的系数和指数:
while(p3!
}
multipolyn();
adjust();
测试数据可以为任意数据。
四、实验总结与收获
●本次实验中,学会了不少,在多项式的加法上花了好久的时间,最开始是写好了程序,但是在输入数据的时候有时候是对的,有时候又突然中断,找了很多原因,修改了很多次,后来才发现是少写了两个else,以后一定记住else在if语句中的重要性。
●大一写C语言程序的时候出现的情况就是错误很多,一步一步地去跟着提示寻找还能发现哪儿错了,现在写程序就是错误为0,但是在输入数据进去后既不执行也不退出,或者直接退出,都是逻辑上的错误,需要细心一点去一步一步检查程序。
●本次实验中,学会了对线性链表的运用,可以用来计算多项式,学会了怎样运用线性链表进行多多项式的四则运算,对线性链表的了解进步加深。
●这次实验学会了怎样设置断点并调试程序,怎样一步一步去检查哪句出了问题,以后的实验一定要多注意逻辑问题。
●开始第四个实验多项式的乘法没注意到结果有的多项式没有合并,而且没有按照指数从小到大输出,然后修改建立了一个adjust函数才得以实现。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 线性 提高 实验