多项式相乘C实现.docx

上传人:b****8 文档编号:9347703 上传时间:2023-02-04 格式:DOCX 页数:19 大小:21.51KB
下载 相关 举报
多项式相乘C实现.docx_第1页
第1页 / 共19页
多项式相乘C实现.docx_第2页
第2页 / 共19页
多项式相乘C实现.docx_第3页
第3页 / 共19页
多项式相乘C实现.docx_第4页
第4页 / 共19页
多项式相乘C实现.docx_第5页
第5页 / 共19页
点击查看更多>>
下载资源
资源描述

多项式相乘C实现.docx

《多项式相乘C实现.docx》由会员分享,可在线阅读,更多相关《多项式相乘C实现.docx(19页珍藏版)》请在冰豆网上搜索。

多项式相乘C实现.docx

多项式相乘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;

}

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

当前位置:首页 > 职业教育 > 职业技术培训

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

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