多项式相加

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

typedef struct PolyNode *PtrToNode; 

//定义链表节点,也就是多项式中的某一项;
typedef struct PolyNode
{
    int Coeff;
    int Exponent;
    PtrToNode Next;
} PolyNode; 

typedef PtrToNode Polynomial; 

/************************************************************
*多项式相加的函数:
*P、Q为存储两个多项式各项的单链表(含头结点)
*Sum为多项式相加结果存放的单链表
*
************************************************************/
void AddPolynomial(Polynomial P,Polynomial Q,Polynomial Sum)
{
    Polynomial PIndex,QIndex,SumIndex;
    PIndex = P->Next;
    QIndex = Q->Next;
    SumIndex = Sum;
    while(!(PIndex == NULL && QIndex == NULL))
    {
        if(PIndex==NULL)
        {
            SumIndex->Next = QIndex;
            QIndex = QIndex->Next;
            SumIndex = SumIndex->Next;
        }
        else if(QIndex == NULL)
        {
            SumIndex->Next = PIndex;
            PIndex = PIndex->Next;
            SumIndex = SumIndex->Next;
        }
        else
        {
            if(PIndex->Exponent > QIndex->Exponent)
            {
                SumIndex->Next = PIndex;
                PIndex = PIndex->Next;
                SumIndex = SumIndex->Next;
                //continue在判断下面if条件时会有异常,类似Java
                //的空引用异常
                continue;
            }
            if(PIndex->Exponent == QIndex->Exponent)
            {
                Polynomial PP =(Polynomial) malloc(sizeof(struct PolyNode));
                PP->Exponent = PIndex->Exponent;
                PP->Coeff = PIndex->Coeff + QIndex->Coeff;
                SumIndex->Next = PP;
                PIndex = PIndex->Next;
                QIndex = QIndex->Next;
                SumIndex = SumIndex->Next;
                continue;
            }
            if(PIndex->Exponent < QIndex->Exponent)
            {
                SumIndex->Next = QIndex;
                QIndex = QIndex->Next;
                SumIndex = SumIndex->Next;
                continue;
            }
        }
    }
    SumIndex->Next = NULL;
} 

/************************************************************
*遍历单链表(含头结点)函数:
*P:待遍历的链表
*************************************************************/
void TraversePolynomial(Polynomial P)
{
    Polynomial Tmp = P->Next;
    while(Tmp != NULL)
    {
        printf("Coeff is %d and Exponent is %d\n",Tmp->Coeff,Tmp->Exponent);
        Tmp = Tmp->Next;
    }
} 

int main( )
{
    Polynomial Poly1,Poly2,Poly3,Poly11,Poly22;
    int i,j;
    Poly1 =(Polynomial) malloc(sizeof(struct PolyNode));
    Poly2 =(Polynomial) malloc(sizeof(struct PolyNode));
    Poly3 =(Polynomial) malloc(sizeof(struct PolyNode));
    Poly11 = Poly1;
    Poly22 = Poly2; 

    //创建两个链表时,需要保证是按照指数递减的方式构造的
    for(i = 5;i >= 1;i--)
    {
        Polynomial Tmp  =(Polynomial) malloc(sizeof(struct PolyNode));
        Tmp->Coeff = i;
        Tmp->Exponent = i;
        Poly11->Next = Tmp;
        Poly11 = Poly11->Next;
    }
    Poly11->Next = NULL;
    for(j = 11;j >= 3;j--)
    {
        Polynomial Tmp  =(Polynomial) malloc(sizeof(struct PolyNode));
        Tmp->Coeff = j;
        Tmp->Exponent = j;
        Poly22->Next = Tmp;
        Poly22 = Poly22->Next;
    }
    Poly22->Next = NULL;
    TraversePolynomial(Poly1);
    printf("*****************************************\n");
    TraversePolynomial(Poly2);
    AddPolynomial(Poly1,Poly2,Poly3);
    printf("*****************************************\n");
    TraversePolynomial(Poly3);
    return 0;
} 
时间: 2024-10-05 12:50:50

多项式相加的相关文章

多项式相加运算

 多项式相加运算,使用链表实现,代码仍需要改善,这里先初步做个记录 //实现多项式的表示及相加 by Denis #include <stdio.h> #include <malloc.h> #define ture 1 #define false 0 typedef int ElemType; typedef struct LNode{ ElemType coef; //系数 int expn; //指数 struct LNode *next; }polynomia; pol

双链表&amp;链表合并&amp;多项式相加算法

//单链表的合并 //链表合并 //两个链表必须是有序的 #define Maxsize 5 typedef  int elemtype; typedef struct linklist { elemtype data; struct linklist *next; }Linklist; //建立链表1 Linklist *CreateList1 () { int i,data ; Linklist *head, *p, *q; head=p=(Linklist  *)malloc(sizeof

多项式相加&mdash;&mdash;C++和racket

  多项式相加是一个简单到爆的算法练习,学习链表之后一般会波拉波拉讨论稀疏的.稠密的用什么来表示,最后一般都作为链表的练习题出现.其实用数组表示多项式显然是不合理的,大多数的多项式必然没有如此紧密,链表几乎是唯一的选择. 放在C++这样的语言中,直接构建一个poly结点类,然后构建一个poly类(包含一个头节点),基本就是一个单链表的实现,对于多项式的加法,和有序链表的连接比较像,乘法就更简单了,逐一乘过去就行了. 导致这个过程很简单的原因是类的封装(C 用结构体加一些函数对于这个简单的问题也基

多项式链表多项式相加

//多项式相加 LinkList* add2Link(LinkList*L1, LinkList*L2) { LinkList*p1, *p2; LinkList*head , *pre, *p; head = new LinkList; head->next = NULL; pre = head; p1 = L1->next; p2 = L2->next; while (p1&&p2) { if (p1->exp == p2->exp) { p = new

从多项式相加看线性结构

给出两个多项式: 大家都很清楚多项式相加,即为相同指数项对应相加.那我们如何使用程序来描述两个多项式相加呢?大家首先想到的是用数组描述,多项式的指数使用下标来表示,前面的系数为对应数组中的值.f1(x)表示如下: f2(x)表示如下: 其实只要写个for循环,相同下标的相加即可,非常简单.下面问题来了,如果面对的多项式是类似 这种形式的话,0项太多,上面的这种办法就会很冗余,白白浪费空间.因此需要采取另外的办法来描述.上面的方式问题出在我们使用数组下标用来描述指数,当指数很大的时,就会出现很多系

链表_多项式相加相乘

加法部分运行成功.乘法仍存在问题,找机会解决,欢迎大家指正. 还有一个问题,C语言函数传地址如何传,是否不需要我这样多次申请内存空间?欢迎交流. 代码如下: 1 #include<stdio.h> 2 #include<malloc.h> 3 4 typedef struct PolyNode *Poly;//定义多项式结构体类型 5 struct PolyNode{ 6 int coef; 7 int expon; 8 struct PolyNode *next; 9 }; 10

(java描述)关于链表的代码-----单双、循环链表、约瑟夫环、多项式相加

将链表头尾倒置 将几个链表合并成一个新的链表,将链表中重复的节点去掉,并按大小排序 双向循环链表 单向循环链表(约瑟夫循环) 多项式相加 程序源代码 单链表.单向循环链表结点类 package javab; public class Node { int data; Node next; public Node(int data){ this.data=data; } } 第一题代码: package javab; import java.util.Scanner; public class I

多项式相加实验代码和报告

一.算法模块分析: 将整个项目可分为四部分: 1.将输入字符串链表分析到单链表 2.单链表化简 3.链表值运算 4.输出 二.模块分块实现: 1.将输入字符串链表分析到单链表 分析: 一元稀疏多项式,包含字符有数字(系数和指数) 系数中小数点,指数符号,变量字母(以x为例) 运算符(+和-,其中加减也可以表示正负数) 通过以上分析可以构建如下结构体以用于存储每个单项 并完成相应标志任务 struct Record{ double factor;//记录系数 - int power;//记录次方

多项式相加(链表)

#include<iostream>using namespace std;class poly{public: int coef; int expon; poly *next;};poly*input(); //输入函数poly *polyadd(poly *p1, poly *p2); //相加函数poly *attach(poly*rear, int coef, int expon); //链接函数int compare(int a, int b); //大小比较函数int main()