在主函數中調用函數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");
}