zoukankan      html  css  js  c++  java
  • 数据结构 C++ 单链表 一元多项式的相加

    #include <iostream>
    using namespace std;

    struct Node {
    double coe; //系数
    int exp; //指数
    Node *next;
    };

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

    void ShowPoly(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->coe >0) // 当p非首项且指向的系数为正时才输出'+'
    putchar('+'); // 之前只判定了p->coe >0

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

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

    case 0:
    break;

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

    default:
    p->exp < 0 ? printf("x^(%d)", p->exp) : printf("x^%d", p->exp); // 指数小于0时打括号
    break;
    }
    }
    }
    cout << endl;
    }


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

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


    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->exp;
    int b = qb->exp;
    switch( comp(a, b) ) {

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

    case '=':
    sum = qa->coe + qb->coe;
    if(sum != 0.0) {
    qa->coe = 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);
    }

    void main(void)
    {
    Node *A = NULL;
    Node *B = NULL;
    int countA;
    int countB;
    cout << "请输入A的项数:" << endl, cin >> countA;
    CreatPoly(A, countA); // 生成A链表
    cout << "请输入B的项数:" << endl; // 生成B链表
    cin >> countB;
    CreatPoly(B, countB);

    cout << " A = ";
    ShowPoly(A);
    cout << " B = ";
    ShowPoly(B);

    AddPolynomial(A, B); // A = A + B
    cout << "A+B= ";
    ShowPoly(A); // 输出相加的和
    cout << endl;
    // 释放结点
    delete A;

    }

  • 相关阅读:
    SAP MM模块教程(1)— 概述
    CodeSmith Generator
    EasyUI 左侧 tree 右侧 DataGrid模板
    C# 数据库访问公共类
    Easyui datagrid toolbar 模板
    EasyUI combogrid 更新查询参数 queryParams 重新加载
    Jenkins的搭建与使用
    Idea2020激活,全网最新教程(各版本通用),亲测2089!!!
    阿里云盘开启“个人云种子用户报名
    尚硅谷Java互联网大厂面试题第三季,1024干货
  • 原文地址:https://www.cnblogs.com/DonAndy/p/5914706.html
Copyright © 2011-2022 走看看