单链表实现一元稀疏多项式的加、减运算。

题目:

用单链表实现一元稀疏多项式的加、减运算。

算法思想

设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;
}

 

posted @ 2020-09-26 20:15  tao10203  阅读(474)  评论(0)    收藏  举报