---恢復內容開始---指針
#include<stdio.h>it
#include<stdlib.h>io
typedef struct PolyNode *Polynomial;鏈表
struct PolyNode{數據
int coef;//係數di
int expon;//指數 時間
Polynomial link;//鏈表指針域指向下一地址 while
};co
Polynomial ReadPoly();//讀入多項式cas
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<b return -1, a==b return 0
{
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->expon<P2->expon
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;
}別人的代碼。不過好像有問題。有時間再改🙄