p=(Polyn)malloc(sizeof(structPolynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:
",i+1);
scanf("%f%d",&p->coef,&p->expn);
Insert(p,head);//调用Insert函数插入结点}
returnhead;
}//CreatePolyn
2.voidInsert(Polynp,Polynh)该函数具有两个参数,用来实现链表的顺序排列和合并相同的项。
以下是实现插入的关键代码:
voidInsert(Polynp,Polynh){
if(p->coef==0)free(p);//系数为0的话释放结点
else{//如果系数不为0
Polynq1,q2;
q1=h;q2=h->next;
while(q2&&p->expnexpn){//查找插入位置
q1=q2;
q2=q2->next;}
if(q2&&p->expn==q2->expn){//将指数相同相合并
q2->coef+=p->coef;
free(p);
if(!
q2->coef){//系数为0的话释放结点
q1->next=q2->next;
free(q2);}
}
else{//指数为新时将结点插入
p->next=q2;
q1->next=p;
}
}
}//Insert
3.PolynAddPolyn(Polynpa,Polynpb)该函数有两个参数,其类型均为polyn,分别表示要相加的两个不同的多项式。
其计算的结果存放在新建的pc所指向的链表中。
函数中调用了intpare(Polyna,Polynb)的结果。
下面是实现加法的关键代码:
PolynAddPolyn(Polynpa,Polynpb){//求解并建立多项式a+b,返回其头指针
Polynqa=pa->next;
Polynqb=pb->next;
Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb){
qc=(Polyn)malloc(sizeof(structPolynomial));
switch(pare(qa,qb)){
case1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case-1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}//switch
if(qc->coef!
=0){
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
elsefree(qc);//当相加系数为0时,释放该结点
}//while
returnheadc;
}//AddPolyn
intpare(Polyna,Polynb){
if(a&&b){
if(!
b||a->expn>b->expn)return1;
elseif(!
a||a->expnexpn)return-1;
elsereturn0;
}
elseif(!
a&&b)return-1;//a多项式已空,但b多项式非空
elsereturn1;//b多项式已空,但a多项式非空
}//pare
4.PolynMultiplyPolyn(Polynpa,Polynpb)该函数同加法一样,拥有相同的参数并且同样将新建立的链表pf的指针返回,用来实现输出乘法结果。
下面给出关键代码:
PolynMultiplyPolyn(Polynpa,Polynpb){
Polynhf,pf;
Polynqa=pa->next;
Polynqb=pb->next;
hf=(Polyn)malloc(sizeof(structPolynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next){
for(qb=pb->next;qb;qb=qb->next){
pf=(Polyn)malloc(sizeof(structPolynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
returnhf;
}//MultiplyPolyn
5. 其它函数的介绍请参见附录中详细代码.
5调试及运行结果
该程序在VC6.0中调试通过,没有错误和警告,运行结果经过检验为正确。
以下图5-1即为该程序运行结果效果图。
图中采用的是计算多项式4x^5+2x^2+3x和x^10+7x^2的加减乘三种运算进行演示:
输入两个多项式的每一项值
提示功能选择
进行三则运算的结果
图5-1
6收获和体会
通过这次课程设计练习,使我更深刻地理解了C语言的精髓-----指针的使用。
完成整个程序设计有,对指针掌握的更加熟练。
同时通过直接对链表的操作,加深了对数据结构的理解和认识。
并在完成课程设计的过程作主动查阅了相关资料,学到了不少课本上没有的技术知识。
经过这次课程设计,我深刻认识到算法在程序设计中的重要性,一个完整的程序总是由若干个函数构成的,这些相应的函数体现了算法的基本思想。
编程是一件枯燥乏味工作,但是只要认真专研,我们会从中学到很多在课本上学不到或者无法在课堂上掌握的知识,同时也能从中感受到编程的乐趣。
兴趣是可以培养的,只要坚持下去,面对困难我们总能够找到解决问题的方法。
计算多项式的加、减、乘法运算-----该程序虽然不是很大,这次还是由几位同学合作才完成这一任务。
在这个小组中我是组长,通过分工与合作,使我充分认识到在项目团队开发过程中合作的重要性,也更加理解了沟通协作能力在软件开发行业中的重要性。
另外也需要提出的是在这次程序设计的过程中,非常感谢老师对我们的耐心指导。
老师在教学过程中表现出来的对学术专研一丝不苟的精神让我非常有收获。
同样也是老师的严格要求才使得小组成员能够顺利的完成任务。
附录
#include
#include
/******************************************************/
typedefstructPolynomial{
floatcoef;//系数
intexpn;//指数
structPolynomial*next;//指向下一个结点
}*Polyn,Polynomial;//Polyn为结点指针类型
/**********************************************************/
voidInsert(Polynp,Polynh){
if(p->coef==0)free(p);//系数为0的话释放结点
else{//如果系数不为0
Polynq1,q2;
q1=h;q2=h->next;
while(q2&&p->expnexpn){//查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn){//将指数相同相合并
q2->coef+=p->coef;
free(p);
if(!
q2->coef){//系数为0的话释放结点
q1->next=q2->next;
free(q2);
}
}
else{//指数为新时将结点插入
p->next=q2;
q1->next=p;
}
}
}//Insert
/*********************以下函数实现建立一个多项式****************/
PolynCreatePolyn(Polynhead,intm){//建立一个头指针为head、项数为m的一元多项式
//在主程序初始时,先输入的多项式中的项数m、n在这里为m。
主程序中的pa、pb在此为head
inti;//用来计数
Polynp;//定义一个p链表
p=head=(Polyn)malloc(sizeof(structPolynomial));
head->next=NULL;
for(i=0;ip=(Polyn)malloc(sizeof(structPolynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:
",i+1);
scanf("%f%d",&p->coef,&p->expn);
Insert(p,head);//调用Insert函数插入结点
}
returnhead;
}//CreatePolyn
/**********************以下函数实现多项式的销毁**********************/
voidDestroyPolyn(Polynp){//销毁多项式p
Polynq1,q2;
q1=p->next;
q2=q1->next;
while(q1->next){
free(q1);
q1=q2;//指针后移
q2=q2->next;
}
}
/*******************以下函数实现显示输出多项式*******************/
voidPrintPolyn(PolynP){
Polynq=P->next;
intflag=1;//项数计数器
if(!
q){//若多项式为空,输出0
putchar('0');
printf("\n");
return;
}
while(q){
if(q->coef>0&&flag!
=1)putchar('+');//系数大于0且不是第一项
if(q->coef!
=1&&q->coef!
=-1){//系数非1或-1的普通情况
printf("%g",q->coef);
if(q->expn==1)putchar('X');
elseif(q->expn)printf("X^%d",q->expn);
}
else{
if(q->coef==1){
if(!
q->expn)putchar('1');
elseif(q->expn==1)putchar('X');
elseprintf("X^%d",q->expn);
}
if(q->coef==-1){
if(!
q->expn)printf("-1");
elseif(q->expn==1)printf("-X");
elseprintf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}//while
printf("\n");
}//PrintPolyn
/*********************在下面的辅助乘法和加法运算****************/
intpare(Polyna,Polynb){
if(a&&b){
if(!
b||a->expn>b->expn)return1;
elseif(!
a||a->expnexpn)return-1;
elsereturn0;
}
elseif(!
a&&b)return-1;//a多项式已空,但b多项式非空
elsereturn1;//b多项式已空,但a多项式非空
}//pare
/*********************以下函数实现加法*********************/
PolynAddPolyn(Polynpa,Polynpb){//求解并建立多项式a+b,返回其头指针
Polynqa=pa->next;
Polynqb=pb->next;
Polynheadc,hc,qc;
hc=(Polyn)malloc(sizeof(structPolynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb){
qc=(Polyn)malloc(sizeof(structPolynomial));
switch(pare(qa,qb)){
case1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case-1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}//switch
if(qc->coef!
=0){
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
elsefree(qc);//当相加系数为0时,释放该结点
}//while
returnheadc;
}//AddPolyn
/********************以下函数实现减法***********************/
PolynSubtractPolyn(Polynpa,Polynpb){//求解并建立多项式a+b,返回其头指针
Polynh=pb;
Polynp=pb->next;
Polynpd;
while(p){//将pb的系数取反
p->coef*=-1;
p=p->next;
}
pd=AddPolyn(pa,h);
for(p=h->next;p;p=p->next)//恢复pb的系