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

该代码实现了一元多项式的链式存储表示,包括创建链表、排序、相加及输出功能。通过输入两个多项式,程序能完成对它们的合并,并遵循指数相同的项系数相加,指数不同的项分别保留的规则。最后,展示了多项式相加的结果。
摘要由CSDN通过智能技术生成

一元多项式的表示和相加

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);                                                          //输出多项式链表
}
 
为了编写一个程序,我们可以首先定义一个`Node`类表示多项式的项,包括系数和指数。然后创建一个`PolynomialList`类用于管理单链表结构,其中包含一个头部节点和相关的操作方法,如添加项、合并两个多项式等。 ```python class Node: def __init__(self, coefficient=0, exponent=0): self.coefficient = coefficient self.exponent = exponent self.next = None class PolynomialList: def __init__(self): self.head = None # 添加项到链表 def add_term(self, coefficient, exponent): new_node = Node(coefficient, exponent) if not self.head: self.head = new_node else: current = self.head while current.next and current.next.exponent >= exponent: current = current.next new_node.next = current.next current.next = new_node # 合并两个多项式 def merge_polynomials(self, other): combined_list = PolynomialList() current_a = self.head current_b = other.head while current_a and current_b: a_coeff = current_a.coefficient b_coeff = current_b.coefficient if current_a.exponent > current_b.exponent: combined_list.add_term(a_coeff, current_a.exponent) current_a = current_a.next elif current_a.exponent < current_b.exponent: combined_list.add_term(b_coeff, current_b.exponent) current_b = current_b.next else: # 当两项指数相同时,取较大系数 combined_list.add_term(max(a_coeff, b_coeff), current_a.exponent) current_a = current_a.next current_b = current_b.next # 如果还有剩余的项,则逐个添加 while current_a: combined_list.add_term(current_a.coefficient, current_a.exponent) current_a = current_a.next while current_b: combined_list.add_term(current_b.coefficient, current_b.exponent) current_b = current_b.next return combined_list # 示例: polynomial_A = PolynomialList() polynomial_B = PolynomialList() # 分别为A和B添加项... # ... sum_poly = polynomial_A.merge_polynomials(polynomial_B) ``` 这个程序首先定义了单链表中的节点,并实现了多项式链表的基本操作。`merge_polynomials`函数负责合并两个多项式,按照题目要求将结果按降序排列。你可以根据实际需求,补充添加项到`polynomial_A`和`polynomial_B`的具体代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

卦拾伍

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

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

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

打赏作者

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

抵扣说明:

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

余额充值