多项式加法 java 链表_多项式加法,用单链表实现。
---恢复内容开始---
#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 链表_多项式加法,用单链表实现。相关推荐
- 力扣Java编译器_力扣--设计单链表
在链表类中实现这些功能: get(index):获取链表中第 index 个节点的值.如果索引无效,则返回-1. addAtHead(val):在链表的第一个元素之前添加一个值为 val 的节点.插入 ...
- python线性链表_线性表 (单链表、循环链表-python实现)
#定义每个节点 classNode:def __init__(self,data): self.data=data self.next=NoneclasslinkList:#初始化头结点 def __ ...
- 单链表的合并算法_图解算法:单链表两两反转 | 眼睛会了手就会系列
一. 序 链表作为一种基本的数据结构,本身理解起来,很简单.它通过指针或者叫引用,将一组零散的内存空间(结点),串联起来组成一个数据存储结构. 链表根据其指针的指向和丰富程度,可以分为单链表.双向链表 ...
- 链表的基本操作 java_JAVA实现单链表的基本操作
复习单链表的实现,扎实基础,单链表的结构不在赘述,直接看代码,注释的很清楚 注意:在插入和删除操作时,需要判断是否越界,如何判断上界?想到了在修改. public class linkList { / ...
- 带头结点单链表 和 不带头结点单链表的区别
文章目录 不带头结点的操作 代码① 代码② 代码③ 代码④ 带头结点的操作 代码⑤ 下面的代码中,传递链表时,传的是头指针.如果是带头结点的链表,传递链表时,可以传头结点,具体可以看看 C语言实现-线 ...
- java数组转换成单链表_【转】单向链表(单链表)的Java实现
最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因 ...
- c++如何判断两个字符串是否相同?_链表 | 如何判断两个单链表(无环)是否交叉...
如何判断两个单链表(无环)是否交叉 单链表相交指的是两个链表存在完全重合的部分,如下图所示 在上图中,这两个链表相交于结点5,要求判断两个链表是否相交,如果相交,找出相交处的结点. 分析 Hash法 ...
- 无头结点单链表的逆置_从无头单链表中删除节点及单链表的逆置
题目: 假设有一个没有头指针的单链表.一个指针指向此单链表中间的一个节点(非第一个节点, 也非最后一个节点).请将该节点从单链表中删除. 解答: 典型的"狸猫换太子", 若要删除该 ...
- java带头结点空单链表_Java版带头结点单链表的实现
Java版带头结点单链表的实现 Java版带头结点单链表的实现 package dsr; public interface IList { public void clear();//8 public ...
- java 单链表约瑟夫环_java循环单链表实现约瑟夫环问题
package SingleLinkList; //节点类 class Node{ private int data; private Node next; public int getData() ...
最新文章
- 功能测试常用6种方法_建筑管道常用的8种连接方法
- bash编程-循环控制的结构
- SqlAlchemy个人学习笔记完整汇总
- 大话移动通信pdf_移动通信是怎么实现的?
- mysql语句的左外链接_MySQL中的JOIN连接
- JAVA加载JAR包并调用JAR包中某个类的某个方法
- mysql与php的连接_PHP与Mysql的连接
- 软件开发学什么编程语言好
- 点餐系统小程序源码|小程序点餐系统
- 深度解密微信疯读狂加粉的伎俩
- python修改pdf文件
- linux基本防护 /病毒检测
- android的listview分组显示的时候layout_marginTop失效的解决办法
- python对数正态分布函数_scipy,对数正态分布-参数
- vue前端自动生成编号或者订单单号(日期+随机数)
- ubuntu 挂载文件后,文件权限属于root,只能读不能写解决办法
- mooc幕课零基础学Java语言(翁恺)if-else语句比较三个数, 输出最大值
- TL431工作原理、经典应用电路、输出产生真的的原因分析
- android 设置应用程序 默认值
- 运维常用单词-会持续更新
热门文章
- C# HttpHelper帮助类,真正的Httprequest请求时无视编码,无视证书,无视Cookie,网页抓取...
- 《老子》第八十一章 信言不美,美言不信
- [轉]子窗口和父窗口的函数或对象能否相互访问
- cnil在python_在Python中使用cumprod()计算权益曲线
- python库_计算机二级教程 Python语言程序设计,第10章python第三方库概览
- 用矩阵点积的办法构造神经网络的迭代次数1:0.6:0.1=1:1:1
- 悬浮框_纯HTML实现某宝优惠券、商品列表和活动悬浮等布局(文末有源码)
- 微信小程序 html css xml,微信小程序 使用towxml解析html流程及踩坑记录
- 【数理知识】《数值分析》李庆扬老师-第2章-插值法
- 预告:DIY大宝剑,大宝剑一号 ——DLGG的炽炎长剑