一元多项式的表示及相加

本文介绍了一种使用链式存储结构实现一元多项式的表示与相加的方法,并给出了完整的C语言程序代码。该程序能够创建两个一元多项式链表,进行相加操作并输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如题:

采用链式存储结构,将两个线性链表表示的一元多项式相加,并输出。

实现程序:

#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>

typedef struct node{
    float coef;//系数
    int expn;//指数
    struct node *next;
}LinkNode,*LinkList;

LinkList Create(int n)
{
    LinkNode *head;
    head = (LinkNode *)malloc(sizeof(LinkNode));   //申请头结点空间
    head->next = NULL;
    LinkNode *q;
    q = head;
    float coef;
    int expn;
    for(int i = 1;i <= n;i++)
    {
        printf("%s","请输入系数:");
        scanf("%f",&coef);
        printf("%s","请输入指数:");
        scanf("%d",&expn);

        LinkNode *p = (LinkNode *)malloc(sizeof(LinkNode));
        p->coef = coef;
        p->expn = expn;
        q->next = p;
        q = p;
    }
    q->next = NULL;
    return head;
}

void Print(LinkList L)
{
    LinkNode *p = L->next;
    while(p != NULL)
    {
        printf("系数:%f",p->coef);
        printf("指数:%d\n",p->expn);
        p = p->next;
    }
}

LinkList Add(LinkList pa,LinkList pb)
{
    LinkNode *pc;
    pc = (LinkNode *)malloc(sizeof(LinkNode));
    pc->next = NULL;
    LinkNode *p,*q,*tmp;
    p = pa->next;
    q = pb->next;
    tmp = pc;
    while(p&&q)
    {
        if(p->expn > q->expn)
        {
            LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
            s->expn = p->expn;
            s->coef = p->coef;
            tmp->next = s;
            tmp = s;
            p = p->next;
        }
        else if(p->expn < q->expn)
        {
            LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
            s->expn = q->expn;
            s->coef = q->coef;
            tmp->next = s;
            q = q->next;
            tmp = s;
        }
        else
        {
            if(p->coef + q->coef != 0)
            {
                LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
                s -> coef = q->coef + p->coef;
                s ->expn = p->expn;
                tmp->next = s;
                tmp = s;
            }
            p = p->next;
            q = q->next;
        }
    }
    if(p)
    {
        while(p)
        {
            LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
            s -> coef = p->coef;
            s ->expn = p->expn;
            tmp->next = s;
            tmp = s;
            p = p->next;
        }
    }
    if(q)
    {
        while(q)
        {
            LinkNode *s = (LinkNode *)malloc(sizeof(LinkNode));
            s -> coef = q->coef;
            s ->expn = q->expn;
            tmp->next = s;
            tmp = s;
            q = q->next;
        }
    }
    tmp->next = NULL;
    return pc;
}

void Sort(LinkList L)
{
    LinkNode *p,*q,*pre;
    p = L->next;
    L->next = NULL;
    while (p!=NULL)
    {
        if (L->next==NULL)                     /*处理第1个结点*/
        {
            L->next = p;
            p = p->next;
            L->next->next=NULL;
           }
        else                                  /*处理其余结点*/
        {
            pre = L;
            q = pre->next;
            while (q!=NULL && p->expn < q->expn)
            {
                pre = q;
                q = q->next;
            }
            q = p->next;
            p->next = pre->next;
            pre->next = p;
            p = q;
        }
    }
}
int main()
{
    LinkList pa,pb,pc;
    int n,m;
    printf("请输入pa的项数:\n");
    scanf("%d",&n);
    pa = Create(n);
    printf("%s\n","Pa:");
    Sort(pa);
    Print(pa);

    printf("请输入pb的项数:\n");
    scanf("%d",&m);
    pb = Create(m);
    printf("%s\n","Pb:");
    Sort(pb);
    Print(pb);

    pc = Add(pa,pb);
    printf("%s\n","pa+pb:");
    Print(pc);
}

如有问题,欢迎指正~

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值