一元多項式運算器
阿新 • • 發佈:2019-01-28
- 一.問題描述:設計一個一元多項式P=p0+p1x+p2x*2......+pnx*n的合適的資料結構,並支援兩個多項式的下列運算:1.建立;2.輸出;3.相加;4.相減;5.相乘;6.求導。
- 二.資料結構:
- typedef struct node
- {
- float xishu;
- int zhishu;
struct node *next;
}Lnode; - 三.方案設計:
- 1.建立多項式:通過鍵盤輸入多項式的係數和指數,用尾插法建立一元多項式的連結串列。本程式的指數必須由小到大輸入,想要結束,係數輸零即可。
- 2.輸出多項式:從單鏈表的第一個元素開始,逐項讀出係數和指數,按多項式的形式輸出即可。
- 3.兩個多項式相加:以單鏈表pa,pb分別表示兩個單鏈表A,B,A+B的求和問題,就等同於單鏈表的插入問題,構造一個pc來儲存pa+pb的值,為實現處理,用qa,qb,qc分別來表示pa,pb,pc的當前項,由此,得到以下運算過則:
- qa->exp<qb->exp,將qa複製到qc當中,qa指標後移
- qa->exp=qb->exp,則將兩個節點中的係數相加,當和不為0時,qc的係數等於qa和qb的係數之和,當和為0時,qa,qb指標後移。
- qa->exp>qb-exp,將qb複製到qc當中,qb指標後移
- 4.兩個多項式相減:和加類似,只需輸入係數時獎多項式二的係數改為負的即可,再進行加運算。
- 5.兩個多項式相乘:和多項式相加類似,需要使用多項式pa中的每一項和pb中的每一項進行相乘,然後進行多項式相加操作。
- 6.多項式求導:多項式當前指數為零,則其導數為零;當前結點指數不為零,則其導數的係數為當前節點指數乘以係數,指數為當前結點指數減一
#include<stdio.h>
#include<stdlib.h>#include<conio.h>
#include<string.h>
typedef struct node
{
float xishu;
int zhishu;
struct node *next;
}Lnode;
Lnode *create()
{
Lnode *H;
H=(Lnode*)malloc(sizeof(Lnode));
H->next=NULL;
Lnode *r=H,*s;
int y;
float x;
printf("請輸入係數和指數:\n");
scanf("%f %d",&x,&y);
while(x!=0.0)
{
s=(Lnode*)malloc(sizeof(Lnode));
s->xishu=x;
s->zhishu=y;
s->next=r->next;
r->next=s;
r=s;
scanf("%f %d",&x,&y);
}
s->next=NULL;
return H;
}
/******************************************************/
void print(Lnode *H) //輸出多項式
{
Lnode *p=H->next;
int flag=1;
if(!p)
{
printf("0");
return;
getch();
}
while(p)
{
if(p->xishu>0&&flag!=1) putchar('+');
if(p->xishu!=1&&p->xishu!=-1)
{
printf("%g",p->xishu);
if(p->zhishu==1) putchar('X');
else if(p->zhishu) printf("X^%d",p->zhishu);
}
else
{
if(p->xishu==1)
{
if(!p->zhishu) printf("1");
else if(p->zhishu==1) printf("X");
else printf("X^%d",p->zhishu);
}
if(p->xishu==-1)
{
if(!p->zhishu) printf("-1");
else if(p->zhishu==-1) printf("-X");
else printf("-X^%d",p->zhishu);
}
}
p=p->next;
flag++;
}
printf("\n");
}
/**************************************************************/
Lnode *MPLUS(Lnode*pa,Lnode *pb) //多項式加法
{
Lnode *Pa,*Pb,*Pc,*pc,*qc;
Pa=pa->next;
Pb=pb->next;
pc=(Lnode*)malloc(sizeof(Lnode));
pc->next=NULL;
Pc=pc;
while(Pa!=NULL&&Pb!=NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
if(Pa->zhishu<Pb->zhishu)
{
qc->xishu=Pa->xishu;
qc->zhishu=Pa->zhishu;
Pa=Pa->next;
}
else if(Pa->zhishu==Pb->zhishu)
{
qc->xishu=Pa->xishu+Pb->xishu;
qc->zhishu=Pa->zhishu;
Pa=Pa->next;
Pb=Pb->next;
}
else
{
qc->xishu=Pb->xishu;
qc->zhishu=Pb->zhishu;
Pb=Pb->next;
}
if(qc->xishu!=0)
{
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
else free(qc);
}
while(Pa != NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
qc->xishu=Pa->xishu;
qc->zhishu=Pa->zhishu;
Pa=Pa->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
while(Pb != NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
qc->xishu=Pb->xishu;
qc->zhishu=Pb->zhishu;
Pb=Pb->next;
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
return Pc;
}
/**************************************************************/
Lnode *MDele(Lnode *pa,Lnode *pb) //多項式減法 ;
{
Lnode *h=pb;
Lnode *p=pb->next;
Lnode *pd;
while(p)
{
p->xishu*=-1.0;
p=p->next;
}
pd = MPLUS(pa,h);
for(p=h->next;p;p=p->next)
p->xishu*=-1;
return pd;
}
/********************************************************************/
Lnode *multi(Lnode*pa,Lnode *pb) //多項式乘法
{
Lnode *Pa,*Pb,*Pc,*pc,*qc;
Pa=pa->next;
Pb=pb->next;
pc=(Lnode*)malloc(sizeof(Lnode));
pc->next=NULL;
Pc=pc;
while(Pa!=NULL)
{
Pb=pb->next;
while(Pb!=NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
qc->xishu=Pa->xishu*Pb->xishu;
qc->zhishu=Pa->zhishu+Pb->zhishu;
qc->next=pc->next;
pc->next=qc;
pc=qc;
Pb=Pb->next;
}
if(qc->xishu==0)
free(qc);
Pa=Pa->next;
}
return Pc;
}
Lnode *F(Lnode *pa) //多項式求導
{
Lnode *P,*qc,*Pc,*pc;
pc=(Lnode*)malloc(sizeof(Lnode));
pc->next=NULL;
P=pa->next;
Pc=pc;
while(P!=NULL)
{
qc=(Lnode*)malloc(sizeof(Lnode));
if(P->zhishu!=0)
{
qc->zhishu=P->zhishu-1;
qc->xishu=P->xishu*P->zhishu;
}
if(P->zhishu==0)
{
qc->xishu=P->xishu;
qc->zhishu=0;
}
if(qc->xishu!=0)
{
qc->next=pc->next;
pc->next=qc;
pc=qc;
}
if(qc->xishu==0)
free(qc);
P=P->next;
}
return Pc;
}
void main() //多項式必須按次數由低到高或由高到低輸入
{
Lnode *pa,*pb,*Plus,*jian,*Multi,*f; //輸入多項式
printf("輸入多項式一:\n");
pa=create();
printf("多項式一如下:\n");
printf("Pa=");
print(pa);
printf("\n");
printf("輸入多項式二:\n");
pb=create();
printf("多項式二如下:\n");
printf("Pb=");
print(pb);
getch();
printf("\n"); //多項式加法
Plus=MPLUS(pa,pb);
printf("兩式相加結果為:\n");
printf("Pc=");
print(Plus);
printf("兩式相減的結果為:\n"); //多項式減法
printf("Pc=");
jian=MDele(pa,pb);
print(jian);
printf("\n");
printf("兩式相乘的結果為:\n"); //多項式乘法
printf("Pc=");
Multi=multi(pa,pb);
print(Multi);
printf("\n一式求導得:\n"); //多項式求導
printf("Pa'=");
f=F(pa) ;
print(f);
printf("\n");
printf("二式求導得:\n"); //多項式求導
printf("Pb'=");
f=F(pb);
print(f);
}