算法与数据结构——一元多项式的表示和相加

一元多项式的表示和相加

1,实验目的

用户可以通过键盘输入两个多项式,并非能够实现输入的一元多项式的显示,能够完成各项的排序,以及两个一元多项式的相加。
掌握链表的表示方法及存储。
掌握链表的操作。

2,实验内容

一个一元多项式的每一个子项都由“系数-指数”两部分组成,因此课抽象为包含系数coef,指数exp,指针域next构成的链式线性表。将两个多项式分别存放在两个线性表中,然后经过相加后将所得的多项式放入一个新的线性表里,然后进行打印。
利用链表实现一元多项式的表示和相加。通过main()函数调用实现。包括建立链表函数,输出链表函数,链表排序函数,链表相加函数。采用链式存储结构,将两个线性链表表示的一元多项式相加,并输出。此一元多项式遵循多项式相加运算规则:对于两个一元多项式中存在指数相同的项时,其对应系数相加:合并时系数和为零时,删除“和多项式”中此项;合并时系数和不为零时,则构成“和多项式”中的一项。对于两个一元多项式中存在的指数不相同的项,则分别复抄到“和多项式”中去,原多项式保持不变。

3,代码展示

//一元多项式的表示及相加
//打开相应库文件
//定义多项式最大项数
#include <stdio.h>
#include <malloc.h>
#define MAX 20
//定义单链表结点类型
typedef struct pnode
{
float coef;
int exp;
struct pnode* next;
}PolyNode;
//定义存放多项式的数组类型
typedef struct
{float coef;
int exp;
}PolyArray[MAX]; ;

//一元多项式的表示(建立多项式链表)
void CreateListR(PolyNode*& L, PolyArray a, int n)
{
PolyNode* s, * r; int i;
L = (PolyNode*)malloc(sizeof(PolyNode));
L->next = NULL;
r = L;
for (i = 0; i < n; i++) {
s = (PolyNode*)malloc(sizeof(PolyNode));
s->coef = a[i].coef;
s->exp = a[i].exp;
s->next = NULL;
r->next = s;
r = s; }
r->next = NULL;}
//原多项式链表排序
void Sort(PolyNode*& head)
{
PolyNode* p = head->next, * q, * r;
if (p != NULL) {
r = p->next;
p->next = NULL;
p = r;
while (p != NULL) {
r = p->next;
q = head;
while (q->next != NULL && q->next->exp > p->exp)
q = q->next;
p->next = q->next;
q->next = p;
p = r; }}}
//一元多项式的相加
void Add(PolyNode* ha,PolyNode* hb, PolyNode*& hc)
{
PolyNode* pa = ha->next, * pb = hb->next, * s, * tc;
float c;
hc = (PolyNode*)malloc(sizeof(PolyNode));
tc = hc;
while (pa != NULL && pb != NULL)
{ if (pa->exp > pb->exp){
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp; s->coef = pa->coef;
s->next = NULL;
tc->next = s; tc = s;
pa = pa->next;
}else if (pa->exp < pb->exp)
{ s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pb->exp; s->coef = pb->coef;
s->next = NULL;
tc->next = s; tc = s;
pb = pb->next; }
else {c = pa->coef + pb->coef;
if ©
{ s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp; s->coef = c;
s->next = NULL;
tc->next = s; tc = s; }
pa = pa->next;
pb = pb->next;} }
if (pb != NULL) pa = pb;
while (pa != NULL)
{
s = (PolyNode*)malloc(sizeof(PolyNode));
s->exp = pa->exp; s->coef = pa->coef;
s->next = NULL;
tc->next = s; tc = s;
pa = pa->next;
}
tc->next = NULL;
}//输出多项式链表
void DispPoly(PolyNode* L)
{
PolyNode* p = L->next;
while (p != NULL)
{
printf(“%gX^%d+”, p->coef, p->exp); p = p->next; }
printf(“\b “);
printf(”\n\n”);
}//主函数的设定及调用
void main()
{PolyNode* ha, * hb, * hc; //单链表结点类型
PolyArray a = { {1.2 ,0}, {2.5,1} ,{3.2,3} ,{-2.5,5} }; //存放多项式a的数组类型
PolyArray b = { {-1.2,0}, {2.5,1}, {3.2,3} ,{2.5,5} ,{5.4,10} };//存放多项式b的数组类型
CreateListR(ha, a, 4); //一元多项式的表示(建立多项式链表)
CreateListR(hb, b, 5); //一元多项式的表示(建立多项式链表)
printf(“原 多项式A:”);
DispPoly(ha); //输出多项式链表
printf(“原 多项式B:”);
DispPoly(hb); //输出多项式链表
Sort(ha); //原多项式链表排序
Sort(hb); //原多项式链表排序
printf(“有序多项式A:”);
DispPoly(ha); //输出多项式链表
printf(“有序多项式B:”);
DispPoly(hb); //输出多项式链表
Add(ha, hb, hc); //一元多项式的相加
printf(“多项式相 加:”);
DispPoly(hc); //输出多项式链表
}

4,运行展示在这里插入图片描述

在这里插入代码片
//一元多项式的表示及相加
//打开相应库文件
//定义多项式最大项数
#include   <stdio.h>
#include   <malloc.h>
#define   MAX  20
//定义单链表结点类型
typedef   struct  pnode
{
    float  coef;
    int   exp;
    struct  pnode* next;
}PolyNode;
//定义存放多项式的数组类型
typedef   struct
{float  coef;
 int   exp;
}PolyArray[MAX]; ;

//一元多项式的表示(建立多项式链表)
void  CreateListR(PolyNode*& L, PolyArray a, int  n)
{
    PolyNode* s, * r; int i;
    L = (PolyNode*)malloc(sizeof(PolyNode));
    L->next = NULL;
    r = L;
    for (i = 0; i < n; i++)
    {
        s = (PolyNode*)malloc(sizeof(PolyNode));
        s->coef = a[i].coef;
        s->exp = a[i].exp;
        s->next = NULL;
        r->next = s;
        r = s;
    }
    r->next = NULL;
}

//原多项式链表排序
void Sort(PolyNode*& head)
{
    PolyNode* p = head->next, * q, * r;
    if (p != NULL)
    {
        r = p->next;
        p->next = NULL;
        p = r;
        while (p != NULL)
        {
            r = p->next;
            q = head;
            while (q->next != NULL && q->next->exp > p->exp)
                q = q->next;
            p->next = q->next;
            q->next = p;
            p = r;
        }
    }
}

//一元多项式的相加
void Add(PolyNode* ha,PolyNode* hb, PolyNode*& hc)
{
    PolyNode* pa = ha->next, * pb = hb->next, * s, * tc;
    float c;
    hc = (PolyNode*)malloc(sizeof(PolyNode));
    tc = hc;
    while (pa != NULL && pb != NULL)
    {
        if (pa->exp > pb->exp)
        {
            s = (PolyNode*)malloc(sizeof(PolyNode));
            s->exp = pa->exp; s->coef = pa->coef;
            s->next = NULL;

            tc->next = s; tc = s;
            pa = pa->next;
        }
        else if (pa->exp < pb->exp)
        {
            s = (PolyNode*)malloc(sizeof(PolyNode));
            s->exp = pb->exp; s->coef = pb->coef;
            s->next = NULL;
            tc->next = s; tc = s;
            pb = pb->next;
        }

        else {
            c = pa->coef + pb->coef;
            if (c)
            {
                s = (PolyNode*)malloc(sizeof(PolyNode));
                s->exp = pa->exp; s->coef = c;
                s->next = NULL;
                tc->next = s; tc = s;
            }
            pa = pa->next;
            pb = pb->next;
        }
    }
    if (pb != NULL) pa = pb;
    while (pa != NULL)
    {
        s = (PolyNode*)malloc(sizeof(PolyNode));
        s->exp = pa->exp; s->coef = pa->coef;
        s->next = NULL;
        tc->next = s; tc = s;
        pa = pa->next;
    }
    tc->next = NULL;
}

//输出多项式链表
void  DispPoly(PolyNode* L)
{
    PolyNode* p = L->next;
    while (p != NULL)
    {
        printf("%gX^%d+", p->coef, p->exp); p = p->next;
      
    }
    printf("\b ");
    printf("\n\n");
}

//主函数的设定及调用
void main()
{
    PolyNode* ha, * hb, * hc;                                              //单链表结点类型
    PolyArray a = { {1.2 ,0}, {2.5,1} ,{3.2,3} ,{-2.5,5} };         //存放多项式a的数组类型
    PolyArray b = { {-1.2,0}, {2.5,1}, {3.2,3} ,{2.5,5} ,{5.4,10} };//存放多项式b的数组类型

    CreateListR(ha, a, 4);                              //一元多项式的表示(建立多项式链表)
    CreateListR(hb, b, 5);                              //一元多项式的表示(建立多项式链表)
    printf("原  多项式A:");
    DispPoly(ha);                                                          //输出多项式链表
    printf("原  多项式B:");
    DispPoly(hb);                                                          //输出多项式链表

    


    Sort(ha);                                                            //原多项式链表排序
    Sort(hb);                                                            //原多项式链表排序
    printf("有序多项式A:");
    DispPoly(ha);                                                          //输出多项式链表
    printf("有序多项式B:");
    DispPoly(hb);                                                          //输出多项式链表

    Add(ha, hb, hc);                                                     //一元多项式的相加
    printf("多项式相 加:");
    DispPoly(hc);                                                          //输出多项式链表
}
 
  • 1
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
合并一元多项式的同类项可以按照以下步骤进行: 1. 定义一个新的链表用于存储合并后的多项式。 2. 遍历原始多项式链表,将每一项的指数作为新链表的下标,将系数相加作为新链表该下标处的值。 3. 如果新链表某一项的值为0,则删除该项。 4. 将新链表按照指数从大到小排序,得到最终的合并后的多项式。 以下是一个Java实现的例子: ```java public class Polynomial { private Lnode head; // 定义多项式类的其他方法 // 合并同类项 public void merge() { Lnode newHead = new Lnode(0, 0); Lnode p = head; Lnode q = newHead; // 遍历原始多项式链表 while (p != null) { int exp = p.exp; float coef = p.coef; // 在新链表中查找是否已经存在该指数的项 Lnode r = newHead; while (r.next != null && r.next.exp > exp) { r = r.next; } // 如果存在,则将系数相加 if (r.next != null && r.next.exp == exp) { r.next.coef += coef; } else { // 否则插入新的项 Lnode node = new Lnode(coef, exp); node.next = r.next; r.next = node; } p = p.next; } // 删除系数为0的项 Lnode r = newHead; while (r.next != null) { if (r.next.coef == 0) { r.next = r.next.next; } else { r = r.next; } } // 将新链表按照指数从大到小排序 head = newHead.next; sort(); } // 按照指数从大到小排序 private void sort() { if (head == null || head.next == null) { return; } Lnode p = head.next; head.next = null; while (p != null) { Lnode q = p.next; insert(p); p = q; } } // 将节点插入到合适的位置 private void insert(Lnode node) { Lnode p = head; while (p.next != null && p.next.exp > node.exp) { p = p.next; } node.next = p.next; p.next = node; } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卦拾伍

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

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

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

打赏作者

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

抵扣说明:

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

余额充值