数据结构C语言描述——用单链表实现多项式的相加

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

typedef DataType;
typedef struct Node2{
    DataType xishu;
    DataType zhisu;
    struct Node2 *Next;
}Node2;
typedef struct Node2* PNode2;

//多项式按照指数大小排序

void insertNewPoint_link(PNode2 head,PNode2 qNode){
    PNode2 p=head;
    while (p->Next!=NULL)
    {
        if (p->Next->zhisu>qNode->zhisu)
        {
            qNode->Next=p->Next;
            p->Next=qNode;
            break;
        }
        p=p->Next;
    }
    if (p->Next==NULL)
    {
        p->Next=qNode;

    }
}

//打印多项式
void printLinkeLink(PNode2 head){
    PNode2 temp=head->Next;

    while (temp!=NULL)
    {
        printf("%d %d",temp->xishu,temp->zhisu);
        printf("\n");
        temp=temp->Next;
    }
}


//多项式的加法计算
void add_poly(Node2 *pa,Node2 *pb){
    Node2 *p=pa->Next;
    Node2 *q=pb->Next;
    Node2 *pre=pa;
    Node2 *u;


    while (p!=NULL&&q!=NULL)
    {

        if (p->zhisu<q->zhisu)
        {
            pre=p;p=p->Next;
        } 
        else if(p->zhisu==q->zhisu)
        {
            float x=p->xishu+q->xishu;
            if (x!=0)
            {
                p->xishu=x;
                pre=p;
            } 
            else
            {
                pre->Next=p->Next;//指向下一个结点
                free(p);
            }
            p=pre->Next;
            u=q;
            q=q->Next;
            free(u);
        }
        else{
            u=q->Next;
            q->Next=p;
            pre->Next=q;
            pre=q;
            q=u;
        }
    }
    if (q)
    {
        pre->Next=q;
    }
    free(pb);
}


void main( ){

    int zhishu;
    float xishu;
    PNode2 head1=(PNode2)malloc(sizeof(struct Node2));
    PNode2 head2=(PNode2)malloc(sizeof(struct Node2));
    PNode2 tem=NULL;
    head1->Next=NULL;
    head2->Next=NULL;

    printf("输入链表一的系数和指数,如:3,2 以0,0结束输入:\n");
    scanf("%f,%d",&xishu,&zhishu);
    while (xishu!=0||zhishu!=0)
    {
        tem=(PNode2)malloc(sizeof(struct Node2));
        tem->xishu=xishu;
        tem->zhisu=zhishu;
        tem->Next=NULL;
        insertNewPoint_link(head1,tem);
        scanf("%f,%d",&xishu,&zhishu);
    }
    printf("链表一按指数升序排序后的多项式为:\n");
    printLinkeLink(head1);

    printf("\n");

    printf("输入链表一的系数和指数,如:3,2 以0,0结束输入:\n");
    scanf("%f,%d",&xishu,&zhishu);
    while (xishu!=0||zhishu!=0)
    {
        tem=(PNode2)malloc(sizeof(struct Node2));
        tem->xishu=xishu;
        tem->zhisu=zhishu;
        tem->Next=NULL;
        insertNewPoint_link(head2,tem);
        scanf("%f,%d",&xishu,&zhishu);
    }
    printf("链表二按指数升序排序后的多项式为:\n");
    printLinkeLink(head2);
    printf("\n");

    add_poly(head1,head2);
    printf("多项式相加后的结果为:\n");
    printLinkeLink(head1);
}

 

转载于:https://www.cnblogs.com/crazykidhnf/p/5686239.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值