多项式相乘C实现.docx
《多项式相乘C实现.docx》由会员分享,可在线阅读,更多相关《多项式相乘C实现.docx(19页珍藏版)》请在冰豆网上搜索。
多项式相乘C实现
西安邮电大学
数据结构设计报告
题目:
多项式相乘
计算机学院院系名称:
软件工程专业名称:
级:
班
学生姓名:
学号(8位):
指导教师:
设计起止时间:
一.设计目的
以动态单链表为存储结构,使用排序等操作实现多项式的乘法运算
二.设计内容
用一个单链表来表示一个一元多项式;
在创建多项式的过程中,可以按指数的任意顺序输入,并且可在同一多项式中输入指数相同的多个项;
同要求输出的多项式按指数升序排列,在进行乘法操作之前,输出参与操作的两个多项式。
指数的多项合并,项数的正负号显示合理。
对已排序且合并了同指数项的两个多项式实现乘法操作,并输出结果;结果多项式要求以动态链表为存储结构,复用原多项式的结点空间;输出结果多项式要求按指数升序排列,同指数的多项要合并,项数的正负号要求显示合理。
三.概要设计
1.功能模块图;
主函数main()
创建多项式LA=creat()
创建多项式LB=creat()
排调用Polysort()序
调用print()输出LA对多项式LA,LB相乘LC=
调用Polysort()排序Polymul(LA,LB)
调用print()输出LB
调用Polysort()排序
调用print()输出LC
2.各个模块详细的功能描述。
多项式链表升序排序函数
PolylistPolysort(Polylisthead)
根据幂次的高低排序的同时并合同类项,幂次相同的系数相加存入前项,释放合并项中后者空间,若系数相加和为0则释放两项空间。
多项式创建函数
Polylistcreat()
多项式相乘函数
PolylistPolymul(PolylistLA,PolylistLB)
输出函数
voidprint(Polylisthead)
分三种情况:
系数输出、符号输出、指数输出
四.详细设计
1.各功能函数的数据流程图
Polysort()开始
YNp->exp==move->exp
Ny
y
p->coef+=move->cy
p;p->cy
2.重点设计及编码
head==NULLfirst=p->next;p->next=NULL;move=first;
p->exp==move->expove->next=next=move;mhead->
=NULLp->next=head->next=move;move->next=p;
oef;free(move);oef==0
q->next=p->next;free(p);
q=p;p=p->next;While
(1)
p=head->next;q=head;move=first;
returnhead
结束
(1)多项式链表升序排序函数
PolylistPolysort(Polylisthead)
{
Polynode*first,*move,*p,*q;//first移动指针move被移动项指针p,q临时指针
q=head;
p=head->next;
if(p==NULL)returnhead;//判断链表是否为空;
first=p->next;
p->next=NULL;
move=first;
while(move!
=NULL)//直接插入排序(链表排序)
{
first=first->next;
if(p->exp==move->exp)//判断待插入项指数是否与首项相等;
{
p->coef+=move->coef;//系数相加;
free(move);//释放空间;
if(p->coef==0)//若系数相加和为0;
{
q->next=p->next;
free(p);//释放空间;
}
}
elseif(p->exp>move->exp)//判断待插入项指数是否大于第一个项的指数;
{
head->next=move;
move->next=p;
}
elseif(p->next==NULL)//判断下一项是否为空;
{
p->next=move;
move->next=NULL;
}
else//待插入项指数插入位置在首末项之间;
{
q=p;//移动临时变量指针p,q
p=p->next;
while
(1)
{
if(p->exp==move->exp)//判断待插入项指数是否与首项相等;
{
p->coef+=move->coef;//系数相加;
free(move);//释放空间;
if(p->coef==0)
{
q->next=p->next;//若系数相加和为0;
free(p);//释放空间;
}
break;
}
if(p->exp>move->exp)//判断待插入项指数是否大于当前项的指数;
{
q->next=move;
move->next=p;
break;
}
if(p->next==NULL)//判断下一项是否为空;
{
p->next=move;
move->next=NULL;
break;
}
q=p;//移动临时变量指针p,q;
p=p->next;
}
}
p=head->next;//使p,q指针重新指到初始化位置;
q=head;
move=first;
}
returnhead;//返回头结点;
}
(2)多项式创建函数
Polylistcreat()
{
Polynode*head,*p,*newnode;//head:
头指针newnode:
新结点指针p:
临时指针变量
intc,e;//ceof(系数)和exp(指数);
head=(Polynode*)malloc(sizeof(Polynode));//开辟一个新结点,并使之成为头结点;
p=head;
printf(\
\t请输入多项式中元素的系数和指数:
\n);
scanf(%d%d,&c,&e);
;0(指数)不全为exp(系数)和//ceofwhile(c||e)
{
if(c==0)
{scanf(%d%d,&c,&e);continue;}//若c为0,不开辟新结点;
newnode=(Polynode*)malloc(sizeof(Polynode));//开辟一个新结点;
newnode->coef=c;
newnode->exp=e;
p->next=newnode;
p=newnode;
scanf(%d%d,&c,&e);//输入新结点的系数和指数;
}
p->next=NULL;//为最后的结点的next赋空;
head=Polysort(head);//调用Polysort排序函数对多项式链表进行降序排序;
returnhead;//返回头结点;
}
(3)多项式相乘函数
PolylistPolymul(PolylistLA,PolylistLB)
{
Polynode*head,*p,*q,*t,*newnode;//head:
头指针newnode:
新结点指针p,q,t:
临时指针变量;
p=LA->next;
q=LB->next;
head=(Polynode*)malloc(sizeof(Polynode));//开辟一个新结点,并使之成为新链表的头结点;
t=head;
while(p!
=NULL)
{
while(q!
=NULL)
{
newnode=(Polynode*)malloc(sizeof(Polynode));//开辟一个新结点;
t->next=newnode;
t=t->next;
t->coef=p->coef*q->coef;//项之系数为LA,LB两项系数之积;
t->exp=p->exp+q->exp;//项之指数为LA,LB两项指数之和;
q=q->next;
}
p=p->next;//p指针移动;
q=LB->next;//q指针复位为LB->next;
}
t->next=NULL;//为最后的结点的next赋空;
head=Polysort(head);//调用Polysort排序函数对多项式链表进行降序排序;
returnhead;//返回头结点;
}
(4)输出函数
voidprint(Polylisthead)
{
Polynode*p;
p=head->next;
if(p==NULL)
printf(
else
while(p!
=NULL)
{
//系数输出
if(p->coef==-1)
printf(-);
elseif(p->coef!
=1)
printf(%d,p->coef);
//符号输出
if(p->exp!
=0&&p->exp!
=1)
printf(X^);
elseif(p->exp==1)
printf(X);
//指数输出
if(p->exp==0&&(p->coef==-1||p->coef==1))
printf();
if(p->exp<0)
printf((%d),p->exp);
elseif(p->exp!
=1&&p->exp!
=0)
printf(%d,p->exp);
p=p->next;
if(p!
=NULL&&p->coef>0)
printf(+);
}
printf(\
);
}
五.测试数据及运行结果
1.正常测试数据和运行结果
.异常测试数据及运行结果2如输入的字符不是数字,则无法处理,
如:
a2程序无法继续运行
六.调试情况,设计技巧及体会
1.改进方案
多项式相成这个程序缺少对异常的处理,如果用户输入一些异常的字符程序将无法继续运行,甚至导致死机。
改进:
加入异常处理,将各种用户可能的输入都包含在内。
2.体会
心得体会:
此程序是使用链表完成的,一直以来比较习惯用顺序表,通过这个程序加深了对链表的理解。
程序的排序部分较为复杂,根据幂次的高低排序的同时并合了同类项,幂次相同的系数相加存入前项,释放合并项中后者空间,若系数相加和为0则释放两项空间。
其实想这段算法时很容易,真正实现却是相当不容易,可能是平时写的代码太少,真正把思想转换成代码困难还是比较大。
.
七.参考文献
《C语言程序设计》王曙燕主编科学出版社
《数据结构——C语言描述》耿国华高等教育出版社
《数据结构》严蔚敏清华大学出版社
八.附录:
#include
#include
#include
typedefstructPolynode
{
intcoef;//系数
intexp;//指数
structPolynode*next;
}Polynode,*Polylist;
//多项式链表升序排序
PolylistPolysort(Polylisthead)
{
Polynode*first,*move,*p,*q;//first移动指针变量move被移动项指针变量p,q临时指针变量
q=head;
p=head->next;
if(p==NULL)returnhead;//判断链表是否为空;
first=p->next;
p->next=NULL;
move=first;
while(move!
=NULL)//直接插入排序(链表排序)
{
first=first->next;
if(p->exp==move->exp)//判断待插入项指数是否与首项相等;
{
p->coef+=move->coef;//系数相加;
free(move);//释放空间;
if(p->coef==0)//若系数相加和为0;
{
q->next=p->next;
free(p);//释放空间;
}
}
elseif(p->exp>move->exp)//判断待插入项指数是否大于第一个项的指数;
{
head->next=move;
move->next=p;
}
elseif(p->next==NULL)//判断下一项是否为空;
{
p->next=move;
move->next=NULL;
}
else//待插入项指数插入位置在首末项之间;
{
q=p;//移动临时变量指针p,q
p=p->next;
while
(1)
{
if(p->exp==move->exp)//判断待插入项指数是否与首项相等;
{
p->coef+=move->coef;//系数相加;
free(move);//释放空间;
if(p->coef==0)
{
q->next=p->next;//若系数相加和为0;
free(p);//释放空间;
}
break;
}
if(p->exp>move->exp)//判断待插入项指数是否大于当前项的指数;
{
q->next=move;
move->next=p;
break;
}
if(p->next==NULL)//判断下一项是否为空;
{
p->next=move;
move->next=NULL;
break;
}
q=p;//移动临时变量指针p,q;
p=p->next;
}
}
p=head->next;//使p,q指针重新指到初始化位置;
q=head;
move=first;
}
returnhead;//返回头结点;
}
//多项式创建(头插法)
Polylistcreat()
{
Polynode*head,*p,*newnode;//head:
头指针newnode:
新结点指针p:
临时指针变量
intc,e;//ceof(系数)和exp(指数);
head=(Polynode*)malloc(sizeof(Polynode));//开辟一个新结点,并使之成为头结点;
p=head;
printf(\
\t请输入多项式中元素的系数和指数:
\n);
scanf(%d%d,&c,&e);
while(c||e)//ceof(系数)和exp(指数)不全为0;
{
if(c==0)
{scanf(%d%d,&c,&e);continue;}//若c为0,不开辟新结点;
newnode=(Polynode*)malloc(sizeof(Polynode));//开辟一个新结点;
newnode->coef=c;
newnode->exp=e;
p->next=newnode;
p=newnode;
scanf(%d%d,&c,&e);//输入新结点的系数和指数;
}
p->next=NULL;//为最后的结点的next赋空;
head=Polysort(head);//调用Polysort排序函数对多项式链表进行降序排序;
returnhead;//返回头结点;
}
//多项式相乘
PolylistPolymul(PolylistLA,PolylistLB)
{
Polynode*head,*p,*q,*t,*newnode;//head:
头指针newnode:
新结点指针p,q,t:
临时指针变量;
p=LA->next;
q=LB->next;
head=(Polynode*)malloc(sizeof(Polynode));//开辟一个新结点,并使之成为新链表的头结点;
t=head;
while(p!
=NULL)
{
while(q!
=NULL)
{
newnode=(Polynode*)malloc(sizeof(Polynode));//开辟一个新结点;
t->next=newnode;
t=t->next;
t->coef=p->coef*q->coef;//项之系数为LA,LB两项系数之积;
t->exp=p->exp+q->exp;//项之指数为LA,LB两项指数之和;
q=q->next;
}
p=p->next;//p指针移动;
q=LB->next;//q指针复位为LB->next;
}
t->next=NULL;//为最后的结点的next赋空;
head=Polysort(head);//调用Polysort排序函数对多项式链表进行降序排序;
returnhead;//返回头结点;
}
//输出函数
voidprint(Polylisthead)
{
Polynode*p;
p=head->next;
if(p==NULL)
printf(
else
while(p!
=NULL)
{
//系数输出
if(p->coef==-1)
printf(-);
elseif(p->coef!
=1)
printf(%d,p->coef);
//符号输出
if(p->exp!
=0&&p->exp!
=1)
printf(X^);
elseif(p->exp==1)
printf(X);
//指数输出
if(p->exp==0&&(p->coef==-1||p->coef==1))
printf();
if(p->exp<0)
printf((%d),p->exp);
elseif(p->exp!
=1&&p->exp!
=0)
printf(%d,p->exp);
p=p->next;
if(p!
=NULL&&p->coef>0)
printf(+);
}
printf(\
);
}
voidmain()
{
PolylistLA,LB,LC;
printf(\\t\t请输入一元多项式A:
\n);
printf(\请输入一元多项式A:
\n);
LA=creat();//创建多项式LA;
print(LA);//输出多项式LA;
printf(\请输入一元多项式B:
\n);
LB=creat();//创建多项式LB;
print(LB);//输出多项式LB;
LC=Polymul(LA,LB);//对多项式LA,LB相乘;
牰湩晴尨两多项式相乘结果LC:
);
print(LC);//输出多项式LC;
}