数据结构作业---一元多项式相加

#ifndef MULTINOMIAL_H_INCLUDED
#define MULTINOMIAL_H_INCLUDED
#include "List.h"

//代表每一项
typedef struct Nape{
    //指数
    int exponent ;
    //系数
    int factor ;
}Nape ;

/*把链表和多项式放一起原因:
        避免头文件相互包含产生错误
*/

//链表的结构体
typedef struct Node{
    Nape data ;
    struct Node *next ;
}Node;

typedef struct List{
    Node *head ;
    int count ;
}List ;

//---------------------多项式操作---------------------------------

//创建存储多项式进入链表
void CreateMul(List *L , int n){
    int i ;
    for(i = 0 ; i < n ; i++){
        Node * newNode = (Node*)malloc(sizeof(Node)) ;
        if(!newNode){
            exit(1) ;
        }

        //键入系数和指数
        printf("请输入%d项系数:" , i + 1) ;
        scanf("%d" , &newNode->data.factor) ;
        printf("请输入%d项指数:" , i+1) ;
        scanf("%d" , &newNode->data.exponent) ;
        //如果系数为零就不用创建节点了
        if(newNode->data.factor == 0){
            continue ;
        }

        else{
                //进行尾插将项存入节点
                Node *p = L->head ;
                while(p->next){
                    p = p->next ;
                }

                p->next = newNode ;
                L->count++ ;
        }

    }

}

//两个多项式进行相加
void addition(List * a , List * b , List * c){
    //c将a的头结点作为头节点
    c->head = a->head ;
    //la,lb代表当前节点,p指向
    Node *la = a->head->next ;
    Node *lb = b->head->next ;
    Node *p = c->head ;

    //当到了一个链表尾就结束循环
    while(la && lb){
        //如果相等就将系数相加
        if(la->data.exponent == lb->data.exponent){
            la->data.factor = la->data.factor + lb->data.factor ;

            //如果相加系数为零就不将此节点插入c
            if(la->data.factor == 0){
                la = la->next ;
                lb = lb->next ;
                continue ;
            }
            p->next = la ;
            la = la->next ;
            lb = lb->next ;
        }

        //不等就将小的插入c表尾
        else if(la->data.exponent < lb->data.exponent){
            p->next = la ;
            la = la->next ;
        }

        else if(la->data.exponent > lb->data.exponent){
            p->next = lb ;
            lb = lb->next ;

        }
        p = p->next ;
    }

    //将表中剩余直接插入c表尾
    if(la){
        p->next = la ;
    }

    if(lb){
        p->next = lb ;
    }

    free(b->head) ;
}

//打印验证
void print(List * L){
    Node * p = L->head->next ;
    printf("P = ") ;
    int i ;
    while(p){
        if(p->data.exponent == 0){
            printf("%d " , p->data.factor) ;
        }
        else{
            printf("%dx^%d " , p->data.factor , p->data.exponent) ;
        }
        if(p->next != NULL) {
            printf("+ ") ;
        }
        p = p->next ;

    }


}

//-------------------------------链表操作--------------------------
//不放两个头文件因为要避免头文件互相包含问题

//初始化
void init(List * L){
    //分个头结点
    L->head = (Node*)malloc(sizeof(Node)) ;
    if(!L->head){
        exit(1) ;
    }

    L->head->next = NULL ;
    L->head->data.exponent = -1 ;
    L->head->data.factor = -1 ;
    L->count = 0 ;

}




#endif // MULTINOMIAL_H_INCLUDED

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值