这次贴上一元多项式的问题
主要实现了一元多项式相加、相减以及相乘,直接上代码:
/*一元多项式相加和相乘*/
#include <stdio.h>
#include <stdlib.h>
typedef struct _Poly_ {
float coef; //系数
int expn; //指数
struct _Poly_ *next;
}PloyNode, *PolyList;
void createPolyn(PolyList &P, int m); //创建一元多项式有序链表
void destroyPolyn(PolyList &P); //销毁一元多项式
void printPolyn(PolyList P); //打印一元多项式
int polynLength(PolyList P);
void addPolyn(PolyList &Pa, PolyList &Pb); //两个多项式相加,销毁Pb
void substractPolyn(PolyList &Pa, PolyList &Pb); //两个多项式相减,销毁Pb
void multiplyPolyn(PolyList &Pa, PolyList &Pb);//两个多项式相乘,销毁Pb
int compare(PolyList Pa, PolyList Pb); //比较两个指数值 a > b return 1,a=b return 0,a < b return -1
PolyList makeNode(float coef, int expn); //创建一个节点
int isNodeExit(PolyList PH, PolyList p); //节点在链表中是否已经存在(比较指数)
void insertFirst(PolyList &P, PolyList &pt); //插入,根据指数大小决定插入位置
void initPolyList(PolyList &P); //初始化链表
PolyList singleMultiply(PolyList &single, PolyList P); //多项式和单项式相乘
int main(void) {
PolyList Pa, Pb;
initPolyList(Pb);
initPolyList(Pa);
createPolyn(Pa, 2);
createPolyn(Pb, 1);
//destroyPolyn(P);
printPolyn(Pa);
printPolyn(Pb);
multiplyPolyn(Pa, Pb);
printPolyn(Pa);
system("pause");
return 0;
}
int polynLength(PolyList P) {
int length = 0;
PolyList temp = P->next;
while(temp) {
length++;
temp = temp->next;
}
return length;
}
PolyList singleMultiply(PolyList &single, PolyList P) {
PolyList temp = P->next;
while(temp != NULL) {
temp->coef *= single->coef;
temp->expn += single->expn;
temp = temp->next;
}
return P;
}
void multiplyPolyn(PolyList &Pa, PolyList &Pb) { //多项式相乘转化为多个单项式和一个多项式之积的和
PolyList tb = Pb->next;
PolyList tp;
initPolyList(tp);
while(tb) {
PolyList m = singleMultiply(tb, Pa);
addPolyn(tp, m);
tb = tb->next;
}
Pa = tp;
destroyPolyn(Pb);
}
void substractPolyn(PolyList &Pa, PolyList &Pb) {
PolyList prevTa = Pa;
PolyList prevTb = Pb;
PolyList ta = Pa->next;
PolyList tb = Pb->next;
while(ta && tb) {
int temp = compare(ta, tb);
if (temp == 0) {
ta->coef -= tb->coef;
ta = ta->next;
tb = tb->next;
prevTa = prevTa->next;
prevTb = prevTb->next;
} else if (temp < 0) {
ta = ta->next;
prevTa = prevTa->next;
} else {
PolyList q = makeNode(-(tb->coef), tb->expn);
insertFirst(Pa, q);
prevTa = Pa;
ta = Pa->next;
tb = tb->next;
prevTb = prevTb->next;
}
}
while(tb) {
PolyList q = makeNode(-(tb->coef), tb->expn);
insertFirst(Pa, q);
tb = tb->next;
}
destroyPolyn(Pb);
}
void addPolyn(PolyList &Pa, PolyList &Pb) {
PolyList prevTa = Pa;
PolyList prevTb = Pb;
PolyList ta = Pa->next;
PolyList tb = Pb->next;
while(ta && tb) {
int temp = compare(ta, tb);
if (temp == 0) {
ta->coef += tb->coef;
ta = ta->next;
tb = tb->next;
prevTa = prevTa->next;
prevTb = prevTb->next;
} else if (temp < 0) { //若ta < tb将tb和下一个ta比较
ta = ta->next;
prevTa = prevTa->next;
} else { //ta>tb则插在ta前面
PolyList q = makeNode(tb->coef, tb->expn);
insertFirst(Pa, q);
prevTa = Pa;
ta = Pa->next;
tb = tb->next;
prevTb = prevTb->next;
}
}
if (tb) {
prevTa->next = tb;
prevTb->next = NULL;
}
destroyPolyn(Pb);
}
void printPolyn(PolyList P) {
if (!P) {
printf("0\n");
return;
}
PolyList tp = P->next;
printf("%.1fx^%d", tp->coef, tp->expn);
tp = tp->next;
while(tp) {
if (tp->coef > 0) {
printf("+%.1fx^%d", tp->coef, tp->expn);
} else if (tp->coef < 0) {
printf("%.1fx^%d", tp->coef, tp->expn);
}
tp = tp->next;
}
printf("\n");
}
void destroyPolyn(PolyList &P) {
while(P->next) {
PolyList tp = P;
PolyList tq = P->next;
while(tq->next) {
tp = tp->next;
tq = tq->next;
}
free(tq);
tp->next = NULL;
}
free(P);
P = NULL;
}
int compare(PolyList Pa, PolyList Pb) {
return Pa->expn - Pb->expn;
}
void initPolyList(PolyList &P) {
P = (PolyList)malloc(sizeof(PloyNode));
if (P) {
P->coef = 0;
P->expn = -1;
P->next = NULL;
}
}
PolyList makeNode(float coef, int expn) {
PolyList p = (PolyList)malloc(sizeof(PloyNode));
if (p) {
p->coef = coef;
p->expn = expn;
}
return p;
}
void insertFirst(PolyList &P, PolyList &pt) {
if (P->next == NULL) {
pt->next = P->next;
P->next = pt;
} else {
PolyList q = P->next;
PolyList s = P;
while(q && compare(pt, q) > 0) {
q = q->next;
s = s->next;
}
pt->next = s->next;
s->next = pt;
}
}
int isNodeExit(PolyList PH, PolyList p) {
PolyList pt = PH->next;
while(pt) {
if (compare(pt, p) == 0){
return 1;
} else {
pt = pt->next;
}
}
return 0;
}
void createPolyn(PolyList &P, int m) {
PolyList pNode = P;
for(int i = 0;i < m;i++) {
float coef;
int expn;
scanf("%f %d",&coef, &expn);
printf("输入%f, %d\n", coef, expn);
PolyList pt = makeNode(coef, expn);
if (!isNodeExit(P, pt) && pt){
insertFirst(P, pt);
}
}
}