数据结构实验一—— 线性表(一元多项式相加)

一、实验目标

(1)掌握线性表的链式存储结构

(2)掌握链表的基本操作,并能进行应用实践

(3)实验C/C++语言和线性表实现“一元多项式相加”专题

二、实验任务

      本程序是一个控制台程序,用户可以根据自己的需求分别输入两个一元多项式,并且能够实现显示输入的一元多项式,再将这两个一元多项式相加,输出结果。

      输入的需求是按照指数从小到大进行输入,并且项数必须为正整数,指数需为整数,系数为双精度型且不能为0.

三、实验代码

#include<iostream>
using namespace std;

struct ListNode///链表的一个结点
{
    double coef;///系数域
    int expn;///指数域
    ListNode* next;///指针域,指向下一个结点
};

void ShowNode(ListNode* p)
{
    double a=p->coef;///指向系数
    int b=p->expn;///指向指数
    if(a==1)///系数为1时
    {
       if(b==0)///输出常数
        cout<<a;
       else if(b==1)///系数为1
        cout<<'x';
       else
        cout<<"x^"<<b;
    }
    else if(a==-1)///系数为-1
    {
        if(b==0)
            cout<<-1;
        else if(b==1)
            cout<<"-x";
        else
            cout<<"-x^"<<b;
    }
    else///系数为其他
    {
        cout<<a;
        if(b==0)///直接输出a系数
            ;
        else if(b==1)
            cout<<'x';
        else
            cout<<"x^"<<b;
    }
}

///多项式连接
void Show(ListNode* p)
{
    ShowNode(p->next);
    p=p->next->next;///首个结点不需要连接符,故指向第二个结点
    while(p)///下一个结点不为空
    {
        if(p->coef>0)///只要下一个结点的系数不为0就输出‘+’
            cout<<'+';
        ShowNode(p);///输出结点连接
        p=p->next;///继续指向下一个结点
    }
}

///输入多项式
ListNode* Print(int i)///传入的i表示该多项式有几项
{
    double a;///系数
    int b;///指数
    ListNode* head=new ListNode;///创建空结点
    head->coef=0;///系数为0
    head->expn=0;///指数为0
    head->next=NULL;///下一个结点为空
    ListNode* p=head;///p取头位置
    for(int k=0;k<i;k++)///循环输入,次数等于项数
    {
        ListNode* pNode=new ListNode;///每次循环创建一个新的尾结点
        cout<<"请输入第"<<k+1<<"项系数:";///k从0开始,故+1
        cin>>a;
        cout<<"请输入第"<<k+1<<"项指数:";
        cin>>b;
        pNode->coef=a;///系数
        pNode->expn=b;///指数
        pNode->next=NULL;
        p->next=pNode;///p的下一个节点就是刚刚建立的结点,于是尾结点改变
        p=pNode;///p指针再次指向尾结点
    }
    cout<<"该多项式为:";
    ListNode* p2=head;///用于显示
    Show(p2);
    return head;///主函数中赋值用
}

///多项式进行相加
ListNode* Add(ListNode* list1,ListNode* list2)
{
    ListNode* p1=list1->next;///定义指针指向第一个多项式的第一项
    ListNode* p2=list2->next;///定义指针指向第二个多项式的第一项
    ///创建和多项式空链表
    ListNode* p3=new ListNode;
    p3->coef=0;
    p3->expn=0;
    p3->next=NULL;
    ListNode* p4=p3;

    while(p1&&p2)///1,2都存在时
    {
        ListNode* pNode=new ListNode;///要插入的新节点
        double coef1=p1->coef;///list1的系数
        int expn1=p1->expn;///list1的指数
        double coef2=p2->coef;///list2的系数
        int expn2=p2->expn;///list2的指数
        if(expn1==expn2)///指数相等时
        {
            if(coef1+coef2!=0)///没有抵消
            {
                pNode->coef=coef1+coef2;///和多项式的系数
                pNode->expn=expn1;///和多项式的指数
                pNode->next=NULL;
                p4->next=pNode;///连接p4和pNode
                p4=pNode;///p4指向pNode,pNode为链表中的最后一个节点
            }
             p1=p1->next;///p1,p2后移
             p2=p2->next;
        }
        if(expn1<expn2)///1的指数比2小,则该项与1重合
        {
            pNode->coef=coef1;
            pNode->expn=expn1;
            pNode->next=NULL;
            p4->next=pNode;
            p4=pNode;
            p1=p1->next;///1继续后指
        }
        if(expn1>expn2)
        {
            pNode->coef=coef2;
            pNode->expn=expn2;
            pNode->next=NULL;
            p4->next=pNode;
            p4=pNode;
            p2=p2->next;
        }
    }
    if(p1==NULL)///p1空了,就把p2直接接在后面
    {
        while(p2)
        {
            ListNode* ppNode=new ListNode;
            ppNode->coef=p2->coef;
            ppNode->expn=p2->expn;
            ppNode->next=NULL;
            p4->next=ppNode;
            p4=ppNode;
            p2=p2->next;
        }
    }
    else if(p2==NULL)///p2空了,就把p1接上去
    {
        while(p1)
        {
            ListNode* ppNode=new ListNode;///新链表存储list1所以剩余项
            ppNode->coef=p1->coef;
            ppNode->expn=p1->expn;
            ppNode->next=NULL;
            p4->next=ppNode;
            p4=ppNode;
            p1=p1->next;
        }
    }
    return p3;
}

///主函数
int main()
{
    int m,n;
    cout<<"请输入第1个多项式的项数:";
    cin>>m;
    ListNode* list1=Print(m);
    cout<<endl;
    cout<<"请输入第2个多项式的项数:";
    cin>>n;
    ListNode* list2=Print(n);
    cout<<endl;
    ListNode* list3=Add(list1,list2);
    cout<<"多项式之和为:";
    Show(list3);
    cout<<endl;
    cout<<"第一个多项式为:";
    Show(list1);
    cout<<endl;
    cout<<"第二个多项式为:";
    Show(list2);
}

程序结果截图

 

  • 5
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java基于单链表存储结构的一元多项式求和运算可以通过以下步骤实现: 1. 定义一个节点类,包含三个属性:系数(coefficient)、指数(exponent)和下一个节点(next)的地址。 2. 定义一个单链表类,包含一个头节点(head)。 3. 创建两个一元多项式的单链表对象,分别存储两个多项式。 4. 对两个多项式的单链表进行遍历,将同一指数的项相加,并将结果存入一个新的单链表中。 5. 返回结果单链表对象。 具体实现可以参考以下Java代码: ``` public class Node { public double coefficient; // 系数 public int exponent; // 指数 public Node next; // 下一个节点的地址 public Node(double coefficient, int exponent) { this.coefficient = coefficient; this.exponent = exponent; this.next = null; } } public class LinkedList { public Node head; // 头节点 public LinkedList() { this.head = new Node(0, 0); // 创建头节点 } // 添加节点 public void addNode(double coefficient, int exponent) { Node node = new Node(coefficient, exponent); Node p = head; while (p.next != null && p.next.exponent > exponent) { p = p.next; } if (p.next != null && p.next.exponent == exponent) { p.next.coefficient += coefficient; } else { node.next = p.next; p.next = node; } } // 多项式求和 public LinkedList add(LinkedList list) { LinkedList result = new LinkedList(); Node p1 = this.head.next; Node p2 = list.head.next; while (p1 != null && p2 != null) { if (p1.exponent > p2.exponent) { result.addNode(p1.coefficient, p1.exponent); p1 = p1.next; } else if (p1.exponent < p2.exponent) { result.addNode(p2.coefficient, p2.exponent); p2 = p2.next; } else { double coefficient = p1.coefficient + p2.coefficient; if (coefficient != 0) { result.addNode(coefficient, p1.exponent); } p1 = p1.next; p2 = p2.next; } } while (p1 != null) { result.addNode(p1.coefficient, p1.exponent); p1 = p1.next; } while (p2 != null) { result.addNode(p2.coefficient, p2.exponent); p2 = p2.next; } return result; } } ``` 使用时,可以先创建两个多项式的单链表对象,然后调用add方法求和,最后遍历结果单链表输出即可。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值