C++一元多项式相加
实验名称:一元多项式相加
// multiply.cpp : 定义控制台应用程序的入口点。
// #include "stdafx.h"
#include<iostream>
#include "stdio.h"
using namespace std; /***********************定义多形式的数据结构*************************/
typedef struct Node
{
int coef; //多项式系数
int exp; //多项式指数
struct Node *next;//指向下一项的指针
} Node,*LinkList; //定义了一个Node型指针的别名LinkList; /***********************多项式初始化*************************/
void initpoly (LinkList &px)
{
px = new Node;
px ->next = NULL;
} /***********************多项式创建*************************/
void creatpoly (LinkList &px,int n )
{
LinkList p=NULL,q=NULL; //q是用来开辟空间的。
p = px; //p是用来存储整个链表的。 这里px相当于一个全局的指针变量一样。
for(int i = ; i < n; i++)
{
q = new Node;
cout << "请输入第" << i << "项的系数:"<< endl;
cin >> q ->coef;
cout << "请输入第" << i << "项的指数:"<< endl;
cin >> q ->exp;
q ->next = NULL;
p ->next = q;//链表向前一直在扩大。
p = q;
}
} int lengthpoly(LinkList &px) //计算多项式的项数。
{
LinkList p = NULL;
int count = ;
p = px ->next;
while(p != NULL)
{
p = p ->next;
count++;
}
return count;
}
/***********************多项式输出*************************/
void outputpoly(LinkList &px)
{
LinkList p = NULL;
p = px ->next;
for(int i = ;i < lengthpoly(px);i++)
{
cout << p ->coef << "*X^" << p->exp << "+";
p = p ->next;
}
cout << "" << endl;
}
/***********************多项式相加*************************/
//void addpoly(LinkList &pa,LinkList &pb,LinkList &pc)
//{
// LinkList la=NULL,lb=NULL,lc=NULL,r=NULL;
// la = pa ->next;
// lb = pb ->next;
// lc = pc; //prep是用来存储整个a+b的链表的。
// while(la&&lb)//a与b其中一个不为0
// {
// if(la ->exp < lb ->exp) //a的指数小
// {
// r = new Node;
// r ->coef = la ->coef;
// r ->exp = la ->exp;
// lc ->next = r;
// lc = r;
// r ->next = NULL;
// la = la ->next;
// }
// else if(la ->exp > lb ->exp)
// {
// r = new Node;
// r ->coef = lb ->coef;
// r ->exp = lb ->exp;
// lc ->next = r;
// r ->next = NULL;
// lc = r;
// lb = lb ->next;
// }
// else
// {
// int sum = la ->coef + lb ->coef;
// if(sum != 0)
// {
// r = new Node;
// r ->coef = sum;
// r ->exp = la ->exp;
// lc ->next = r;
// r ->next = NULL;
// lc = r;
// la = la ->next;
// lb = lb ->next;
// }
// else
// {
// la = la ->next;
// lb = lb ->next;
// }
// }
//
// }
// while(la != NULL)
// {
// r = new Node;
// r ->coef = la ->coef;
// r ->exp = la ->exp;
// lc ->next = r;
// lc = r;
// r ->next = NULL;
// la = la ->next;
// }
// while(lb != NULL)
// {
// r = new Node;
// r ->coef = lb ->coef;
// r ->exp = lb ->exp;
// lc ->next = r;
// lc = r;
// r ->next = NULL;
// lb = lb ->next;
// }
//} Node * addDuoX(LinkList &Pa,LinkList &Pb)//关键部分,A与B相加
{
Node *p,*q;
Node *prep;
Node *u; p = Pa->next;
q = Pb->next; prep=Pa; while (p&&q)//A与B都不等于0
{
if(p->exp<q->exp)//A的指数小于B的指数
{
prep=p;
p=p->next;
}
else if(p->exp > q->exp)//A的指数大的话
{
u=q->next; q->next=p;
prep->next=q; prep=q;
q=u;
}
else//A与B的指数相等的话
{
p->coef=p->coef+q->coef;
if(p->coef==)//A与B的指数相等的话,且其中A的系数为0
{
Node *temp1;
Node *temp2;
temp1=p;
temp2=q;
prep->next=p->next;//删除该项数
p=p->next;
q=q->next; delete temp1;
delete temp2;
}
else//A与B的指数相等的话,且其中A的系数为0,B的系数为0
{
Node *temp2;
temp2=q; prep=p;
p=p->next;
q=q->next;
delete temp2;
}
}
}
if(q)
prep->next=q; delete Pb;
return Pa;
} //再做一个小的处理,先合并同类型。对指数相同的进行相加,并删去其中一个,合并同类项
void hebing(Node *px)
{
Node *p = NULL,*q = NULL;
p = px ->next;
q = new Node;
while(p->next!=NULL)
{
q = p ->next;
if(p ->exp == q ->exp)
{
p ->coef = p->coef + q->coef;
p -> next = q -> next;
//p 不在受q约束,一直不受其约束。
delete(q);
}
p = p ->next;
}
}
/*** 程序中用了选择排序 ***/
void paixu(Node *px)
{
//用选择排序怎么做
Node *p = NULL,*q = NULL;
p = px ->next; //此时开辟了内存空间。
q = px ->next;
int temp; //注:类初始化化时需要加上(),而结构体初始化不需要。
for(p ;p!= NULL;p = p ->next) //这玩意就相当于i++,
{
for(q = p ->next; q!= NULL; q = q ->next ) //为什么不用q -> next,因为q = p -> next 了。
{
if(p ->exp > q ->exp) //我真是弄错啦,我现在只需要把结点里面的值换掉就行了,何必换掉整个的结点,这样位置肯定出问题。
{
temp = p ->exp;
p ->exp = q ->exp;
q ->exp = temp; temp = p ->coef;
p ->coef= q ->coef;
q ->coef = temp;
}
}
}
} int main()
{
LinkList pa = NULL,pb = NULL,pc = NULL;
initpoly(pa);
initpoly(pb);
initpoly(pc);
int a,b; cout << "输入第一个多项式的项数:"<<endl;
cin >> a;
cout << "输入第二个多项式的项数:"<<endl;
cin >> b;
cout << "请按升序输入:"<<endl;
cout << "请输入第一个多项式的系数与指数"<<endl;
creatpoly(pa,a);
hebing(pa);
paixu(pa);
outputpoly(pa);
cout << "请按升序输入:"<<endl;
cout << "请输入第二个多项式的系数与指数"<<endl;
creatpoly(pb,b);
paixu(pb);
outputpoly(pb);
//addpoly(pa,pb,pc);
pc = addDuoX(pa,pb);
outputpoly(pc);
cin >> b;
delete(pa);
delete(pb);
delete(pc);
return ;
}
实验目的:练习并掌握如何使用C++语言实现链表的说明、创建等操作。
实验要求:能实现一元多项式的输入、输出,以及两个一元多项式相加及结果显示。(具体内容请参照数据结构实验内容)
实验步骤及内容:
1、首先建立一个定义多项式的结构体Node,及结构体指针LinkList,该结构体包含一个指数exp,一个系数coef,一个指向下一项的指针*next,代码如下:
typedef struct Node
{
int coef; //多项式系数
int exp; //多项式指数
struct Node *next;//指向下一项的指针
} Node,*LinkList; //定义了一个Node型指针的别名LinkList;
2、初始化多项式,代码如下:
void initpoly (LinkList &px)
{
px = new Node;
px ->next = NULL;
}
3、建立多项式,用来指导用户输入程序运行时所需要的必须得数据,两个一元多项式的项数、系数、指数。具体的代码如下:
void creatpoly (LinkList &px,int n )
{
LinkList p=NULL,q=NULL; //q是用来开辟空间的。
p = px; //p是用来存储整个链表的。
for(int i = 0; i < n; i++)
{
q = new Node;
cout << "请输入第" << i << "项的系数:"<< endl;
cin >> q ->coef;
cout << "请输入第" << i << "项的指数:"<< endl;
cin >> q ->exp;
q ->next = NULL;
p ->next = q;
p = q;
}
}
4、求一个多形式的长度,主要用来获取一个多形式的长度,便于输出。
int lengthpoly(LinkList &px) //计算多项式的项数
{
LinkList p = NULL;
int count = 0;
p = px ->next;
while(p != NULL)
{
p = p ->next;
count++;
}
return count;
}
5、输出多形式,此函数用来对多项式进行输出验证。
void outputpoly(LinkList &px)
{
LinkList p = NULL;
p = px ->next;
for(int i = 0;i < lengthpoly(px);i++)
{
cout << p ->coef << "^" << p->exp << "+";
p = p ->next;
}
cout << "0" << endl;
}
6、多项式相加,输出也是按序排列。当两个多项式都不为0时,进行相加,然后剩下的部分直接赋给相加后的多项式,前提是输入的多形式必须是按顺序排列的。代码如下:
void outputpoly(LinkList &px)
{
LinkList p = NULL;
p = px ->next;
for(int i = 0;i < lengthpoly(px);i++)
{
cout << p ->coef << "*X^" << p->exp << "+";
p = p ->next;
}
cout << "0" << endl;
}
void addpoly(LinkList &pa,LinkList &pb,LinkList &pc)
{
LinkList la=NULL,lb=NULL,lc=NULL,r=NULL;
la = pa ->next;
lb = pb ->next;
lc = pc; //prep是用来存储整个a+b的链表的。
while(la&&lb)//a与b其中一个不为
{
if(la ->exp < lb ->exp) //a的指数小
{
r = new Node;
r ->coef = la ->coef;
r ->exp = la ->exp;
lc ->next = r;
lc = r;
r ->next = NULL;
la = la ->next;
}
else if(la ->exp > lb ->exp)
{
r = new Node;
r ->coef = lb ->coef;
r ->exp = lb ->exp;
lc ->next = r;
r ->next = NULL;
lc = r;
lb = lb ->next;
}
else
{
int sum = la ->coef + lb ->coef;
if(sum != 0)
{
r = new Node;
r ->coef = sum;
r ->exp = la ->exp;
lc ->next = r;
r ->next = NULL;
lc = r;
la = la ->next;
lb = lb ->next;
}
else
{
la = la ->next;
lb = lb ->next;
}
}
}
while(la != NULL)
{
r = new Node;
r ->coef = la ->coef;
r ->exp = la ->exp;
lc ->next = r;
lc = r;
r ->next = NULL;
la = la ->next;
}
while(lb != NULL)
{
r = new Node;
r ->coef = lb ->coef;
r ->exp = lb ->exp;
lc ->next = r;
lc = r;
r ->next = NULL;
lb = lb ->next;
}
}
7、主函数代码如下,为了便于交互,所以增加了好些用户提示符:
int main()
{
LinkList pa = NULL,pb = NULL,pc = NULL;
initpoly(pa);
initpoly(pb);
initpoly(pc);
int a,b;
cout << "输入第一个多项式的项数:"<<endl;
cin >> a;
cout << "输入第二个多项式的项数:"<<endl;
cin >> b;
cout << "请输入第一个多项式的系数与指数"<<endl;
creatpoly(pa,a);
cout << "请输入第二个多项式的系数与指数"<<endl;
creatpoly(pb,b);
addpoly(pa,pb,pc);
outputpoly(pc);
cin >> b;
delete(pa);
delete(pb);
delete(pc);
return 0;
}
当然我们可以在人性化一点,加上while实现,连续操作。
实验总结:
1、刚开始编的时候,老是出现不能访问内存错,说是没有初始化,不能访问。通过查找资料发现,在开辟一个新节点时,必须给其开辟空间,在c++里面用new语句,在c中用malloc语句即可。在定义结构体指针的时候,最好给其赋值为空,谨防出现野指针的情况。
2、 多项式相加的函数中,定义了一个返回LinkList的返回值,不过一直出错,直到我把返回值去掉的时候,才不会出错,具体什么原因,我现在还不清楚。
C++一元多项式相加的更多相关文章
- PHP数据结构之四 一元多项式的相加PHP单链实现
<?php /** *一元多项式的表示和相加 *一元多项式的表示采用单链表的形式 **/ header("content-type:text/html;charset=gb2312&q ...
- 一元多项式的表示及相加(抽象数据类型Polynomial的实现)
// c2-6.h 抽象数据类型Polynomial的实现(见图2.45) typedef struct // 项的表示,多项式的项作为LinkList的数据元素 { float coef; // 系 ...
- 单链表之一元多项式求和C++实现
单链表之一元多项式求和 一元多项式求和单链表实现伪代码 1.工作指针 pre.p.qre.q 初始化2.while(p 存在且 q 存在)执行下列三种情况之一: 2.1.若 p->exp < ...
- 父类与子类this相关问题
1.SinglyLinkedList: package No3_PolySinglyList; /*实现 带头结点的单链表SinglyLinkedList类*/ public class Singly ...
- 一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作(1)
数学中一元n次多项式可表示成如下的形式: Pn(x)=p0+p1x+p2x^2+…+pnx^n (最多有 n+1 项,n +1 个系数唯一确定她) (1)请设计一套接口用以表示和操 ...
- 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加
一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...
- 关于使用静态链表实现一元多项式的相加&&乘积
一元多项式的相加类似于两条链表的合并 当然前提是链表中的幂指数是按顺序排列的 此题中的链表采用的是升序排列,输出也是按升序输出的 #include<stdio.h> #include< ...
- 数据结构 C++ 单链表 一元多项式的相加
#include <iostream> using namespace std; struct Node { double coe; //系数 int exp; //指数 Node *ne ...
- PAT 02-线性结构2 一元多项式的乘法与加法运算 (20分)
设计函数分别求两个一元多项式的乘积与和. 输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. ...
随机推荐
- 【bzoj4869】[Shoi2017]相逢是问候 扩展欧拉定理+并查集+树状数组
题目描述 Informatik verbindet dich und mich. 信息将你我连结. B君希望以维护一个长度为n的数组,这个数组的下标为从1到n的正整数.一共有m个操作,可以分为两种:0 ...
- ABC128F Frog Jump
题目链接 题目大意 给定一个长为 $n$ 的数组 $s$,下标从 $0$ 开始.$ 3 \le n \le 10^5$,$-10^9 \le s_i \le 10^9$,$s_0 = s_{n - 1 ...
- Codeforces #1063C Dwarves, Hats and Extrasensory Abilities
题目大意 交互题. 输出平面上的一个点的坐标,交互程序给这个点染色(白或黑). 如此重复 $n$ 次($ 1\le n \le 30$). 要求输出的 $n$ 个点各不相同,并且不论交互程序怎样给它们 ...
- 网络流 24 题汇总(LOJ 上只有 22 题???)
太裸的我就不放代码了...(黑体字序号的题表示值得注意) 1.搭配飞行员 [LOJ#6000] 二分图最大匹配. 2.太空飞行计划 [LOJ#6001] 最小割常规套路.输出方案.(注:这题换行符要用 ...
- Hive 01 概述、安装配置
概述 数据仓库:是一个面向主题的.集成的.不可更新的.随时间不变化的数据集合,它用于支持企业或组织的决策分析处理. 数据仓库的结构和建立过程: 数据源 数据存储及管理 ETL Extract 提取 T ...
- js汉字转拼音首字母
js汉字转拼音首字母 2018-04-09 阅读 1018 收藏 1 原链:segmentfault.com 分享到: 前端必备图书<JavaScript设计模式与开发实践> > ...
- [LeetCode] Path Sum II 深度搜索
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- 《Linux命令行与shell脚本编程大全 第3版》Linux命令行---23
以下为阅读<Linux命令行与shell脚本编程大全 第3版>的读书笔记,为了方便记录,特地与书的内容保持同步,特意做成一节一次随笔,特记录如下:
- java使用dbutils工具类实现小程序 管家婆记账软件
1.所需创建的包和 jar包 2.创建表结构 #生成一些表数据 ,,'交通银行','2016-03-02','家庭聚餐'); ,,'现金','2016-03-15','开工资了'); ,,'现金', ...
- Android布局实现阴影效果
最近某个模块的UI,设计想要卡片式阴影效果.之前查阅过资料,用传统的xml方式作为布局的background <?xml version="1.0" encoding=&qu ...