數據結構和算法-一元多項式運算算法(加法)
阿新 • • 發佈:2017-05-16
stdlib.h ted 技術分享 系統 名稱 scanf 設置 小數 表示
算法名稱:一元多項式算法
算法介紹:
加法運算:將具有與相同冪項的系數相加即可得到合並後的多項式。若某個冪項只存在於一個多項式中,則直接合並到結果中
舉例
利用代碼實現
這裏主要使用了鏈表,通過3個函數來進行操作。分別是Inpu函數,Add運算函數,打印函數。
代碼:
/*采用鏈表的方式*/
#include<stdio.h>
#include<stdlib.h>
#include<limits.h>
typedef struct polyn //定義多項式的結構
{
float coef; //系數項
int expn; //指數
struct
polyn *next; //指向下一項}POLYN,*pPOLYN;
void PolynInput(pPOLYN *p) //輸入一元多項式
{
int i,min=INT_MIN; //INT_MIN是int型的最小數
pPOLYN p1,p2; //分別表示2個多項式的指針
if(!(*p=(POLYN *)malloc(sizeof(POLYN)))) //為頭結點分配內存
{
printf("內存分配失敗 \n");
exit(0);
}
(*p)->coef=0; //設置頭結點的系數為0
printf("輸入該多項式的項數:"
);scanf("%d",&((*p)->expn));
(*p)->next=NULL;
for(i=0;i<(*p)->expn;i++) //輸入多項式各項
{
if(!(p1=(pPOLYN)malloc(sizeof(POLYN)))) //分配一個多項式的內存
{
printf("內存分配失敗: \n");
exit(0);
}
printf("第%d項系數:",i+1);
scanf("%f",&(p1->
coef));do{
printf("第%d項指數:",i+1);
scanf("%d",&(p1->expn));
if(p1->expn<min)
printf("\n前項=指數值不能小於前一項指數值%d!\n重新輸入\n",(*p)->next->expn);
}while(p1->expn<min);
min=p1->expn;
p1->next=(*p)->next;
(*p)->next=p1;
}
p1=(*p)->next; //合並多項式中指數值相同的項
while(p1)
{
p2=p1->next; //取下一節點
while(p2 && p2->expn==p1->expn) //若節點有效,節點與q節點的指數相同
{
p1->coef+=p2->coef; //累加系數
p1->next=p2->next; //刪除r指向的節點
free(p2);
p2=p1->next;
(*p)->expn--;
}
p1=p1->next;
}
}
void PolynPrint(pPOLYN p) //輸出多項式
{
pPOLYN p1;
int i;
printf("\n\n計算後的多項式共有%d項 \n",p->expn);
p1=p->next;
i=1;
while(p1)
{
printf("第%d項,系數:%g,指數:%d\n",i++,p1->coef,p1->expn);
p1=p1->next;
}
printf("\n");
}
void PolynAdd(pPOLYN pa,pPOLYN pb) //多項式相加pa=pa+pb
{
pPOLYN pa1,pb1,pc1,p;
pa1=pa->next; //指向被加鏈表的第一個有效項
pb1=pb->next; //指向加鏈表的第一個有效項
pc1=pa; //指向被加鏈表
pc1->next=NULL;
pa->expn=0; //清空多項式項目數據
while(pa1 && pb1) //兩個多項式都未結束
{
if(pa1->expn > pb1->expn) //如果pa1指數大於pb1
{
pc1->next=pa1; //將pa1指數加入結果鏈表中
pc1=pa1;
pa1=pa1->next; //處理pa1中的下一項
pc1->next=NULL;
}else if(pa1->expn < pb1->expn) //pa1的指數小於pb1的指數
{
pc1->next=pb1; //將pb1指數加入結果鏈表中
pc1=pb1;
pb1=pb1->next; //處理pb1的下一項
pc1->next=NULL;
}else { //pa1指數等於pb1指數,進行系統相加
pa1->coef+=pb1->coef; //累加素數
if(pa1->coef!=0) //若系數不為0
{
pc1->next=pa1; //將相加結果添加到結果鏈表中
pc1=pa1;
pa1=pa1->next; //處理pa1的下一項
pc1->next=NULL;
p=pb1;
pb1=pb1->next; //處理pb1的下一項
free(p);
}
else{ //系數為0,則不記錄該項
p=pa1; //用p指向pa1中的該項
pa1=pa1->next; //鏈表中刪除該項
free(p); //釋放該項所占用內存
p=pb1; //用臨時指針指向pb1中的該項
pb1=pa1->next; //鏈表中刪除該項
free(p); //釋放該項所占用內存
pa->expn--; //後面要進行累加操作,此處先減
}
}
pa-pa->expn++; //累加一個結果項
}
if(pa1) //若pa1中還有項
{
pc1->next=pa1; //將pa1中的項添加到結果鏈表中
while(pa1)
{
pa->expn++;
pa1=pa1->next;
}
}
if(pb1) //若pb1中還有項
{
pc1->next=pb1; //將pb1中的項添加到結果鏈表中
while(pb1)
{
pa->expn++;
pb1=pb1->next;
}
}
free(pb); //釋放pb頭鏈所占的內存空間
}
int main()
{
pPOLYN pa=NULL,pb=NULL; //指向多項式鏈表的指針
printf("輸入第一個多項式數據:\n");
PolynInput(&pa); //調用函數輸入一個多項式
printf("\n輸入第二個多項式數據:\n");
PolynInput(&pb); //調用函數,輸入另一個多項式
PolynAdd(pa,pb); //調用多項式相加函數
printf("\n兩個多項式之和為:");
PolynPrint(pa); //輸出運算得到的多項式
getch();
return 0;
}
附件列表
數據結構和算法-一元多項式運算算法(加法)