---恢复内容开始---

#include

#include

typedef struct PolyNode *Polynomial;

struct PolyNode{

int coef;//系数

int expon;//指数

Polynomial link;//链表指针域指向下一地址

};

Polynomial ReadPoly();//读入多项式

void Attach(int c,int e,Polynomial *pRear);//将每次读入的多项式连接

Polynomial Add(Polynomial P1,Polynomial P2);//多项式相加

Polynomial Mult(Polynomial P1,Polynomial P2);//多项式相乘

int Compare(int a,int b);//比较

void PrintPoly(Polynomial P);//输出多项式

int main(void)

{

Polynomial P1,P2,PS,PP;

P1=ReadPoly();//读入数据

P2=ReadPoly();

PP=Mult(P1,P2);//多项式相乘

PrintPoly(PP);

printf("\n");

PS=Add(P1,P2);//多项式相加

PrintPoly(PS);

return 0;

}

Polynomial ReadPoly()//读入数据

{

Polynomial P,Rear,t;

int c,e,N;

scanf("%d",&N);

P=(Polynomial)malloc(sizeof(struct PolyNode));//为方便表头插入,先产生一个临时空节点做为链表头

P->link =NULL;

Rear=P;//Rear始终指向链表的尾部

while(N--)

{

scanf("%d %d",&c,&e);

if(c!=0)//对系数为零的项进行判断

Attach(c,e,&Rear);

}

t=P;//释放表头为空的节点

P=P->link ;

free(t);

return P;

}

void Attach(int c,int e,Polynomial *pRear)//将数据连接成链表

{

Polynomial P;

P=(Polynomial)malloc(sizeof(struct PolyNode));//为方便表头插入,先产生一个临时空节点做为链表头

P->coef=c;

P->expon=e;

P->link =NULL;

(*pRear)->link=P;//将P指向的新节点插入到当前结果表达式尾项的后面

*pRear=P;//最后一项指向P

}

int Compare(int a,int b)//比较 ,a>b return 1,a

{

if(a>b)

return 1;

else if(a==b)

return 0;

else

return -1;

}

Polynomial Add(Polynomial P1,Polynomial P2)//多项式相加

{

Polynomial front,rear,temp;//front为头,Rear为尾

int sum;

rear=(Polynomial)malloc(sizeof(struct PolyNode));//为方便表头插入,先产生一个临时空节点做为链表头

front=rear;

while(P1&&P2)

switch(Compare(P1->expon ,P2->expon))

{

case 1://如果P1->expon>P2->expon

Attach(P1->coef,P1->expon,&rear);

P1=P1->link ;

break;

case -1://如果P1->exponexpon

Attach(P2->coef,P2->expon,&rear);

P2=P2->link ;

break;

case 0://如果P1->expon=P2->expon

sum=P1->coef +P2->coef;

if(sum)//如果指数相等,先判断系数和是否为0

Attach(sum,P1->expon,&rear);

P1=P1->link;

P2=P2->link ;

break;

}

//将未处理完的多项式中所有节点复制到结果多项式中

while(P1)

{

Attach(P1->coef,P1->expon,&rear);

P1=P1->link;

}

while(P2)

{

Attach(P2->coef,P2->expon,&rear);

P2=P2->link;

}

rear->link=NULL;//释放头为空的节点

temp=front;

front=front->link ;

free(temp);

return front;

}

void PrintPoly(Polynomial P)//打印

{

int flag=0;

if(!P)

{

printf("0 0");

return ;

}

while(P)

{

if(!flag)

flag=1;

else

printf(" ");

printf("%d %d",P->coef ,P->expon );

P=P->link ;

}

}

Polynomial Mult(Polynomial P1, Polynomial P2)//多项式相乘

{

Polynomial P, Rear;

Polynomial t1, t2, t;

if (!P1 ||!P2)//判断两个链表是否为空

{

return NULL;

}

t1 = P1;

t2 = P2;

P = (Polynomial)malloc(sizeof(struct PolyNode));

Rear = P;

while (t2)//先让t1的第一项和t2的每一项相乘,构建出一个新链表,用于后来数据的插入

{

Attach(t1->coef*t2->coef, t1->expon + t2->expon, &Rear);

t2 = t2->link;

}

t1 = t1->link;

while (t1)

{

t2 = P2;

Rear = P;//Rear每次都从所构建的链表头开始,以便于寻找插入位置

while (t2)

{

int c = t1->coef*t2->coef;

int e = t1->expon + t2->expon;

while (Rear->link&&Rear->link->expon > e)//Rear每次都从所构建的链表头开始,以便于寻找插入位置

{

Rear = Rear->link;

}

if (Rear->link&&Rear->link->expon == e)//相等就不需要申请一个新的节点,只要把系数相加。

{

if (Rear->link->coef + c)//系数和不为0,

{

Rear->link->coef += c;

}

else//系数和为0,删除节点

{

t = Rear->link;

Rear->link = t->link;

free(t);

}

}

else//如果指数不相等,申请空间将将此项插入

{

t = (Polynomial)malloc(sizeof(struct PolyNode));

t->link = NULL;

t->coef = c;

t->expon = e;

t->link = Rear->link;

Rear->link = t;

Rear = Rear->link;

}

t2 = t2->link;

}

t1 = t1->link;

}

t2 = P;//释放空节点

P = P->link;

free(t2);

return P;

}别人的代码。不过好像有问题。有时间再改

多项式加法 java 链表_多项式加法,用单链表实现。相关推荐

  1. 力扣Java编译器_力扣--设计单链表

    在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值.如果索引无效,则返回-1. addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点.插入 ...

  2. python线性链表_线性表 (单链表、循环链表-python实现)

    #定义每个节点 classNode:def __init__(self,data): self.data=data self.next=NoneclasslinkList:#初始化头结点 def __ ...

  3. 单链表的合并算法_图解算法:单链表两两反转 | 眼睛会了手就会系列

    一. 序 链表作为一种基本的数据结构,本身理解起来,很简单.它通过指针或者叫引用,将一组零散的内存空间(结点),串联起来组成一个数据存储结构. 链表根据其指针的指向和丰富程度,可以分为单链表.双向链表 ...

  4. 链表的基本操作 java_JAVA实现单链表的基本操作

    复习单链表的实现,扎实基础,单链表的结构不在赘述,直接看代码,注释的很清楚 注意:在插入和删除操作时,需要判断是否越界,如何判断上界?想到了在修改. public class linkList { / ...

  5. 带头结点单链表 和 不带头结点单链表的区别

    文章目录 不带头结点的操作 代码① 代码② 代码③ 代码④ 带头结点的操作 代码⑤ 下面的代码中,传递链表时,传的是头指针.如果是带头结点的链表,传递链表时,可以传头结点,具体可以看看 C语言实现-线 ...

  6. java数组转换成单链表_【转】单向链表(单链表)的Java实现

    最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因 ...

  7. c++如何判断两个字符串是否相同?_链表 | 如何判断两个单链表(无环)是否交叉...

    如何判断两个单链表(无环)是否交叉 单链表相交指的是两个链表存在完全重合的部分,如下图所示 在上图中,这两个链表相交于结点5,要求判断两个链表是否相交,如果相交,找出相交处的结点. 分析 Hash法 ...

  8. 无头结点单链表的逆置_从无头单链表中删除节点及单链表的逆置

    题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点).请将该节点从单链表中删除. 解答: 典型的"狸猫换太子", 若要删除该 ...

  9. java带头结点空单链表_Java版带头结点单链表的实现

    Java版带头结点单链表的实现 Java版带头结点单链表的实现 package dsr; public interface IList { public void clear();//8 public ...

  10. java 单链表约瑟夫环_java循环单链表实现约瑟夫环问题

    package SingleLinkList; //节点类 class Node{ private int data; private Node next; public int getData() ...

最新文章

  1. 功能测试常用6种方法_建筑管道常用的8种连接方法
  2. bash编程-循环控制的结构
  3. SqlAlchemy个人学习笔记完整汇总
  4. 大话移动通信pdf_移动通信是怎么实现的?
  5. mysql语句的左外链接_MySQL中的JOIN连接
  6. JAVA加载JAR包并调用JAR包中某个类的某个方法
  7. mysql与php的连接_PHP与Mysql的连接
  8. 软件开发学什么编程语言好
  9. 点餐系统小程序源码|小程序点餐系统
  10. 深度解密微信疯读狂加粉的伎俩
  11. python修改pdf文件
  12. linux基本防护 /病毒检测
  13. android的listview分组显示的时候layout_marginTop失效的解决办法
  14. python对数正态分布函数_scipy,对数正态分布-参数
  15. vue前端自动生成编号或者订单单号(日期+随机数)
  16. ubuntu 挂载文件后,文件权限属于root,只能读不能写解决办法
  17. mooc幕课零基础学Java语言(翁恺)if-else语句比较三个数, 输出最大值
  18. TL431工作原理、经典应用电路、输出产生真的的原因分析
  19. android 设置应用程序 默认值
  20. 运维常用单词-会持续更新

热门文章

  1. C# HttpHelper帮助类,真正的Httprequest请求时无视编码,无视证书,无视Cookie,网页抓取...
  2. 《老子》第八十一章 信言不美,美言不信
  3. [轉]子窗口和父窗口的函数或对象能否相互访问
  4. cnil在python_在Python中使用cumprod()计算权益曲线
  5. python库_计算机二级教程 Python语言程序设计,第10章python第三方库概览
  6. 用矩阵点积的办法构造神经网络的迭代次数1:0.6:0.1=1:1:1
  7. 悬浮框_纯HTML实现某宝优惠券、商品列表和活动悬浮等布局(文末有源码)
  8. 微信小程序 html css xml,微信小程序 使用towxml解析html流程及踩坑记录
  9. 【数理知识】《数值分析》李庆扬老师-第2章-插值法
  10. 预告:DIY大宝剑,大宝剑一号 ——DLGG的炽炎长剑