採用帶頭節點的單鏈表存儲多項式,每節點含係數與指數。模組劃分為頭文件、庫函數、測試程式,結構清晰便於維護擴展。
// poly.h 關鍵定義
typedef struct Node *PtrToNode;
typedef PtrToNode Polynomial; // 多項式即鏈表頭指標
struct Node {
int Coefficient; // 係數
int Exponent; // 指數
PtrToNode Next; // 下一項
};
項按指數遞減序存儲,便於合併同類項與運算遍歷。
Polynomial PolyAdd(Polynomial P1, Polynomial P2); // 加法 Polynomial PolySub(Polynomial P1, Polynomial P2); // 減法 Polynomial PolyMult(Polynomial P1, Polynomial P2); // 乘法 void PolyPrint(Polynomial P); // 打印 void PolyFree(Polynomial P); // 釋放 int PolyEval(Polynomial P, int x); // 求值
Polynomial PolyAdd(Polynomial P1, Polynomial P2) {
Polynomial Result = MakeEmpty(NULL);
PtrToNode r = Result;
P1 = P1->Next; P2 = P2->Next; // 跳過頭節點
while (P1 && P2) {
if (P1->Exponent > P2->Exponent) {
Attach(P1->Coefficient, P1->Exponent, &r);
P1 = P1->Next;
} else if (P1->Exponent < P2->Exponent) {
Attach(P2->Coefficient, P2->Exponent, &r);
P2 = P2->Next;
} else { // 指數相同,係數相加
int sum = P1->Coefficient + P2->Coefficient;
if (sum) Attach(sum, P1->Exponent, &r);
P1 = P1->Next; P2 = P2->Next;
}
}
// 處理剩餘項
for (; P1; P1 = P1->Next) Attach(P1->Coefficient, P1->Exponent, &r);
for (; P2; P2 = P2->Next) Attach(P2->Coefficient, P2->Exponent, &r);
return Result;
}
Polynomial PolyMult(Polynomial P1, Polynomial P2) {
if (!P1->Next || !P2->Next) return MakeEmpty(NULL); // 零多項式
Polynomial Result = MakeEmpty(NULL);
PtrToNode t1, t2, r;
for (t1 = P1->Next; t1; t1 = t1->Next) {
Polynomial Temp = MakeEmpty(NULL);
r = Temp;
for (t2 = P2->Next; t2; t2 = t2->Next) {
Attach(t1->Coefficient * t2->Coefficient,
t1->Exponent + t2->Exponent, &r);
}
Result = PolyAdd(Result, Temp); // 累加部分積
PolyFree(Temp);
}
return Result;
}
double)