多项式相加(数据与结构)

一、实验目的:

 1.掌握用 C语言调试程序的基本方法。

 2.掌握链表的建立、多项式的加减法。

二、实验题目设计一个一元稀疏多项式的加减运算。

如:,  

 三、实验要求 1. 通过键盘输入两个任意多项式。

先输入第一个多项式,然后输入第二个多项式。

对每个多项式,先输入“项数”、分别输入各个元素的“指数”、“ 系数”。

2. 形如以下输出:A(x)=:7x^0+3x^1+9x^8+5x^17B(x)=:8x^1+22x^7-9x^8 A(x)+B(x)=:7x^0+11x^1+22x^7+5x^17A(x)*B(x)=:对于空多项式请输出:0。

其中系数为1的项照样数1,指数为0、1照样把指数和系数输出来。四、实验方法 可以通过链表实现。结点结构可以是:

typedef struct Lnode

{ int coef;//多项式系数

int expo n;//多项式指数

struct Lnode *next;//下一个结点

}poly_node,* polynomial;
 

请输入第1个多项式系数,和指数:
coef,exp=       3 3
请输入第2个多项式系数,和指数:
coef,exp=       -2 2
请输入第3个多项式系数,和指数:
coef,exp=       5 0
请输入第4个多项式系数,和指数:
coef,exp=       4 4
请输入多项式的项数:n=
5
请输入第1个多项式系数,和指数:
coef,exp=       -1 1
请输入第2个多项式系数,和指数:
coef,exp=       2 2
请输入第3个多项式系数,和指数:
coef,exp=       4 4
请输入第4个多项式系数,和指数:
coef,exp=       3 3
请输入第5个多项式系数,和指数:
coef,exp=       4 0
A(x)=:4x^4+3x^3-2x^2+5

B(x)=:4x^4+3x^3+2x^2-1x^1+4

A(x)+B(x)=:8x^4+6x^3-1x^1+9


Process returned 0 (0x0)   execution time : 38.428 s

 

#include <iostream>
#include<stdlib.h>

#define ElemType1 int
#define ElemType2 int
using namespace std;


typedef struct Lnode{
    ElemType1 coef;//多项式系数
    ElemType2 n;//多项式指数
struct Lnode *next;//下一个结点
}poly_node,* polynomial;

void InitPoly_node(polynomial &L)
{
    L=(poly_node*)malloc(sizeof(poly_node));
    if(L==NULL)
    {
        cout<<"分配空间失败"<<endl;
        return;
    }
    L->next=NULL;
}
void InputPolynominal(polynomial &L) //n位多项式的项数
{
    cout<<"请输入多项式的项数:n="<<endl;
    int n;
    cin>>n;
     poly_node *p=L;
    for(int i=0;i<n;i++)
    {
        cout<<"请输入第"<<i+1<<"个多项式系数,和指数:"<<endl;
        ElemType1 coef;
        ElemType2 exp;
        cout<<"coef,exp="<<'\t';
        cin>>coef;
        cin>>exp;
        poly_node *s=(poly_node*)malloc(sizeof(poly_node));
        if(s==NULL)
        {
        cout<<"分配空间失败"<<endl;
        return;
        }
        s->coef=coef;
        s->n=exp;
         s->next=p->next;
        p->next=s;
        p=s;
    }
}
void BubbleSortPolynominal(polynomial &L)
{
	int i,count = 0,num;//count记录链表结点的个数,num进行内层循环,
	poly_node *p,*q,*tail;//创建三个指针,进行冒泡排序
	p = L;
	while(p->next != NULL)//计算出结点的个数
	{
		count++;//注释①
		p = p->next;
	}
	for(i=0;i < count - 1;i++)//外层循环,跟数组冒泡排序一样
	{
		num = count - i - 1;//记录内层循环需要的次数,跟数组冒泡排序一样,
		q=L->next;//令q指向第一个结点
		p=q->next;//令p指向后一个结点
		tail=L;//让tail始终指向q前一个结点,方便交换,也方便与进行下一步操作
		while(num--)//内层循环 次数跟数组冒泡排序一样
		{
			if(q->n < p->n)//如果该结点的值大于后一个结点,则交换
			{
				q->next=p->next;
				p->next=q;
				tail->next=p;
			}
				tail = tail->next;//注释②
				q=tail->next;//注释②
				p=q->next;//注释②
		 }
	}
}
void PrintPolynominal(polynomial L)
{
    L=L->next;
    if(L->n==0) cout<<L->coef;
    else cout<<L->coef<<"x^"<<L->n;
    L=L->next;
    while(L!=NULL)
    {
        if(L->n==0){
        if(L->coef>0)
       cout<<'+'<<L->coef;
       else if(L->coef<0)
       cout<<L->coef;
       else{}
        }
        else{
        if(L->coef>0)
       cout<<'+'<<L->coef<<"x^"<<L->n;
       else if(L->coef<0)
       cout<<L->coef<<"x^"<<L->n;
       else{}
        }

        L=L->next;
    }
    cout<<endl;
}
polynomial AdditionPolynomial(polynomial a,polynomial b)
{
    polynomial c=(poly_node*)malloc(sizeof(poly_node));
    if(c==NULL)
    {
        cout<<"分配空间失败"<<endl;
        return NULL;
    }
    c->next=NULL;
    poly_node *pa=a->next,*pb=b->next,*pc=c;
      while(pa&&pb){
        if(pa->n<pb->n){
        poly_node * s=(poly_node*)malloc(sizeof(poly_node));
            s->n=pb->n;
            s->coef=pb->coef;
            s->next=pc->next;
            pc->next=s;
            pc=s;
            pb=pb->next;
        }
        else if(pa->n>pb->n){
            poly_node * s=(poly_node*)malloc(sizeof(poly_node));
            s->n=pa->n;
            s->coef=pa->coef;
            s->next=pc->next;
            pc->next=s;
            pc=s;
            pa=pa->next;
        }
        else{
            ElemType1 sum=pa->coef+pb->coef;
            if(sum!=0){
               poly_node * s=(poly_node*)malloc(sizeof(poly_node));
                s->coef=sum;
                s->n=pa->n;
                s->next=pc->next;
                pc->next=s;
                pc=s;
                pa=pa->next;
                pb=pb->next;
                }
            else{
                pa=pa->next;
                pb=pb->next;
            }
        }
    }
    if(pa == NULL &&pb== NULL)
        pc->next = NULL;
    if(pa!=NULL){
        pc->next = pa;
    }
    if(pb!=NULL){
        pc->next = pb;
    }
    return c;
}





int main()
{
    polynomial La,Lb;
    InitPoly_node(La);
    InputPolynominal(La);
    BubbleSortPolynominal(La);
    InitPoly_node(Lb);
    InputPolynominal(Lb);
    BubbleSortPolynominal(Lb);
    polynomial Lc=AdditionPolynomial(La,Lb);
    cout<<"A(x)=:";
      PrintPolynominal(La);
      cout<<'\n';
      cout<<"B(x)=:";
     PrintPolynominal(Lb);
      cout<<'\n';
     cout<<"A(x)+B(x)=:";
      PrintPolynominal(Lc);
      cout<<'\n';
    return 0;
}

 如果要想项数时递增排列,直接修改冒泡排序的

if(q->n < p->n)//如果该结点的值大于后一个结点,则交换
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

梦灵-影

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值