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. 定义一个单链表数据结构来存储一元多项式。 2. 读入两个一元多项式并分别存储到两个单链表中。 3. 遍历两个链表,将相同次数的项相加,将结果存储到一个新的链表中。 4. 如果一个链表遍历完了而另一个链表还有剩余的项,将这些项直接添加到新链表中。 5. 输出新链表中的每一项,即为相加的结果。 代码实现可参考下面示例: ``` #include <stdio.h> #include <stdlib.h> typedef struct node { int coeff; //系数 int expn; //指数 struct node *next; } Node; Node* CreateList(); //创建链表 Node* InputPoly(); //输入一元多项式 void AddPoly(Node*, Node*, Node*); //相加两个一元多项式 void PrintPoly(Node*); //输出一元多项式 int main() { Node *A, *B, *C; A = InputPoly(); B = InputPoly(); C = CreateList(); AddPoly(A, B, C); PrintPoly(C); return 0; } Node* CreateList() { Node *L = (Node*)malloc(sizeof(Node)); L->next = NULL; return L; } Node* InputPoly() { Node *L = CreateList(); Node *r = L; int n, coeff, expn; printf("请输入一元多项式的项数:"); scanf("%d", &n); printf("请按照指数递减的顺序输入各项系数和指数:\n"); while(n--) { Node *p = (Node*)malloc(sizeof(Node)); scanf("%d%d", &coeff, &expn); p->coeff = coeff; p->expn = expn; r->next = p; r = p; } r->next = NULL; return L; } void AddPoly(Node *A, Node *B, Node *C) { Node *pa = A->next, *pb = B->next; Node *pc = C; while(pa && pb) { Node *p = (Node*)malloc(sizeof(Node)); if(pa->expn == pb->expn) { p->coeff = pa->coeff + pb->coeff; p->expn = pa->expn; pa = pa->next; pb = pb->next; if(p->coeff == 0) free(p); else { pc->next = p; pc = p; } } else if(pa->expn > pb->expn) { p->coeff = pa->coeff; p->expn = pa->expn; pa = pa->next; if(p->coeff == 0) free(p); else { pc->next = p; pc = p; } } else { p->coeff = pb->coeff; p->expn = pb->expn; pb = pb->next; if(p->coeff == 0) free(p); else { pc->next = p; pc = p; } } } pc->next = pa ? pa : pb; } void PrintPoly(Node *L) { Node *p = L->next; while(p) { printf("%dX^%d", p->coeff, p->expn); p = p->next; if(p) printf("+"); } printf("\n"); } ```
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值