6-43 有序稀疏多项式求和

本题求两个有序多项式的求和,输入的多项式有两项:系数和指数。

多项式采用链式存储,并按指数从小到大排列。

输出时也按指数从小到大的顺序输出。

(数据输入时按指数从小到大顺序输入,输入0 0时表示结束。构造部分已完成,不需自己编写)

为简化链表构造,默认构造链表为加监督元单链表。

函数接口定义:

ptr add(ptr ha,ptr hb);

add是两个有序链表ha,hb进行相加运算,构成一个新的链表返回,原链表ha,hb保留。

裁判测试程序样例:

#include <stdio.h>
#include <math.h>
#include <malloc.h>
#define N 5

typedef struct node
{
    float ceof;
    int exp;
    struct node *next;
}node,*ptr;

ptr creat();//表尾插入法构造链表,在此不表
ptr add(ptr ha,ptr hb);

void output(ptr h)
{
    ptr p;
    p=h->next;
    while(p!=NULL)
    {
        printf("%+.1fx^%d",p->ceof,p->exp);
        p=p->next;
    }
    printf("\n");
}

int main()
{
    ptr h1,h2,h3;
    h1=creat();
    h2=creat();
    h3=add(h1,h2);
    output(h1);
    output(h2);
    output(h3);
    return 0;
}

/* 请在这里填写答案 */

输入样例:

-19  0
21  2
90.2  5
100  10
18  92
0  0
19  0
-21  2
65  4
-8  5
43.6  14
0  0

结尾无空行

输出样例:

-19.0x^0+21.0x^2+90.2x^5+100.0x^10+18.0x^92
+19.0x^0-21.0x^2+65.0x^4-8.0x^5+43.6x^14
+65.0x^4+82.2x^5+100.0x^10+43.6x^14+18.0x^92

 思路:根据题目可以知道这里我们要对两个有序链表进行相加减,构造链表部分题目已经给我们完成了(该死的题目把这部分代码隐藏了,有需要的小伙伴可以联系我哦),首先原链表要保留,我们肯定需要新建一个链表去存放系数多项式相加的结果,看到这里有小伙伴可能会问,怎么保证有序?嗯。。。。题目已经给你造好了,不用管,直接比较相加就行,废话不多说,上代码。

上代码: 

ptr add(ptr ha, ptr hb)
{
    ptr h, s, p;
    h = s=(ptr)malloc(sizeof(node));//新建一个链表用来存放两个链表相加后的结果
    ha=ha->next;//带头的单向链表,记得尾结点赋值为空啊
    hb=hb->next;
    while (ha&&hb)//这是对两个链表相同的长度进行运算,有的表可能长,有的可能短,这个时候以短的                
                  //链表长度为准进行比较,长的那部分,直接拿过来
    {
        if (ha->exp < hb->exp) //比较指数大小
        {
            p = (ptr)malloc(sizeof(node));
            p=ha;
            ha = ha->next;
            s->next = p;
            s = p;
        }
        else if(ha->exp==hb->exp)
        {
            p = (ptr)malloc(sizeof(node));
            if(ha->ceof+hb->ceof==0)
            {
            ha=ha->next;
            hb=hb->next;
            }
            else
            {
                p->exp=ha->exp;
                p->ceof=ha->ceof+hb->ceof;
                ha=ha->next;
                hb=hb->next;
                s->next=p;
                s=p;
            }
        }
        else
        {
            p = (ptr)malloc(sizeof(node));
            p=hb;
            hb = hb->next;
            s->next = p;
            s = p;
        }
    }
    while (ha != NULL)//对长的那部分进行操作
    {
        p = (ptr)malloc(sizeof(node));
        p=ha;
        ha = ha->next;
        s->next = p;
        s = p;
    }
    while (hb != NULL)
    {
        p = (ptr)malloc(sizeof(node));
        p=hb;
        hb = hb->next;
        s->next = p;
        s = p;
    }
    s->next =NULL;//尾结点的值置空哦
    return h;//返回新链表的头结点,还要输出呢
}

 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
好的,以下是用单链表实现稀疏多项式求和C语言代码示例: ```c #include <stdio.h> #include <stdlib.h> // 定义链表节点 typedef struct Node { int coef; // 系数 int exp; // 指数 struct Node* next; // 指向下一个节点的指针 } node; // 创建节点 node* create_node(int coef, int exp) { node* new_node = (node*)malloc(sizeof(node)); new_node->coef = coef; new_node->exp = exp; new_node->next = NULL; return new_node; } // 插入节点 void insert_node(node** head, node* new_node) { node* p = *head; node* prev = NULL; while (p != NULL && p->exp > new_node->exp) { prev = p; p = p->next; } if (p != NULL && p->exp == new_node->exp) { p->coef += new_node->coef; free(new_node); } else { if (prev == NULL) { *head = new_node; } else { prev->next = new_node; } new_node->next = p; } } // 读取多项式 node* read_poly() { node* head = NULL; int n, coef, exp; printf("请输入多项式项数:"); scanf("%d", &n); for (int i = 0; i < n; i++) { printf("请输入第%d项的系数指数:", i+1); scanf("%d%d", &coef, &exp); node* new_node = create_node(coef, exp); insert_node(&head, new_node); } return head; } // 输出多项式 void print_poly(node* head) { node* p = head; while (p != NULL) { printf("%dX^%d", p->coef, p->exp); if (p->next != NULL) { printf("+"); } p = p->next; } printf("\n"); } // 多项式求和 node* add_poly(node* poly1, node* poly2) { node* head = NULL; node* p1 = poly1; node* p2 = poly2; while (p1 != NULL && p2 != NULL) { if (p1->exp > p2->exp) { insert_node(&head, create_node(p1->coef, p1->exp)); p1 = p1->next; } else if (p1->exp < p2->exp) { insert_node(&head, create_node(p2->coef, p2->exp)); p2 = p2->next; } else { int sum = p1->coef + p2->coef; if (sum != 0) { insert_node(&head, create_node(sum, p1->exp)); } p1 = p1->next; p2 = p2->next; } } while (p1 != NULL) { insert_node(&head, create_node(p1->coef, p1->exp)); p1 = p1->next; } while (p2 != NULL) { insert_node(&head, create_node(p2->coef, p2->exp)); p2 = p2->next; } return head; } int main() { printf("请输入第一个多项式:\n"); node* poly1 = read_poly(); printf("请输入第二个多项式:\n"); node* poly2 = read_poly(); node* sum = add_poly(poly1, poly2); printf("多项式1:"); print_poly(poly1); printf("多项式2:"); print_poly(poly2); printf("和多项式:"); print_poly(sum); return 0; } ``` 这个程序中,我们首先定义了一个节点结构体`node`,其中包含了系数指数,并且还有一个指向下一个节点的指针`next`。 然后定义了三个操作节点的函数:`create_node`用于创建新节点,`insert_node`用于插入节点并保持多项式从高到低的指数顺序,`read_poly`用于读取多项式并将其转换为链表。 最后定义了一个求和函数`add_poly`,它将两个多项式作为参数并返回它们的和。在求和过程中,我们遍历两个多项式的链表,按照指数从高到低的顺序将每一项插入到结果链表中。 最后在`main`函数中,我们调用`read_poly`函数读取两个多项式,调用`add_poly`函数求和,并输出结果。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

夏~辰

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

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

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

打赏作者

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

抵扣说明:

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

余额充值