一元多项式的表示及加减乘除运算

原创 2015年07月07日 17:01:34
例如:如何实现用线性链表表示多项式的加法运算?

根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项;对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。

#include <stdio.h>  
#include <stdlib.h>  
#include <malloc.h>  
  
typedef struct polyn  
{  
    float coef;  
    int expn;  
    struct polyn* next;  
}PolyNode,*PLinkList;  
  
PLinkList CreatePolyn();//创建一元多项式,使一元多项式呈指数递减  
void OutPut(PLinkList head);//输出一元多项式  
PLinkList Addition(PLinkList L1,PLinkList L2);//多项式的加法  
PLinkList Subtraction(PLinkList L1,PLinkList L2);//多项式的减法  
PLinkList Reverse(PLinkList head);//将生成的链表逆置,使一元多项式呈指数递增形式  
PLinkList MultiplyPolyn(PLinkList L1,PLinkList L2);//多项式的乘法 





#include "test.h"  
  
  
PLinkList CreatePolyn()//创建一元多项式,使一元多项式呈指数递减  
{  
    PolyNode *p,*q,*s;  
    PolyNode *head = NULL;  
    int expn2;  
    float coef2;  
    head = (PLinkList)malloc(sizeof(PolyNode));//动态生成头结点  
    if(!head)  
    {  
        return NULL;  
    }  
    head->coef = 0.0;//初始化  
    head->expn = 0;  
    head->next = NULL;  
    do  
    {  
        printf("输入系数coef(系数和指数都为0结束)");  
        scanf("%f",&coef2);  
        printf("输入指数数exp(系数和指数都为0结束)");  
        scanf("%d",&expn2);  
        if((long)coef2 == 0 && expn2 == 0)  
        {  
            break;  
        }  
        s = (PLinkList)malloc(sizeof(PolyNode));  
        if(!s)  
        {  
            return NULL;  
        }  
        s->expn = expn2;  
        s->coef = coef2;  
        q = head->next ;  
        p = head;  
        while(q && expn2 < q->expn)  
        {  
            p = q;  
            q = q->next ;  
        }  
        if(q == NULL || expn2 > q->expn)  
        {  
            p->next = s;  
            s->next = q;  
        }  
        else  
        {  
            q->coef += coef2;  
        }  
    }while(1);  
    return head;  
}  
  
void OutPut(PLinkList head)//输出一元多项式  
{  
    PolyNode *p = head->next ;  
    while(p)  
    {  
        printf("%1.1f",p->coef);  
        if(p->expn)  
        {  
            printf("*x^%d",p->expn);  
        }  
        if(p->next && p->next->coef > 0)  
        {  
            printf("+");  
        }  
        p = p->next ;  
    }  
}  
  
PolyNode *Addition(PLinkList L1,PLinkList L2)//多项式的加法  
{  
    PolyNode *pa,*pb,*pc,*u,*head;  
    head = (PLinkList)malloc(sizeof(PolyNode));  
    if(!head)  
    {  
        return NULL;  
    }  
    head->coef = 0.0;  
    head->expn = 0;  
    head->next = NULL;  
    pc = head;  
    L2 = Reverse(L2);  
    pa = L1->next ;  
    pb = L2->next ;  
    while(pa != NULL && pb != NULL)  
    {  
        if(pa->expn == pb->expn)  
        {  
            u = (PLinkList)malloc(sizeof(PolyNode));  
            if(!u)  
            {  
                return NULL;  
            }  
            u->coef = pa->coef + pb->coef ;  
            u->expn = pa->expn ;  
            pa = pa->next ;  
            pb = pb->next ;  
            u->next = pc->next ;  
            pc->next = u;  
            pc = u;  
        }  
        else if(pa->expn > pb->expn)  
        {  
            u = (PLinkList)malloc(sizeof(PolyNode));  
            if(!u)  
            {  
                return NULL;  
            }  
            u->coef = pa->coef ;  
            u->expn = pa->expn ;  
            pa = pa->next ;  
            u->next = pc->next ;  
            pc->next = u;  
            pc = u;  
        }  
        else  
        {  
            u = (PLinkList)malloc(sizeof(PolyNode));  
            if(!u)  
            {  
                return NULL;  
            }  
            u->coef = pb->coef ;  
            u->expn = pb->expn ;  
            pb = pb->next ;  
            u->next = pc->next ;  
            pc->next = u;  
            pc = u;  
        }  
    }  
    L2 = Reverse(L2);  
    return head;  
}  
  
PolyNode *Subtraction(PLinkList L1,PLinkList L2)//多项式的减法  
{  
    PolyNode *pa,*pb,*pc,*u,*head;  
    head = (PLinkList)malloc(sizeof(PolyNode));  
    if(!head)  
    {  
        return NULL;  
    }  
    head->coef = 0.0;  
    head->expn = 0;  
    head->next = NULL;  
    pc = head;  
    pa = L1->next ;  
    pb = L2->next ;  
    while(pa != NULL && pb != NULL)  
    {  
        if(pa->expn == pb->expn)  
        {  
            u = (PLinkList)malloc(sizeof(PolyNode));  
            if(!u)  
            {  
                return NULL;  
            }  
            u->coef = pa->coef - pb->coef ;  
            u->expn = pa->expn ;  
            pa = pa->next ;  
            pb = pb->next ;  
            u->next = pc->next ;  
            pc->next = u;  
            pc = u;  
        }  
        else if(pa->expn > pb->expn)  
        {  
            u = (PLinkList)malloc(sizeof(PolyNode));  
            if(!u)  
            {  
                return NULL;  
            }  
            u->coef = pa->coef ;  
            u->expn = pa->expn ;  
            pa = pa->next ;  
            u->next = pc->next ;  
            pc->next = u;  
            pc = u;  
        }  
        else  
        {  
            u = (PLinkList)malloc(sizeof(PolyNode));  
            if(!u)  
            {  
                return NULL;  
            }  
            u->coef = pb->coef ;  
            u->expn = pb->expn ;  
            pb = pb->next ;  
            u->next = pc->next ;  
            pc->next = u;  
            pc = u;  
        }  
    }  
    return head;  
}  
  
PolyNode *Reverse(PLinkList head)//将生成的链表逆置,使一元多项式呈指数递增形式  
{  
    PolyNode *q,*r,*p = NULL;  
    q = head->next ;  
    while(q)  
    {  
        r = q->next ;  
        q->next = p;  
        p = q;  
        q = r;  
    }  
    head->next = p;  
    return head;  
}  
  
PolyNode *MultiplyPolyn(PLinkList L1,PLinkList L2)//多项式的乘法  
{  
    PolyNode *pa,*pb,*pc,*u,*head;  
    int k,maxExp;  
    float coef;  
    head = (PLinkList)malloc(sizeof(PolyNode));  
    if(!head)  
    {  
        return NULL;  
    }  
    head->coef = 0.0;  
    head->expn = 0;  
    head->next = NULL;  
    if(L1->next != NULL && L2->next != NULL)  
    {  
        maxExp = L1->next->expn +L2->next->expn ;  
    }  
    else  
    {  
        return head;  
    }  
    pc = head;  
    L2 = Reverse(L2);  
    for(k = maxExp;k >= 0;k--)  
    {  
        pa = L1->next ;  
        while(pa != NULL && pa->expn > k)  
        {  
            pa = pa->next ;  
        }  
        pb = L2->next ;  
        while(pb != NULL && pa != NULL && pa->expn+pb->expn < k)  
        {  
            pb= pb->next ;  
        }  
        coef = 0.0;  
        while(pa != NULL && pb != NULL)  
        {  
            if(pa->expn +pb->expn == k)  
            {  
                coef += pa->coef *pb->coef ;  
                pa = pa->next ;  
                pb = pb->next ;  
            }  
            else if(pa->expn +pb->expn > k)  
            {  
                pa = pa->next ;  
            }  
            else  
            {  
                pb = pb->next ;  
            }  
        }  
        if(coef != 0.0)  
        {  
            u = (PLinkList)malloc(sizeof(PolyNode));  
            u->coef = coef;  
            u->expn = k;  
            u->next = pc->next ;  
            pc->next = u;  
            pc = u;  
        }  
    }  
    L2 = Reverse(L2);  
    return head;  
}  





#include "test.h"  
  
int main(void)  
{  
    PLinkList A,B,C,D,E;  
    A = CreatePolyn();  
    printf("A(x) =");  
    OutPut(A);  
    printf("\n");  
    B = CreatePolyn();  
    printf("B(x) =");  
    OutPut(B);  
    printf("\n");  
    C = MultiplyPolyn(A,B);  
    printf("C(x) = A(x)*B(x) =");  
    OutPut(C);  
    printf("\n");  
    D = Addition(A,B);  
    printf("D(x) = A(x)+B(x) =");  
    OutPut(D);  
    printf("\n");  
    E = Subtraction(A,B);  
    printf("E(x) = A(x)-B(x) =");  
    OutPut(E);  
    printf("\n");  
    return 0;  
}  


版权声明:本文为博主原创文章,未经博主允许不得转载。

一元多项式的加减法

设有两个一元多项式A(x),B(x),请完成运算A(x)+B(x)、A(x)-B(x),要求多项式采用链表进行存储。另外该任务要求具有建立多项式链表以及输出多项式到屏幕的功能。 首先确定数据结构 st...
  • linnzl
  • linnzl
  • 2016年04月21日 23:55
  • 1177

一元多项式化简

背景: 编程实现如下功能:对输入的一元多项式,进行同类项合并,并按指数降序排序,输出处理后的一元多项式。   说明:  l 多项式由若干个单项式组成,单项式之间为加、减(+,-)关系。 l ...
  • sxh850297968
  • sxh850297968
  • 2015年07月07日 19:22
  • 1632

数据结构(3)--线性表实现一元多项式加法

1.简要说明     一元多项式的表示和相加     多项式Pn(x)按升幂可写成:                 Pn(x) = P0+P1*x+p2*x^2+...+Pn*x^n,     它由...
  • u010366748
  • u010366748
  • 2016年02月05日 00:00
  • 7068

一元多项式

  • 2011年12月12日 12:22
  • 6KB
  • 下载

一元多项式的加减乘除运算,C++语言描述,数据结构实验

#include #include #include  //标准库头文件包含函数exit() using namespace std; struct Node     //建立结构体 {     fl...
  • Icarus_
  • Icarus_
  • 2015年09月27日 11:32
  • 2384

一元多项式运算器

一.问题描述:设计一个一元多项式P=p0+p1x+p2x*2......+pnx*n的合适的数据结构,并支持两个多项式的下列运算:1.建立;2.输出;3.相加;4.相减;5.相乘;6.求导。二.数据结...
  • los_ATend
  • los_ATend
  • 2016年11月08日 22:45
  • 444

数据结构一元多项式运算分析

一元多项式的加法,减法,乘法用到比较多的是插入,删除操作。所以一般选择单链表作为存储结构。每个结点分别有系数,指针作为数据域,以及指针域。 算法实现: 一.一元多项式加法: 1.建立多项式:尾插...
  • smile_3229
  • smile_3229
  • 2014年09月27日 22:33
  • 1197

一元多项式的建立及其运算

在表处理时经常遇到的问题是多项式的表示和运算。所以如何建立一个符合多项式的结构是十分重要的。 (一)一元多项式的表示:    一种方法是用顺序表表示,即顺序表的物理位置存储的是多项式中x的指数,而...
  • Pursue_success
  • Pursue_success
  • 2016年02月05日 14:28
  • 1589

一元多项式的运算 数据结构课程设计

  • 2011年06月11日 20:14
  • 398KB
  • 下载

多项式加法运算

1. 综述: 2. 多项式加法运算: 采用不带头结点的单向链表,按照指数递减的顺序排列各项 typedef struct PolyNode { int coef; //系数 int ex...
  • u013354805
  • u013354805
  • 2016年04月02日 10:19
  • 417
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:一元多项式的表示及加减乘除运算
举报原因:
原因补充:

(最多只允许输入30个字)