单链表实现一元稀疏多项式的加、减运算。
题目:
用单链表实现一元稀疏多项式的加、减运算。
算法思想
设p,q分别指向A,B中某一结点,p,q初值是第一结点,则:

代码
#include<stdio.h> #include <stdlib.h> using namespace std; typedef struct Pnode { // 项的表示 int coef; // 系数 int expn; // 指数 struct Pnode* next; Pnode(int _coef, int _expn) :coef(_coef), expn(_expn), next(NULL) {} //构造函数 } Lnode, * LinkList; void tailInsertNode(Pnode* &r, Pnode* p) { if (p == NULL || r == NULL)return; r->next = p; r = p; } void CreatPolyn(Pnode*& P, int n) { if (P == NULL)return; Pnode* r = P; int coef; // 系数 int expn; for (int i = 0; i < n; ++i) { scanf("%d %d", &coef, &expn); Pnode* q = new Pnode(coef, expn); tailInsertNode(r, q); } } void DestroyPolyn(Pnode*& P) { Pnode* q; while (P->next != NULL) { q = P->next; P->next = q->next; delete q; } } void printNode(Pnode* p) { if (p == NULL)return; if (abs(p->coef) != 1 || p->expn == 0)printf("%d", p->coef > 0 ? p->coef : -(p->coef)); if (p->expn != 0) { if (p->expn != 1)printf("x^%d", p->expn); else printf("x"); } } void PrintPolyn(Pnode* P) { if (P->next == NULL) {//空链表打印0 printf("0\n"); return; } Pnode* p = P->next; if (p->coef < 0)printf("-"); printNode(p); while (p->next != NULL) { p = p->next; if (p->coef > 0)printf("+"); else printf("-"); printNode(p); } printf("\n"); } int PolynLength(Pnode* P) { Pnode* p = P->next; int cnt = 0; while (p != NULL) { cnt++; p = p->next; } return cnt; } void AddPolyn(Pnode* Pa, Pnode* Pb) { Pnode* p = Pa->next; Pnode* q = Pb->next; Pnode* k = Pa; //指向p前一个节点 while (p != NULL && q != NULL) { if (p->expn < q->expn) { k = p; p = p->next; } else if (p->expn == q->expn) { p->coef += q->coef; q = q->next; if (p->coef == 0) { k->next = p->next; delete p; p = k->next; } else { k = p; p = p->next; } } else if (p->expn > q->expn) { Pnode* r = new Pnode(q->coef, q->expn);//直接插入q导致Pb断开 q = q->next; r->next = p; k->next = r; k = r; } } while (q != NULL) { //Pb未遍历完 Pnode* r = new Pnode(q->coef, q->expn); q = q->next; r->next = k->next; k->next = r; k = k->next; } } void SubtractPolyn(Pnode* &Pa, Pnode* Pb) { Pnode* p = Pa->next; Pnode* q = Pb->next; Pnode* k = Pa; //指向p前一个节点 while (p != NULL && q != NULL) { if (p->expn < q->expn) { k = p; p = p->next; } else if (p->expn == q->expn) { p->coef -= q->coef; q = q->next; if (p->coef == 0) { k->next = p->next; delete p; p = k->next; } else { k = p; p = p->next; } } else if (p->expn > q->expn) { Pnode* r = new Pnode(q->coef, q->expn);//直接插入q导致Pb断开 q = q->next; r->next = p; k->next = r; k = r; } } while (q != NULL) { //Pb未遍历完 Pnode* r = new Pnode(q->coef, q->expn); q = q->next; r->next = k->next; k->next = r; k = k->next; } } int main() { int n, m, op; Pnode* Pa, * Pb; Pa = new Pnode(0, 0); Pb = new Pnode(0, 0); scanf("%d %d %d", &n, &m, &op); CreatPolyn(Pa, n); CreatPolyn(Pb, m); PrintPolyn(Pa); PrintPolyn(Pb); switch (op) { case 0: AddPolyn(Pa, Pb); break; case 1: SubtractPolyn(Pa, Pb); break; } DestroyPolyn(Pb);//摧毁Pb PrintPolyn(Pa); return 0; }

浙公网安备 33010602011771号