#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#define ERROR 0
#define OK 1
struct pNode{
int coef; //係數
int exp;//指數
struct pNode* link;
};
typedef struct{//此處是將結構體重命名爲 polynomial,方便後面用其定義變量
int n;
struct pNode *head;
} polynomial;
void Create(polynomial *p) {//生成表頭結點
pNode *pn,*pre,*q;
p->head=(pNode*)malloc(sizeof(pNode));
p->head->exp=-1;
p->head->link=NULL;
p->n=0;
for(;;) {
pn=(pNode*)malloc(sizeof(pNode));
printf("coef:\n");
scanf("%d",&pn->coef); //輸入項的係數
printf("exp:\n");
scanf("%d",&pn->exp); //輸入項的指數
if (pn->exp<0) break; //若輸入項指數負數,結果輸入
pre=p->head;
q=p->head->link;
while(q&&q->exp>pn->exp) {//插入項並保證多項式的各項爲降冪排列
pre=q;
q=q->link;
}
pn->link=q;
pre->link=pn;
p->n++;
}
}
void Add(polynomial *px,polynomial *qx) { //相加操作
pNode *q,*q1=qx->head,*p,*temp; //q1指向表頭結點
p=px->head->link; //p指向多項式px的第一個結點
q=q1->link; //q1是q的前驅
while(p&&q) {
while(p->exp<q->exp){ //跳過q->exp大的項
q1=q;
q=q->link;
}
if(p->exp==q->exp){
q->coef=q->coef+p->coef;
if(q->coef==0){
q1->link=q->link ;
free(q);
q=q1->link;
p=p->link;
}else{
q1=q;
q=q->link;
p=p->link;
}
}else{
temp=(pNode*)malloc(sizeof(pNode)); //生成新的一維數組
temp->coef=p->coef;
temp->exp=p->exp;
temp->link=q1->link;
q1->link=temp;
p=p->link;
}
}
}
int Output(polynomial list1){
int i=0;
pNode *pn;
if(!list1.head)
return ERROR;
pn=list1.head;
for(i=0; i<list1.n; i++){
pn=pn->link;
printf("%d,%d",pn->coef,pn->exp);
}
return OK;
}
void output(polynomial *p) {//多項式輸出函數
pNode *q;
if(!p->head->link) //判斷多項式是否爲空
return ;
q=p->head->link; //單獨輸出第一項
printf("%d*x^%d",q->coef,q->exp);
q=q->link;
while(q){
if(q->exp==0) //對常數項的輸出
if(q->coef>0) //常數係數>0的情況
printf("+%d",q->coef);
else printf("%d",q->coef); //常數係數<0的情況
else if(q->coef>0) //非常數項項係數>0情況
printf("+%d*x^%d",q->coef,q->exp);
else //非常數項係數<0的情況
printf("%d*x^%d",q->coef,q->exp);
q=q->link;
}
}
int main(){
polynomial list1;
polynomial list2;
Create (&list1);
printf("\nthe linklist is:");
Output(list1);
Create (&list2);
printf("\nthe linklist is:");
Output(list2);
Add(&list1,&list2);
printf("\nthe result is:\n");
output(&list2);
}
這種解法是不改變多項式1,同時把結果保存在多項式2。
數據結構嚴蔚敏版的解法是逐一比較兩個多項式,通過連接多項式1和2中的節點,把結果保存在多項式1,同時將用完的節點都刪除掉。