1. 程式人生 > >一元多項式運算器

一元多項式運算器

  • 一.問題描述:設計一個一元多項式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);     
}