多项式相加(链表)

#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()
{
cout << "请输入多项式p1:" << endl;
poly*p1 = input();
cout << "请输入多项式p2:" << endl;
poly*p2 = input();
poly*p3 = polyadd(p1, p2);
cout << "p1+p2后为:" << endl;
while (p3){
cout << p3->coef << ‘ ‘ << p3->expon << endl; //输出结果
p3 = p3->next;
}
return 0;
}
poly*input()
{
poly*p = new poly;
poly*head = p, *p1 = p;
cout << "请输入系数和指数,以系数为0表示结束;" << endl;
cin >> p->coef >> p->expon;
if (p->coef == 0){
head->next =NULL;
return head;
}
while (p->coef){
p1 = p;
p = new poly;
cin >> p->coef >> p->expon;
p1->next = p;
}
delete p;
p1->next = NULL;
return head;
}
poly *polyadd(poly *p1, poly *p2)
{
int sum;
poly*p = new poly;
poly*head = p,*rear = p;
while (p1&&p2){
switch (compare(p1->expon, p2->expon)){ //每次均要比较p1和p2的指数
case 1:
rear=attach(rear, p1->coef, p1->expon); //每次循环都更换未结点
p1 = p1->next; //下移动一个结点
break;
case -1:
rear=attach(rear, p2->coef, p2->expon);
p2 = p2->next; //下移动一个结点
break;
case 0:
sum = p1->coef + p2->coef;
if (sum) //若果系数不为0
rear=attach(rear, sum, p1->expon);
p1 = p1->next;
p2 = p2->next;
break;
}
}
while (p1){ //上面跳出来的结果要么p1为空,要么p2为空
rear=attach(rear, p1->coef, p1->expon);
p1 = p1->next;
}
while (p2){
rear=attach(rear, p2->coef, p2->expon);
p2 = p2->next;
}
rear->next = NULL; //未结点的next指针指向空
poly*temp = head;
head = head->next;
delete temp; //删除空的头结点
return head; //返回头结点
}
poly *attach(poly *rear,int sum, int expon)
{
poly*p = new poly;
p->coef = sum;
p->expon = expon;
rear->next = p; //将结果连接在一起
return p;
}
int compare(int a, int b)
{
if (a > b)
return 1;
else if (a == b)
return 0;
return -1;
}

时间: 2024-08-08 22:09:45

多项式相加(链表)的相关文章

双链表&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

链表_多项式相加相乘

加法部分运行成功.乘法仍存在问题,找机会解决,欢迎大家指正. 还有一个问题,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

多项式链表多项式相加

//多项式相加 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

多项式相加运算

 多项式相加运算,使用链表实现,代码仍需要改善,这里先初步做个记录 //实现多项式的表示及相加 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

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

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

从多项式相加看线性结构

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

多项式相加

#include <stdio.h> #include <stdlib.h> typedef struct PolyNode *PtrToNode; //定义链表节点,也就是多项式中的某一项: typedef struct PolyNode { int Coeff; int Exponent; PtrToNode Next; } PolyNode; typedef PtrToNode Polynomial; /************************************

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

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

算法总结之 两个链表生成相加链表

假设链表中每一个节点的值都在0~9之间,那么链表整体就可以代表一个整数 给定两个链表的头节点head1和head2,请生成代表两个整数相加值的结果链表 传统做法 先把链表生成 整数 然后相加  这样的有个溢出问题 介绍一种做法: 利用栈结构求解: 1. 将两个链表分别从左到右遍历,遍历过程中将值压栈,这样就生成了两个链表节点的逆序栈s1 和 s2. 2.将s1和s2同步弹出,这样相当于两个链表从低位到高位一次弹出,在这个过程中生成相加链表即可,同时关注下是否有进位. 当s1 和 s2都为空时,还