【資料結構】一元稀疏多項式計算器
阿新 • • 發佈:2018-12-19
基本功能
- 一元多項式的加減
- 一元多項式的乘法
- 一元多項式的導數
- 一元多項式的輸出為類數學表示式
執行截圖:
原始碼:
#include<stdio.h>
#include<stdlib.h>
typedef struct
{
float coef;//係數
int expn;//指數
} Term;
typedef struct ploynomial
{
Term term;
ploynomial* next;
} ploynomial,*LinkList;
void InitList(LinkList &L)
{
//初始化連結串列
L= (ploynomial*)malloc(sizeof(ploynomial));//頭結點
L->term.coef=0.0;
L->term.expn=-1;
L->next=NULL;
}
int cmp(Term a,Term b)
{
//比較結點的係數大小函式
if(a.expn>b.expn) return -1;
else if(a.expn==b.expn) return 0;
else return 1;
}
void insertNode(LinkList &L,Term e)
{
//將結點插入多項式連結串列的適當位置,可以同時起到建立連結串列和多項式相加的功能
ploynomial* q=L;
while(q->next!=NULL)
{
if(cmp(q->next->term,e)<0)//如果當前結點q的下一個結點的指數 大於 要插入的結點的指數
q=q->next;//q指向下一個結點
else break;//此時, q.term.expn>e.expn >=q->next->term.expn
}
if(q->next!=NULL&&cmp(q->next->term, e)==0) //指數相同,係數相加
{
q->next->term.coef+=e.coef;
}
else
{
ploynomial* node =(ploynomial*) malloc(sizeof(ploynomial));
node->term.coef=e.coef;
node->term.expn=e.expn;
if(q->next==NULL)
node->next=NULL; //如果q結點為尾結點,則node的指標域設為NULL
else
node->next=q->next; //否則node的指標域指向q的下一個結點
q->next=node;//將node結點插入連結串列中
}
}
void CreatPolyn(LinkList &L,int m)
{
//輸入m項的係數和指數,建立表示一元多項式的有序連結串列L
Term e;
InitList(L);
for(int i=1; i<=m; i++)
{
printf("\n第%d項的係數和指數:",i);
scanf("%f%d",&e.coef,&e.expn);
insertNode(L,e);
}
}
void addPolyn(LinkList &L,LinkList L1,LinkList L2)
{
//用L返回L1+L2的結果
ploynomial* q;
for(q=L1->next; q!=NULL; q=q->next)
{
insertNode(L,q->term);//將L1的每一項插入到L中
}
for(q=L2->next; q!=NULL; q=q->next) //將L2的每一項插入到L中
{
insertNode(L,q->term);
}
}
void SubtracatPolyn(LinkList &L,LinkList L1,LinkList L2)
{
//用L返回L1-L2的結果
ploynomial* q;
for(q=L1->next; q!=NULL; q=q->next)
{
insertNode(L,q->term);//將L1的每一項插入到L中
}
for(q=L2->next; q!=NULL; q=q->next)
{
q->term.coef = -(q->term.coef); //把係數變成相反數,再進行相加操作,即為L1-L2
insertNode(L,q->term);//將L2的每一項插入到L中
}
}
void multiplyPolyn(LinkList &L,LinkList L1,LinkList L2)
{
//用L返回L1*L2的結果
ploynomial *p,*q;
Term term;
term.coef=0.0;
term.expn=0;
for(q=L1->next; q!=NULL; q=q->next)
{
for(p=L2->next; p!=NULL; p=p->next)
{
term.coef=(q->term.coef)*(p->term.coef);//係數相乘
term.expn=(q->term.expn)+(p->term.expn);// 指數想加
insertNode(L,term);
}
}
}
void derivativePolyn(LinkList &L,LinkList L1)
{
//用L返回L1的導數
ploynomial *p;
Term term;
for(p=L1->next; p!=NULL; p=p->next)
{
if(p->term.expn==0)
{
continue;//指數為0時,導數為0 ,跳過此次迴圈
}
else
{
term.coef=(p->term.coef)*(p->term.expn); //係數乘以指數
term.expn=(p->term.expn)-1;//指數減一
insertNode(L,term);
}
}
}
void visitList(LinkList L)
{
//以類數學表示式的形式列印輸出一元多項式L,
//即指數或者係數為1的情況下 省略1
ploynomial* q=L;
int flag;
while(q->next!=NULL)
{
q=q->next;
flag=1;
if(q->term.coef==0) continue;//係數為0 不輸出
if(q->term.expn==0&&flag==1) //指數為1
{
if(q->term.coef>0)
printf("+%.2f",q->term.coef);
else
printf("%.2f",q->term.coef);
flag=0;
}
if((q->term.coef==1||q->term.coef==-1)&&flag==1)//係數為1
{
if(q->term.expn==1){
if(q->term.coef==1)
printf("+X");
else
printf("-X");
}else{
if(q->term.coef==1)
printf("+X^%d",q->term.expn);
else
printf("-X^%d",q->term.expn);
}
flag=0;
}
if(flag==1)
{
if(q->term.coef>0)
printf("+%.2fX^%d",q->term.coef,q->term.expn);
else
printf("%.2fX^%d",q->term.coef,q->term.expn);
}
}
printf("\n");
}
int main()
{
LinkList L1,L2;
int n1,n2;
printf("請輸入多項式L1的項數:");
scanf("%d",&n1);
CreatPolyn(L1,n1);
printf("請輸入多項式L2的項數:");
scanf("%d",&n2);
CreatPolyn(L2,n2);
printf("\n多項式L1: ");
visitList(L1);
printf("\n多項式L2: ");
visitList(L2);
LinkList add,sub,multiply,derivative1,derivative2;
InitList(add);
InitList(sub);
InitList(multiply);
InitList(derivative1);
InitList(derivative2);
derivativePolyn(derivative1,L1);
derivativePolyn(derivative2,L2);
printf("\nL1的導數: ");
visitList(derivative1);
printf("\nL2的導數: ");
visitList(derivative2);
addPolyn(add,L1,L2);
SubtracatPolyn(sub,L1,L2);
multiplyPolyn(multiply,L1,L2);
printf("\nL1 + L2: ");
visitList(add);
printf("\nL1 - L2: ");
visitList(sub);
printf("\nL1 * L2: ");
visitList(multiply);
}