c语言 单链表实现多项式相加

实验目的:
1 掌握单链表的基本工作原理;
2 实现链式存储下的两个多项式的相加。
实验步骤
1 定义链式存储的数据结构
2 完成多项式的初始化,即给多项式赋初值
3 完成多项式的输出
4 实现多项式的相加及结果输出。

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

typedef struct LNode{
    int coef;
    int expn;
    struct LNode *next;
}LNode,*Link;

/*生成多项式*/
void CreatPolyn(Link *p,int m)
{
    Link r,s;
    int i;
    *p = (Link)malloc(sizeof(LNode));  //生成一个头指针p
    r=*p;  //r指向p的位置
    for(i=0;i<m;i++)  //循环生成多项式
    {
        s=(Link)malloc(sizeof(LNode));
        printf("scanf coef and expn:\n(example:1,2)\nyour num is:");
        scanf("%d,%d",&s->coef,&s->expn);  //把数据存入新生成的s中
        r->next=s;  //头指针指向s
        r=s;   //r移向下一位
    }
    r->next=NULL;
}

/*打印多项式*/
void PrintPolyn(Link p)
{
    Link s;
    s=p->next;  //p为头指针,s指向首元结点
    while(s)   //当s不为空
    {
        printf("%dX^%d",s->coef,s->expn);
        s=s->next;
        if(s!=NULL)
        {
            if(s->coef>=0)   //为什么要多加这一行,删去不行吗??
            printf("+");
        }
    }
    printf("\n");
}

/*判断大小*/
int cmp(Link a,Link b)
{
    if(a->expn<b->expn)//a<b返回-1
    return -1;
    else if(a->expn==b->expn)//a=b返回0
    return 0;
    else return 1;//a>b返回1
}

/*多项式加法*/
Link AddPolyn(Link pa,Link pb)
{
    Link newp,p,q,s,pc;
    float sum;
    p=pa->next;  //p和q分别指向pa和pb的首元结点
    q=pb->next;
    newp=(Link)malloc(sizeof(LNode));
    pc=newp;
    while (p&&q)
    {
        switch(cmp(p,q))
        {
            case -1:     //当p<q时
            s = (Link)malloc(sizeof(LNode));
            s->coef = p->coef;      //将p的系数和指数都存入新生成的s中
            s->expn = p->expn;
            pc->next = s;       //头节点指向s首元结点
            pc = s;      //pc移到下一位
            p = p->next;      //p也移到下一位
            break;

            case 0:     //p=q时
            sum = p->coef + q->coef;    //系数求和
            if(sum!=0)
            {
                s = (Link)malloc(sizeof(LNode));
                s->coef = sum;    //系数放入新单元中
                s->expn = p->expn;    //取任意p或q的指数放入s中
                pc->next = s;    //前一结点指向s
                pc = s;     //pc后移一位
            }
            p = p->next;    //若和为0,p和q直接后移一位
            q = q->next;
            break;

            case 1:
            s = (Link)malloc(sizeof(LNode));
            s->coef = q->coef;     //把q的指数和系数都放入s中
            s->expn = q->expn;
            pc->next = s;     //前一结点pc指向s
            pc = s;      //pc后移一位
            q = q->next;     //q也后移一位
            break;
        }
        while(p)   //当q空但p后还有元素时,把p接到后面
        {
            s = (Link)malloc(sizeof(LNode));
            s->coef = p->coef;
            s->expn = p->expn;
            pc->next = s;
            pc = s;
            p = p->next;
        }
        while(q)   //当q空但p后还有元素时,把p接到后面
        {
            s = (Link)malloc(sizeof(LNode));
            s->coef = q->coef;
            s->expn = q->expn;
            pc->next = s;
            pc = s;
            q = q->next;
        }
        pc->next = NULL;
        return newp;
    }
}

int main()
{
    Link p1,p2;
    int L1,L2;
    printf("for the first f(x):how many num will you set to the f(x):");
    scanf("%d",&L1);
    CreatPolyn(&p1,L1);
    printf("the first f(x1) is:");
    PrintPolyn(p1);
    printf("for the secone one:");
    scanf("%d",&L2);
    CreatPolyn(&p2,L2);
    printf("the secone f(x2) is:");
    PrintPolyn(p2);
    printf("\n");
    printf("the resule is:");
    PrintPolyn(AddPolyn(p1,p2));
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值