实验2 一元多项式相加

【实验内容】
结合书上第41页的例子,采用链式存储结构,将两个线性链表表示的一元多项式相加,并输出。此一元多项式遵循多项式相加运算规则:对于两个一元多项式中存在指数相同的项时,其对应系数相加。合并后系数和为零时,删除“和多项式”中此项;合并后系数和不为零时,则构成“和多项式”中的一项。对于两个一元多项式中存在的指数不相同的项,则分别复抄到“和多项式”中去,原多项式保持不变。


【实验目的】
1、了解链式存储结构的基本知识;
2、掌握算法思想和数据结构的描述;
3、结合一元多项式相加的运算规则。


【实验步骤与要求】
1、实验前的准备
(1)了解C语言的基本概念;
(2)了解C语言的基本段落。
2、上机操作
(1)了解链式存储结构的基本知识;
(2)掌握算法思想和数据结构的描述;
(3)掌握一元多项式相加的运算规则。


代码:

#include<stdio.h>
#include<stdlib.h>
typedef struct Elem//多项式元素
{
    float coef;//系数
    int expn;//指数
    struct Elem *next;
}node;
typedef struct link//多项式
{
    int size;
    node *head;
}Polyn;
Polyn* CreatPolyn()//创建一个多项式
{
    Polyn *p=malloc(sizeof(Polyn));
    p->head=malloc(sizeof(node));//空的头节点
    p->size=0;
    p->head->coef=0;
    p->head->expn=-1;
    p->head->next=NULL;
    return p;
}
node* find(Polyn *p,node *t)//在多项式p中寻找当前节点合适的插入位置并返回
{
    node *d=p->head;
    while(d->next&&d->next->expn<t->expn)//当当前节点的下一个节点的指数大于等于当前待插入节点的指数时退出
    {
        d=d->next;
    }
    return d;//返回该位置
}
void add(Polyn *p,node *t)//往一个多项式中假如一个t元素
{
    node *d=find(p,t);//用find函数寻找一个合适的插入位置
    if(d->next&&d->next->expn==t->expn)//如果d->next存在并且多项式元素的指数等于当前待插入元素的指数
    {
        if(t->coef+d->next->coef==0)//如果系数相加为0,就直接删除该节点
        {
            node *temp=d->next;
            d->next=d->next->next;
            free(temp);
            p->size=p->size-1;
        }
        else//否则就修改多项式中的系数
        {
            d->next->coef=d->next->coef+t->coef;
        }
    }
    else//表示多项式中找不到与当前待插入元素的指数相同的元素,那么直接插入该位置
    {
        node *temp=malloc(sizeof(node));
        temp->next=d->next;
        temp->coef=t->coef;
        temp->expn=t->expn;
        d->next=temp;
        p->size=p->size+1;
    }
}
void print(Polyn *p)//输出多项式内容
{
    node *d=p->head->next;
    if(p->size==0)//特殊处理多项式没有项的情况
    {
        printf("0\n");
        return;
    }
    printf("%.2f",d->coef);//特殊处理第一项,为了不输出多余的加号
    if(d->expn!=0)
    {
        printf("X^(%d)",d->expn);
    }
    d=d->next;
    while(d)
    {
        printf("%+.2f",d->coef);
        if(d->expn!=0)//指数为0的时候就不用输出X了
        {
            printf("X^(%d)",d->expn);
        }
        d=d->next;
    }
    printf("\n");
}
void merge(Polyn *la,Polyn *lb)
{
    node *d=lb->head->next;
    while(d)
    {
        add(la,d);
        node *temp=d;
        d=d->next;
        free(temp);
    }
}
int main()
{
    int i,n,m;
    node t;
    Polyn *link_a=CreatPolyn();//创建一个多项式a
    printf("please input the length of a:");
    scanf("%d",&n);//输入多项式a的长度
    t.next=NULL;
    for(i=0;i<n;i++)
    {
        scanf("%f%d",&t.coef,&t.expn);//先输入每一项的系数再输入每一项的指数
        add(link_a,&t);
    }
    printf("\n");
    printf("the size of a is:%d\n",link_a->size);
    printf("the polynomial a is:");
    print(link_a);
    printf("\n");
    Polyn *link_b=CreatPolyn();
    printf("please input the length of b:");
    scanf("%d",&m);
    for(i=0;i<m;i++)
    {
        scanf("%f%d",&t.coef,&t.expn);
        add(link_b,&t);
    }
    printf("\n");
    printf("the size of b is:%d\n",link_b->size);
    printf("the polynomial b is:");
    print(link_b);
    merge(link_a,link_b);
    printf("\n");
    printf("after merging the polynomial a is:");
    print(link_a);
    free(link_a->head);
    free(link_a);
    free(link_b->head);
    free(link_b);
    return 0;
}


  • 9
    点赞
  • 34
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值