文章标题

#include <iostream>  
#include <cstdio>  
using namespace std;  

struct Node {  
    double coef;  
    int expn;  
    Node *next;  
};  

void CreatPolynomial(Node *&head, int n)        //  生成带表头结点的单链表,除头结点外另生成n个结点  
{  
    head = (Node *)malloc(sizeof(Node));  
    head->coef = 0;  
    head->expn = 0;  
    head->next = NULL;                           //  初始化头结点  
    cout << "请输入各项系数及指数:" << endl;  
    Node *p = head;  
    for(int i = 0; i < n; i++) {  
        p->next = (Node *)malloc(sizeof(Node));  //  生成新结点,尾插入生成链表  
        p = p->next;  
        cin >> p->coef >> p->expn;  
        p->next = NULL;  
    }  
}  

void PrintPolynomial(Node *&head)  
{  
    if(head->next == NULL)                           //  结果是0时直接输出0  
        putchar('0');  
    else {  
        for(Node *p = head->next; p != NULL; p = p->next) {  
            if(p != head->next && p->coef >0)      //  当p非首项且指向的系数为正时才输出'+'  
                putchar('+');                       //  之前只判定了p->coef >0  

            if(p->coef == 1) {                       //  系数为1或-1时特殊处理  
                if(p->expn == 0)  
                    putchar('1');                   //  判断条件不能写在一起:  
            }                                       //  if(p->coef == 1 && p->expn == 0) putchar('1');  
            else if(p->coef == -1)  
                putchar('-');  
            else  
                cout << p->coef;  

            switch(p->expn) {                        //  指数为0或1时特殊处理  

            case 0:  
                break;  

            case 1:  
                putchar('x');  
                break;  

            default:  
                p->expn < 0 ? printf("x^(%d)", p->expn) : printf("x^%d", p->expn);  //  指数小于0时打括号  
                break;  
            }  
        }  
    }  
    cout << endl;  
}  
//  上面的函数中若系数为int型,那么也可以改为switch结构,这是C语言的缺陷?  

void Free(Node *&head)  
{  
    Node *q = NULL;  
    for(Node *p = head; p != NULL; p = q) {  
        q = p->next;  
        free(p);  
    }  
}  

char cmp(int a, int b)  
{  
    if(a > b)  
        return '>';  
    if(a < b)  
        return '<';  
    return '=';  
}  

void AddPolynomial(Node *&pA, Node *&pB)        //  传进两个链表的头指针  
{  
    Node *ha = pA;  
    Node *hb = pB;  
    Node *qa = ha->next;                     //  ha, hb分别跟在qa, qb的后一位置  
    Node *qb = hb->next;                     //  qa, qb分别指向Pa, Pb中当前比较元素  
    while(qa && qb)   
    {  
        double sum = 0;  
        int a = qa->expn;  
        int b = qb->expn;  
        switch( cmp(a, b) ) {  

        case '<':  
            ha = qa;  
            qa = qa->next;                       //  非ha = ha->next;  
            break;  

        case '=':             
            sum = qa->coef + qb->coef;  
            if(sum != 0.0) {  
                qa->coef = sum;  
                ha = qa;                  
            }  
            else {  
                if(ha->next != qa)  
                    cout << "Error: ha->next != qa" << endl;  
                ha->next = ha->next->next;     //  删除和为0的结点,ha不变,还在qa后一位置  
                free(qa);  
            }  
            if(hb->next != qb)  
                cout << "Error: hb->next != qb" << endl;  
            hb->next = hb->next->next;  
            free(qb);  
            qb = hb->next;  
            qa = ha->next;  
            break;  

        case '>':  
            hb->next = hb->next->next;         //  删除qb指向的结点  
            qb->next = ha->next;              //  将qb插入ha后qa前  
            ha->next = qb;  

            qb = hb->next;                       //  not qb = ha->next  
            ha = ha->next;  
            break;  

        default:  
            cout << "Error!" << endl;  
            break;  
        }  
    }  
    if(qb)  
        ha->next = qb;  
    free(hb);  
}  

int main(void)  
{  
//  freopen("cin.txt", "r", stdin);  
    Node *A = NULL;  
    Node *B = NULL;  
    int lenA;  
    int lenB;  
    while(cout << "请输入A的项数:" << endl, cin >> lenA) {  
        CreatPolynomial(A, lenA);                   //  生成A链表         
        cout << "请输入B的项数:" << endl;         //  生成B链表  
        cin >> lenB;  
        CreatPolynomial(B, lenB);  

        cout << " A = ";                          //  输出A链表  
        PrintPolynomial(A);  
        cout << " B = ";                          //  输出B链表  
        PrintPolynomial(B);  

        AddPolynomial(A, B);                        //  A = A + B  
        cout << "A+B= ";  
        PrintPolynomial(A);                         //  输出和  
        cout << endl;  

        Free(A);                                    //  务必释放结点  
    }  
    return 0;  
}  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值