在主函数中调用函数CreatePolyn ()函数创建两个多项式:
2 + 3X + 5X3 + 2X4
3 + 2X + 4X2
然后调用函数AddPolyn求它们的和,最后打印出求和后的结果。
提示:
/*①多项式数据结构定义*/
typedef struct pnode{
float coef; //系数
int expn; //指数
} ElemType;
typedef LinkList Polynomial; //一元n次多项式类型定义
/*②多项式操作接口定义*/
// 创建一个一元多项式
Status CreatePolyn(Polynomial &P);
// 打印该链表的结果
void PrintPolyn(Polynomial pList);
// 比较两个结点的指数的大小
int cmp(ElemType a, ElemType b);
// 把两个一元多项式相加
Polynomial AddPolyn(Polynomial pa, Polynomial pb);
/*③部分操作的实现函数*/
// 创建一个一元多项式
Status CreatePolyn(Polynomial &P)
{
InitList_L(P); //初始化链表
printf("请输入多项式项数m:\n");
scanf("%d",&m);
printf("请输入多项式每项的系数和指数,格式如(3.0, 2):\n");
for(i=1;i<=m;i++)
{
输入一个结点,将其根据指数从小到大的排列顺序插入链表
}
#include<stdio.h>
#include<stdlib.h>
#define OK 1
#define ERROR 0
typedef int Status ;
typedef int ElemType ;
typedef struct pnode
{
float coef; //系数
int expn; //指数
struct pnode *next;
}pnode,*Polynomial;
//初始化
Status InitList_L(Polynomial &P);
// 创建一个一元多项式
Status CreatePolyn(Polynomial & P);
// 打印该链表的结果
Status PrintPolyn(Polynomial pList);
// 比较两个结点的指数的大小
int cmp(ElemType a, ElemType b);
// 把两个一元多项式相加
Polynomial AddPolyn(Polynomial pa, Polynomial pb);
//单链表的初始化
Status InitList_L(Polynomial &P)
{
P=new pnode;
P->next=NULL;
return OK;
}
// 创建一个一元多项式
Status CreatePolyn(Polynomial &P)
{
InitList_L(P); //初始化链表
Polynomial q;
int i,m;
P=(pnode*)malloc(sizeof(pnode));//生成结点
P->next=NULL;
q=P;
printf("请输入多项式项数m:\n");
scanf("%d",&m);
printf("请输入多项式每项的系数和指数,格式如(3.0, 2):\n");
for(i=1;i<=m;i++)
{ // 依次输入m个非零项(可按任意顺序)
q=(pnode*)malloc(sizeof(pnode));
scanf("%f,%d",&q->coef,&q->expn);
q->next =P->next ;
P->next =q;
}
return OK;
}//CreatPolyn
// 打印该链表的结果
Status PrintPolyn(Polynomial P)
{
while(P->next !=NULL)
{
P=P->next;
printf("(%5.2f)x^%d+",P->coef,P->expn);
}
printf("0");
printf("\n");
return OK;
}
// 比较两个结点的指数的大小
int cmp(int a,int b)
{
if(a>b) return 1;
else if(a<b) return -1;
else return 0;
}
// 把两个一元多项式相加
Polynomial AddPolyn(Polynomial pa, Polynomial pb)
{
Polynomial qc; /* 用来指向新链表的尾结点的 */
Polynomial qa; /* 指向第一个链表的当前结点 */
Polynomial qb; /* 指向第二个链表的当前结点*/
Polynomial temp; /* 删除结点时做临时变量用 */
ElemType a,b; /* 分别存放两个链表当前结点的数据 */
float sum; /* 存放两个链表中当前结点的系数和 */
qc = pa;
qa = pa->next;
qb = pb->next;
while( qa && qb )
{
a = qa->expn ;
b = qb->expn ;
switch( cmp(a,b) )
{
case -1: /* 第一个链表中当前结点的指数值小 */
qc->next=qa; /* Link the node to the end of qc */
qc=qa; /* move the tail pointer to qa */
qa=qa->next; /* move to the next node of qa */
break;
case 0: /* 指数值相等 */
sum = qa->coef + qb->coef;
if( sum != 0.0)
{
qa->coef=sum;
qc->next=qa; /* Link qa to the result polyn */
qc=qa; /* Let qc still point to the tail */
qa=qa->next;
}
else
{ /* 释放qa所指向的结点的空间 */
temp=qa ; /* qa is to be deleted, let temp point to it */
qa=qa->next; /* Let qa point to the next node */
free(temp); /* Free the space */
}
/* 释放qb所指向的结点的空间 */
temp = qb;
qb = qb->next; /* let qb point to the next node */
free(temp);
break;
case 1: /* 第一个链表中当前结点的指数值大 */
qc->next = qb;
qc = qb;
qb = qb->next;
break;
} /* End of Switch */
} /* End of while(!qa && !qb) */
qc->next = qa?qa:qb; /* Link the rest nodes of polynomial 1 or 2 */
free(pb); /* Free the head node of the 2nd polynomial */
return (pa);
}
void main()
{
Polynomial Pa,Pb;
printf("***************一元多项式加法运算*********************\n");
printf("\n______________第一个多项式______________\n");
CreatePolyn(Pa);
printf("第一个多项式为:");
PrintPolyn(Pa);
printf("\n\n______________第一个多项式______________\n");
CreatePolyn(Pb);
printf("第二个多项式为:");
PrintPolyn(Pb);
AddPolyn(Pa,Pb);
printf("\n\n两个多项式的和为:");
PrintPolyn(Pa);
system("pause");
}