链表实现多项式加法

#include<stdio.h>
#include<stdlib.h>
typedef struct Polynode*Polynomial;
struct Polynode{
    int coef;
    int expon;
    Polynomial link;
};
int Compare(int e1,int e2);
void attach(int c,int e,Polynomial*reat);
Polynomial ReadPoly();
Polynomial add(Polynomial P1,Polynomial P2);
void PrintPoly(Polynomial P);
int main(){
    Polynomial P1,P2,PP;
    P1=    ReadPoly();
    P2=ReadPoly();
    PP=add(P1,P2);
    PrintPoly(PP);
    return 0;
}
int Compare(int e1,int e2){
    if(e1>e2) return 1;
    else if(e1<e2) return -1;
    else return 0;
}
void attach(int c,int e,Polynomial*reat){
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct Polynode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*reat)->link=P;
    *reat=P;
}
Polynomial ReadPoly(){
    int N,c,e;
    Polynomial P,rear,t;
    P=(Polynomial)malloc(sizeof(struct Polynode));
    P->link=NULL;
    rear=P;
    scanf("%d",&N);
    while(N--){
        scanf("%d %d",&c,&e);
        attach(c,e,&rear);
    }
    t=P;P=P->link;free(t);
    return P;
}
Polynomial add(Polynomial P1,Polynomial P2){
    int sum;
    Polynomial front,rear,temp;
    front=(Polynomial)malloc(sizeof(struct Polynode));
    rear=front;
    while(P1&&P2){
        switch (Compare(P1->expon,P2->expon)){
        case 1:
            attach(P1->coef,P1->expon,&rear);
            P1=P1->link;
            break;
        case -1:
            attach(P2->coef,P2->expon,&rear);
            P2=P2->link;
            break;
        case 0:
            sum=P1->coef+P2->coef;
            attach(sum,P1->expon,&rear);
            P1=P1->link;
            P2=P2->link;
            break;
        }
    }
    for(;P1;P1=P1->link)attach(P1->coef,P1->expon,&rear);
    for(;P2;P2=P2->link)attach(P2->coef,P2->expon,&rear);
    rear->link=NULL;
    temp=front;
    front=front->link;
    free(temp);
    return front;
}
void PrintPoly(Polynomial P){
    int flag=0;
    if(!P){
        printf("0 0\n");
        return;
    }
    while(P){
        if(!flag)
            flag=1;
        else
            printf(" ");
        printf("%d %d",P->coef,P->expon);
        P=P->link;
    }
}

特别注意attach这个函数:

void attach(int c,int e,Polynomial*reat){
    Polynomial P;
    P=(Polynomial)malloc(sizeof(struct Polynode));
    P->coef=c;
    P->expon=e;
    P->link=NULL;
    (*reat)->link=P;
    *reat=P;
}

其中一个参数Polynomial*reat,使用的地址的地址,如果是只用Polynomial型,那么相当于只是传递进来一个地址值,函数调用完后就会释放掉形参的地址,因此链表的尾部不会变化,因此需要用Polynomial*reat类型。

时间: 2024-08-04 16:36:26

链表实现多项式加法的相关文章

数据结构之利用单向链表实现多项式加法和乘法

在<数据结构与算法分析--c语言描述>一书中,作者指出了使用单向链表作为实现多项式的方法.但是没有给出具体实现.下面自己对其进行实现.只考虑功能.对其他细节不暂时不考虑.程序完成两个功能,使用单向链表完成多项式的加法和乘法.首先看加法,解决加法问题的思想在于对表示进行操作的两个链表表示的多项式按照指数递减的结构排列,每个节点的数据域存储着多项式某一项的系数(Coefficient)和指数(Exponent),还有一个指向后继节点的指针.节点的实现如下: 1 typedef struct Nod

[DataStructure]多项式加法与乘法--B.链表存储(适用于零元系数多的多项式)

数据结构大作业…… 发出来大家乐呵乐呵…… 一.问题描述 给出N个多项式,求他们的和与积 二.解题报告 基本思想:加法和乘法都是把得数项直接链接在链表后面,最后统一做一个Merge&Sort工作即可.方便又快捷. (1)建立存储结构 1 struct _Poly 2 { 3 int factor;//系数 4 int Index;//幂 5 struct _Poly* next;//下一节点 6 }; 7 _Poly* poly[MAXTIMES+1]; 8 int Sum[MAXTIMES+1

多项式加法运算 使用链表实现

/* 多项式加法运算 使用链表实现 */ #include <iostream> using namespace std; //使用不带头结点的单向链表,按照指数递减的顺序排列 typedef struct PolyNode { int coef; //系数 int expon; //指数 PolyNode *link; //指向下一个节点的指针 }*polynomial, npolynomial; polynomial PolyAdd(polynomial p1, polynomial p2

[DataStructure]多项式加法与乘法--A.数组存储(适用于零元系数少的多项式)

数据结构大作业…… 发出来大家乐呵乐呵…… 一.问题描述 给出N个多项式,求他们的和与积 二.解题报告 (1)建立存储结构 1 struct _Poly 2 { 3 double Data[MAXTIMES+1]; 4 int Times; 5 }; 6 struct _Poly Poly[N+1]; (2)主程序架构 1 int main() 2 { 3 int Sum; 4 cout<<"请输入要做运算的多项式数量"<<endl; 5 cin>>

单链表实现多项式的表示及运算

单链表实现多项式的加法运算 最近学习数据结构的线性表,有顺序存储和链表两种,多项式的表示和运算,最能巩固学习成果,现在提供详细代码,来实现多项式的加法运算. 多项式用单链表最为合适,不会造成更多的资源浪费. 如果你恰好用的这本书--数据结构(Java版)(第4版)(叶核亚),推荐你去下面这个链接下载书本源代码,将更助你学的轻松. http://download.csdn.net/detail/wang______jing/9907538 1 //单链表类,实现一些基本单链表的操作 2 publi

单向链表实现多项式加和乘--自己写数据结构

用单项链表实现多项式数据结构和代码如下(由于时间原因多项式乘法的函数没用实现,读者可以在自己完善): 存放结构体的头文件polylist.h #ifndef _H_POLYLIST_ #define _H_POLYLIST_ typedef struct _Poly_Node { int ratio; //系数 int power; //幂 struct _Poly_Node* next; }Node,*pNode; typedef struct _Poly_List { struct _Pol

数据结构实践——链表:多项式求和

本文针对数据结构基础系列网络课程(2):线性表的实践项目. [项目 - 多项式求和] 用单链表存储一元多项式,并实现两个多项式的加法. 提示: 1.存储多项式的数据结构 多项式的通式是pn(x)=anxn+an?1xn?1+...+a1x+a0.n次多项式共有n+1项.直观地,可以定义一个数组来存储这n+1个系数.以多项式p(x)=?3.4x10?9.6x8+7.2x2+x为例,存储这个多项式的数组如下图: 可以看出,这种方案适合对某些多项式的处理.但是,在处理一些次数高但项数少的多项式时,存在

算法练习--多项式加法

JS 实现 多项式加法 Array.prototype.existKey = function(propVal){ var i = 0; for(var i = 0;i < this.length; i++){ if(this[i].k == propVal){return i;} } return -1; } function polynAdd(a,b){ //1. parse out each exp var strA = a[0] == '-' ? a : '+' + a; var str

程序设计入门——C语言 第7周编程练习 1多项式加法(5分)

第7周编程练习 依照学术诚信条款,我保证此作业是本人独立完成的. 温馨提示: 1.本次作业属于Online Judge题目,提交后由系统即时判分. 2.学生可以在作业截止时间之前不限次数提交答案,系统将取其中的最高分作为最终成绩. 1 多项式加法(5分) 题目内容: 一个多项式可以表达为x的各次幂与系数乘积的和,比如: 2x6+3x5+12x3+6x+20 现在,你的程序要读入两个多项式,然后输出这两个多项式的和,也就是把对应的幂上的系数相加然后输出. 程序要处理的幂最大为100. 输入格式: