多项式加法 java 链表_多项式加法,用单链表实现。
---恢復內容開始---
#include
#include
typedef struct PolyNode *Polynomial;
struct PolyNode{
int coef;//系數
int expon;//指數
Polynomial link;//鏈表指針域指向下一地址
};
Polynomial ReadPoly();//讀入多項式
void Attach(int c,int e,Polynomial *pRear);//將每次讀入的多項式連接
Polynomial Add(Polynomial P1,Polynomial P2);//多項式相加
Polynomial Mult(Polynomial P1,Polynomial P2);//多項式相乘
int Compare(int a,int b);//比較
void PrintPoly(Polynomial P);//輸出多項式
int main(void)
{
Polynomial P1,P2,PS,PP;
P1=ReadPoly();//讀入數據
P2=ReadPoly();
PP=Mult(P1,P2);//多項式相乘
PrintPoly(PP);
printf("\n");
PS=Add(P1,P2);//多項式相加
PrintPoly(PS);
return 0;
}
Polynomial ReadPoly()//讀入數據
{
Polynomial P,Rear,t;
int c,e,N;
scanf("%d",&N);
P=(Polynomial)malloc(sizeof(struct PolyNode));//為方便表頭插入,先產生一個臨時空節點做為鏈表頭
P->link =NULL;
Rear=P;//Rear始終指向鏈表的尾部
while(N--)
{
scanf("%d %d",&c,&e);
if(c!=0)//對系數為零的項進行判斷
Attach(c,e,&Rear);
}
t=P;//釋放表頭為空的節點
P=P->link ;
free(t);
return P;
}
void Attach(int c,int e,Polynomial *pRear)//將數據連接成鏈表
{
Polynomial P;
P=(Polynomial)malloc(sizeof(struct PolyNode));//為方便表頭插入,先產生一個臨時空節點做為鏈表頭
P->coef=c;
P->expon=e;
P->link =NULL;
(*pRear)->link=P;//將P指向的新節點插入到當前結果表達式尾項的后面
*pRear=P;//最后一項指向P
}
int Compare(int a,int b)//比較 ,a>b return 1,a
{
if(a>b)
return 1;
else if(a==b)
return 0;
else
return -1;
}
Polynomial Add(Polynomial P1,Polynomial P2)//多項式相加
{
Polynomial front,rear,temp;//front為頭,Rear為尾
int sum;
rear=(Polynomial)malloc(sizeof(struct PolyNode));//為方便表頭插入,先產生一個臨時空節點做為鏈表頭
front=rear;
while(P1&&P2)
switch(Compare(P1->expon ,P2->expon))
{
case 1://如果P1->expon>P2->expon
Attach(P1->coef,P1->expon,&rear);
P1=P1->link ;
break;
case -1://如果P1->exponexpon
Attach(P2->coef,P2->expon,&rear);
P2=P2->link ;
break;
case 0://如果P1->expon=P2->expon
sum=P1->coef +P2->coef;
if(sum)//如果指數相等,先判斷系數和是否為0
Attach(sum,P1->expon,&rear);
P1=P1->link;
P2=P2->link ;
break;
}
//將未處理完的多項式中所有節點復制到結果多項式中
while(P1)
{
Attach(P1->coef,P1->expon,&rear);
P1=P1->link;
}
while(P2)
{
Attach(P2->coef,P2->expon,&rear);
P2=P2->link;
}
rear->link=NULL;//釋放頭為空的節點
temp=front;
front=front->link ;
free(temp);
return front;
}
void PrintPoly(Polynomial P)//打印
{
int flag=0;
if(!P)
{
printf("0 0");
return ;
}
while(P)
{
if(!flag)
flag=1;
else
printf(" ");
printf("%d %d",P->coef ,P->expon );
P=P->link ;
}
}
Polynomial Mult(Polynomial P1, Polynomial P2)//多項式相乘
{
Polynomial P, Rear;
Polynomial t1, t2, t;
if (!P1 ||!P2)//判斷兩個鏈表是否為空
{
return NULL;
}
t1 = P1;
t2 = P2;
P = (Polynomial)malloc(sizeof(struct PolyNode));
Rear = P;
while (t2)//先讓t1的第一項和t2的每一項相乘,構建出一個新鏈表,用于后來數據的插入
{
Attach(t1->coef*t2->coef, t1->expon + t2->expon, &Rear);
t2 = t2->link;
}
t1 = t1->link;
while (t1)
{
t2 = P2;
Rear = P;//Rear每次都從所構建的鏈表頭開始,以便于尋找插入位置
while (t2)
{
int c = t1->coef*t2->coef;
int e = t1->expon + t2->expon;
while (Rear->link&&Rear->link->expon > e)//Rear每次都從所構建的鏈表頭開始,以便于尋找插入位置
{
Rear = Rear->link;
}
if (Rear->link&&Rear->link->expon == e)//相等就不需要申請一個新的節點,只要把系數相加。
{
if (Rear->link->coef + c)//系數和不為0,
{
Rear->link->coef += c;
}
else//系數和為0,刪除節點
{
t = Rear->link;
Rear->link = t->link;
free(t);
}
}
else//如果指數不相等,申請空間將將此項插入
{
t = (Polynomial)malloc(sizeof(struct PolyNode));
t->link = NULL;
t->coef = c;
t->expon = e;
t->link = Rear->link;
Rear->link = t;
Rear = Rear->link;
}
t2 = t2->link;
}
t1 = t1->link;
}
t2 = P;//釋放空節點
P = P->link;
free(t2);
return P;
}別人的代碼。不過好像有問題。有時間再改🙄
總結
以上是生活随笔為你收集整理的多项式加法 java 链表_多项式加法,用单链表实现。的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 标题 穿越雷区 java_【蓝桥杯】穿越
- 下一篇: 刷子李的“行”字怎么读?