如何在C++中用单链表实现多项式的加减乘等操作

作者&投稿:休虎 (若有异议请与网页底部的电邮联系)
如何在C++中用链表实现多项式的加减乘法~

刚好做过
#include
using namespace std;
#include
typedef int ElemType;

struct Pnomial //Pnomial=Polynomial(多项式)
{
ElemType co,de1,de2,de3;
//co=coefficient(系数), de=degree(次数)

Pnomial* next;
};

Pnomial *ADD(Pnomial *ph);

void mul(Pnomial *ph,Pnomial *qh);

void main()
{
Pnomial *ph,*qh,*p,*s,*q;
//ph表头指针,p移动指针,q临时储存结点

ph=p=new Pnomial;
qh=q=new Pnomial;

cout<<"
the 1st Polynomial:"<<endl;
cout<<"give coefficient value:"<<endl;

while(p->co!=0)
{
s=new Pnomial;

cin>>s->co;
if(s->co!=0)
{
cout<<"x^";
cin>>s->de1;
cout<<"y^";
cin>>s->de2;
cout<<"z^";
cin>>s->de3;
cout<<"+";
}

p->next=s;
p=s;
}

cout<<"
the 1st Polynomial end."<<endl;
cout<<"
the 2nd Polynomial:"<<endl;
cout<<"give coefficient value:"<<endl;


do
{
s=new Pnomial;

cin>>s->co;
if(s->co!=0)
{
cout<<"x^";
cin>>s->de1;
cout<<"y^";
cin>>s->de2;
cout<<"z^";
cin>>s->de3;
cout<<"+";
}

q->next=s;
q=s;
} while(q->co!=0);

cout<<"the 2nd Polynomial end."<<endl;

p->next=NULL;
p=ph->next;
q->next=NULL;
q=qh->next;

cout<<'
'<<endl;
cout<<"the 1st Polynomial:"<<endl;

while(p->next!=NULL)
{

if(p!=ph->next)
cout<<" + ";

if(p->co!=1)
coutco;

if(p->de1!=0)
{
cout<<"x";
if(p->de1!=1)
coutde1;
}
if(p->de2!=0)
{
cout<<"y";
if(p->de2!=1)
coutde2;
}
if(p->de3!=0)
{
cout<<"z";
if(p->de3!=1)
coutde3;
}
p=p->next;
}
cout<<"
the 1st Polynomial end."<<endl;
cout<<"
the 2nd Polynomial:"<<endl;
while(q->next!=NULL)
{

if(q!=qh->next)
cout<<" + ";

if(q->co!=1)
coutco;

if(q->de1!=0)
{
cout<<"x";
if(q->de1!=1)
coutde1;
}
if(q->de2!=0)
{
cout<<"y";
if(q->de2!=1)
coutde2;
}
if(q->de3!=0)
{
cout<<"z";
if(q->de3!=1)
coutde3;
}
q=q->next;
}
cout<<"
the 2nd Polynomial end."<<endl;
cout<<'
'<<endl;
mul(ph,qh);
}




void mul(Pnomial *ph,Pnomial *qh)
{

Pnomial *p,*q;

Pnomial *re,*di,*temp; //新建一个链表储存结果
//re=result(结果), di=displace(移动指针)

int counter=0;
//计数变量,记录p赋值给temp的起始结点

re=di=new Pnomial;
for(p=ph->next;p->next!=NULL;p=p->next)
{
for(q=qh->next;q->next!=NULL;q=q->next)
{
temp=new Pnomial;
temp->co=p->co*q->co;
temp->de1=p->de1+q->de1;
temp->de2=p->de2+q->de2;
temp->de3=p->de3+q->de3;
di->next=temp;
di=temp;
if(p==ph->next&&q==qh->next)
re=di;
}
}
di->next=NULL;
cout<<"the result Polynomial:"<<endl;
di=ADD(re);
//di回到表头结点,准备打印结果多项式
// di=re->next;//di回到表头结点,准备整理多项式
re=di;

while(di!=NULL)
{
if(di!=re)
cout<<" + ";

if(di->co!=1)
coutco;

if(di->de1!=0)
{
cout<<"x";
if(di->de1!=1)
coutde1;
}
if(di->de2!=0)
{
cout<<"y";
if(di->de2!=1)
coutde2;
}
if(di->de3!=0)
{
cout<<"z";
if(di->de3!=1)
coutde3;
}
di=di->next;

}
}

Pnomial *ADD(Pnomial *ph)
{


Pnomial *re,*p,*q;
p=ph;
q=p->next;
Pnomial *di,*temp; //新建一个链表储存结果
//re=result(结果), di=displace(移动指针)

re=di=new Pnomial;

while(p!=NULL)
{
temp=new Pnomial;
temp->co=p->co;
temp->de1=p->de1;
temp->de2=p->de2;
temp->de3=p->de3;

for(;q!=NULL;)
{
if(p->de1==q->de1&&p->de2==q->de2&&p->de3==q->de3)
{
temp->co+=q->co;
p->next=q->next;
delete q;
q=p->next;
}
else
q=q->next;
}

di->next=temp;
di=temp;
if(p==ph)
re=di;
p=p->next;
if(p!=NULL)
q=p->next;
}
di->next=NULL;
return re;

}

减法的自己改改,很简单

c#界面绘制的时候,底层重绘每次会清除画布背景,然后再全部重新绘制,这才是导致闪烁最主要的原因。于是重载消息发送函数操作,禁掉这条消息。代码如下:
protected override void WndProc(ref Message m)
{
if (m.Msg == 0x0014) // 禁掉清除背景消息
return;
base.WndProc(ref m);
}

这是以前做的一个
运行了的
#include <stdio.h>
#include <malloc.h>
#include<iostream.h>
#include<string.h>

typedef struct LNode //多项式的存储结构定义
{
int coef;
int expn;
struct LNode *next;
}LNode,*polynomail;

void creatpolyn(polynomail &p,int m) //头插法创建多项式
{
int i;
int coef;
int expn;
polynomail s;
p=(polynomail)malloc(sizeof(LNode));
p->next=NULL;

for(i=1;i<=m;++i)
{
s=(polynomail)malloc(sizeof(LNode));
cout<<"请输入一元多项式的系数和指数:";
cin>>coef>>expn;
s->coef=coef;
s->expn=expn;
s->next=p->next;
p->next=s;
}
}

void printpolyn(polynomail p) //输出多项式单链表的元素值
{
p=p->next;
while(p!=NULL)
{
if(p->coef!=0)
cout<<p->coef<<"X^"<<p->expn<<"+ ";
p=p->next;
}
cout<<endl;
}

/*void SortPloy(polynomail L) //升幂排序
{
polynomail p=L->next,q,r;
if(p!=NULL)
{
r=p->next;
p->next=NULL;
p=r;
while(p!=NULL)
{
r=p->next;
q=L;
while(q->next!=NULL&&q->next->expn<p->expn)
q=q->next;
p->next=q->next;
q->next=p;
p=r;
}
}
}*/

void SortPloy(polynomail L) //升幂排序
{
polynomail p=L->next,q=p->next;
int coef,expn;
while(p!=NULL&&p->next!=NULL)
{
while(q!=NULL)
{
if(p->expn>q->expn)
{
coef=p->coef;expn=p->expn;
p->coef=q->coef;p->expn=q->expn;
q->coef=coef;q->expn=expn;
}
q=q->next;
}
p=p->next;
q=p->next;
}
}

void polyvalue(polynomail p,int x0) //求多项式的值
{ int i,s=1,t,r=0;
p=p->next;
while(p!=NULL)
{
for(i=1;i<=p->expn;i++)
{ s=s*x0;
}
t=s*p->coef;
r+=t;
s=1;
p=p->next;
}
cout<<r<<endl;
}

polynomail AddPoly(polynomail pa,polynomail pb) /*求两个多项式的和*/
{
SortPloy(pa);
SortPloy(pb);
polynomail rn,p1=pa->next,p2=pb->next,p,tc,s;
rn=(polynomail)malloc(sizeof(LNode)); /*新建头结点*rn*/
rn->next=NULL; /*rn为新建单链表的头结点*/
tc=rn; /*tc始终指向新建单链表的最后结点*/
while (p1!=NULL && p2!=NULL)
{
if (p1->expn<p2->expn) /*将*p1结点复制到*s并链到rn尾*/
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;
tc->next=s;tc=s;
p1=p1->next;
}
else if (p1->expn>p2->expn) /*将*p2结点复制到*s并链到rn尾*/
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p2->coef;s->expn=p2->expn;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;
}
else /*p1->expn=p2->expn的情况*/
{

s=(polynomail)malloc(sizeof(LNode));
s->coef=p1->coef+p2->coef;s->expn=p1->expn;
s->next=NULL;
tc->next=s;tc=s;

p1=p1->next;p2=p2->next;
}
}
if (p1!=NULL) p=p1; /*将尚未扫描完的余下结点复制并链接到rn单链表之后*/
else p=p2;
while (p!=NULL)
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
tc->next=s;tc=s;
p=p->next;
}
tc->next=NULL; /*新建单链表最后结点的next域置空*/
return rn;
}

polynomail DelPoly(polynomail pa,polynomail pb) /*求两个多项式的差*/
{ SortPloy(pa);
SortPloy(pb);
polynomail tn,p1=pa->next,p2=pb->next,p,tc,s;
tn=(polynomail)malloc(sizeof(LNode)); /*新建头结点*tn*/
tn->next=NULL; /*tn为新建单链表的头结点*/
tc=tn; /*tc始终指向新建单链表的最后结点*/
while (p1!=NULL && p2!=NULL)
{
if (p1->expn<p2->expn) /*将*p1结点复制到*s并链到tn尾*/
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p1->coef;s->expn=p1->expn;s->next=NULL;
tc->next=s;tc=s;
p1=p1->next;
}
else if (p1->expn>p2->expn) /*将*p2结点复制到*s并链到tn尾*/
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=-p2->coef;s->expn=p2->expn;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;
}
else /*p1->expn=p2->expn的情况*/
{

s=(polynomail)malloc(sizeof(LNode));
s->coef=p1->coef-p2->coef;s->expn=p1->expn;
s->next=NULL;
tc->next=s;tc=s;

p1=p1->next;p2=p2->next;
}
}
if (p1!=NULL) p=p1; /*将尚未扫描完的余下结点复制并链接到tn单链表之后*/
else
{ if(p2!=NULL)
{ s=(polynomail)malloc(sizeof(LNode));
s->coef=-p2->coef;s->expn=p2->expn;s->next=NULL;
tc->next=s;tc=s;
p2=p2->next;
p=p2;
}
else
{
p=NULL;
s->next=NULL;
tc->next=s;tc=s;
}

}
while (p!=NULL)
{
s=(polynomail)malloc(sizeof(LNode));
s->coef=p->coef;s->expn=p->expn;s->next=NULL;
tc->next=s;tc=s;
p=p->next;
}
tc->next=NULL; /*新建单链表最后结点的next域置空*/
return tn;
}

void save(polynomail p,int m) /*将多项式的系数和指数保存到外部文件中*/
{FILE *fp;
polynomail s;
char filename[10];
cout<<"请输入要保存的文件名,例如:c:\\score\n";
cin>>filename;
if((fp=fopen(filename,"w+"))==NULL) /*为输出打开一个二进制文件,为只写方式*/
{
printf("打不开文件Cannot open the file\n");
return; /*若打不开则返回菜单*/
}
printf("\n保存中...Saving the file......\n");
s=(polynomail)malloc(sizeof(LNode));
s=p->next;
while(s!=NULL)
{
fprintf(fp,"%d,%d\n",s->coef,s->expn); /*写入一条记录*/
s=s->next;
}
fclose(fp); /*关闭文件*/
printf("保存成功....Save the file successfully!\n");
}

polynomail read(int m) /*从保存的外部文件中读取多项式的系数和指数*/
{ int i;
int coef,expn;
char filename[20];
polynomail s,p;
p=(polynomail)malloc(sizeof(LNode));
p->next=NULL;
cout<<"请输入要读取的文件名,例如:c:\\score\n";
cin>>filename;
FILE* fp;
fp=fopen(filename, "r+");
for(i=1;i<=m;i++)
{s=(polynomail)malloc(sizeof(LNode));
fscanf(fp, "%d,%d", &coef, &expn);
cout<<coef<<","<<expn<<endl;
s->coef=coef;
s->expn=expn;
s->next=p->next;
p->next=s;
}
printpolyn(p);
return p;
}

void main()
{ int a=0;
while(a!=8)
{cout<<"--------------------菜单选项--------------------------------------------\n";
cout<<"******** 1、创建一元多项式Pn(x)和Qn(x) *********************************\n";
cout<<"******** 2、输出一元多项式Pn(x)和Qn(x) *********************************\n";
cout<<"******** 3、对一元多项式Pn(x)和Qn(x)进行升幂排序 ***********************\n";
cout<<"******** 4、对一元多项式Pn(x)和Qn(x)进行求值 ***************************\n";
cout<<"******** 5、对一元多项式Pn(x)和Qn(x)进行求和、差 ***********************\n";
cout<<"******** 6、将一元多项式Pn(x)和Qn(x)的系数和指数保存到外部文件 *********\n";
cout<<"******** 7、读取外部文件并创建一元多项式Pn(x)和Qn(x) *******************\n";
cout<<"******** 8、退出菜单 ***************************************************\n";
cout<<"------------------------------------------------------------------------\n";
cout<<"请输入你要选择的菜单选项:";
cin>>a;
switch(a)
{case 1: int m,n,x0,x1;
polynomail Pn,Qn,Rn,Tn;
cout<<"请输入一元多项式Pn的项数:";
cin>>m;
creatpolyn(Pn,m);
cout<<"已创建一元多项式Pn\n";
cout<<"请输入一元多项式Qn的项数:";
cin>>n;
creatpolyn(Qn,n);
cout<<"已创建一元多项式Qn\n";
break;

case 2: cout<<"原一元多项式Pn:";
printpolyn(Pn);
cout<<"原一元多项式Qn:";
printpolyn(Qn);
cout<<endl;
break;

case 3: SortPloy(Pn);
SortPloy(Qn);
cout<<"排序后的一元多项式Pn:";
printpolyn(Pn);
cout<<"排序后的一元多项式Qn:";
printpolyn(Qn);
cout<<endl;
break;

case 4: cout<<"请输入一元多项式Pn中的x0的值:";
cin>>x0;
cout<<"一元多项式Pn(x0)的值:";
polyvalue(Pn,x0);
cout<<endl;
cout<<"请输入一元多项式Qn中的x1的值:";
cin>>x1;
cout<<"一元多项式Qn(x1)的值:";
polyvalue(Qn,x1);
cout<<endl;
break;

case 5: Rn=AddPoly(Pn,Qn);
cout<<"一元多项式Pn,Qn相加结果Rn:";
printpolyn(Rn);
cout<<endl;
Tn=DelPoly(Pn,Qn);
cout<<"一元多项式Pn,Qn相减结果Tn:";
printpolyn(Tn);
cout<<endl;
break;

case 6: save(Pn,m);
save(Qn,n);
break;

case 7: cout<<"请输入一元多项式Pn的项数:";
cin>>m;
Pn=read(m);
cout<<"请输入一元多项式Qn的项数:";
cin>>n;
Qn=read(n);
break;

case 8: break;

default: cout<<"没有该菜单选项,请重新选择\n";
break;

}
}
}

跟大数运算基本上一回事


c语言有什么用?
“项目驱动式”教学就是以项目为目的,以c语言理论教学为过程,最终能用c语言设计项目,实现项目的要求。“项目驱动式”教学的关键在于培养学生“如何做什么”和“可以干什么”。一个项目就是一个工程,在“项目驱动式”教学中,首先应该让学生简单了解什么是软件工程思想,其次在c语言理论教学过程中,让学生懂得面向对象的...

大神何在,用C语言编程,写出来
include "stdio.h"int main(){ int n,i,flag=1; printf("请输入一个整数:"); scanf("%d",&n); if(n<=1) { printf("%d不是素数\\n",n); return 0; } for(i=2;i<=n\/2;i++) { if(n%i==0) { flag=0; break; } } if(flag==1)...

求标准C语言,查找某字符串在指定字节串中的位置代码。
j;int s_len=strlen(source);int t_len=strlen(target);if(t_len>s_len){return -1;}for(i=0;i<=s_len-t_len;i++){j=0;int flag=1;if(source[i]==target[j]){int k,p=i;for(k=0;k<t_len;

计算机C语言有什么用啊??
用处:C语言是一种计算机程序设计语言。它可以作为系统设计语言,编写工作系统应用程序,也可以作为应用程序设计语言,编写不依赖计算机硬件的应用程序。特征:1、C语言是高级语言。它把高级语言的基本结构和语句与低级语言的实用性结合起来。C 语言可以像汇编语言一样对位、字节和地址进行操作,而这三者是计算...

学C语言有什么用啊?
“项目驱动式”教学就是以项目为目的,以c语言理论教学为过程,最终能用c语言设计项目,实现项目的要求。“项目驱动式”教学的关键在于培养学生“如何做什么”和“可以干什么”。一个项目就是一个工程,在“项目驱动式”教学中,首先应该让学生简单了解什么是软件工程思想,其次在c语言理论教学过程中,让学生懂得面向对象...

在C语言中为什么要把int分为有符号和无符号
当然你会说我定义成long不就行了,但这是不一样的,无符号int一般两位元组的,而long一般是四位元组的。C语言中怎么区分有符号和无符号 signed int 有符号整型 -32768-32767 unsigned int 无符号整型 0-65535 如何你需要一个数是 33000 要用unsigned int 而不是signed int 其他型别同理 C...

瞎写的一组c语言程序,请问问题何在
有可能是*(i+j)=z;出问题了,你想想你申请的i指针并没有给它相应足够的空间,你觉得i对应地址后的空间都没有使用?你这样指针操作是危险的 你可以这样命名 int i[10];这样可以保证n不大于10是正常的。如果你想弄成活的,那就要用到链表的数据结构了 ...

...程序里有命令提示符,它在计算机中用途何在?如何使用它?
C:\\>msd 回车后可见到如下画面,在每个选项旁边加了注解,表示该按钮的功用 ?? 2. 选择需查询的项目,比如选第一个Computer,将会弹出一个对话框显示电脑的一些基本信息。你可以试试其他的选项,看看有什么用。 3. 按Alt+F键激活下拉菜单后, 选择"Exit"项退出。 undelete 恢复被删除的文件 〔适用场合〕 ...

(C语言)有如下程序:输出数组中的全部元素。
第一个for语句,只管到scanf("%d",&a[i]); 读入数据。这个循环结束后,i的值已经是10.第二个for语句,如果想每行输出一个数,应该管到printf("\\n"); 此时,应该讲两个printf语句放到{ }中。这个程序第二个for实际上只管printf("%d",a[i]); 所有的数都显示在一行上。第二个for管打印出...

单片机c语言中的外部中断
如楼上所说,要实现可以,不过不知道用意何在 int x;void shizhong() interrupt 1 { x=1;while(x==1){ flag=1;} } void kaishi() interrupt 0 { x=0;\/\/ while(x==0) 你要一直停在外部中断0,加上这句;\/\/{ k=0;\/\/ } } ...

柳城县14775046241: 如何在C++中用单链表实现多项式的加减乘等操作 -
辕鲁尼为: 这是以前做的一个 运行了的#include <stdio.h>#include <malloc.h>#include<iostream.h>#include<string.h> typedef struct LNode //多项式的存储结构定义 { int coef; int expn; struct LNode *next; }LNode,*polynomail; void creatpolyn(polynomail &p,int m...

柳城县14775046241: 编写一个程序用单链表存储多项式,并实现两个多项式相加的函数? -
辕鲁尼为: /* 多项式加法和乘法示例 */ #include <list> #include <iostream> #include <cassert>using namespace std;//定义多项式的项类 class term { public:int coef; //多项式系数int exp; //多项式指数//初始化项的系数和指数term( int c=0,int e=0):...

柳城县14775046241: C++线性表的基本操作及应用 要求:使用单链表的创建算法,建立两个多项式,然后使用求和算法实现多项式相 -
辕鲁尼为: #include <stdio.h>#include<malloc.h>#include<conio.h> typedef struct { float coef; int expn; } ElemType; typedef struct LNode { ElemType data; struct LNode *next; } LNode,*LinkList; LinkList InitList()//创建链表 { LinkList L; L=(LinkList)malloc(...

柳城县14775046241: 如何在C++中用链表实现多项式的加减乘法 -
辕鲁尼为: 刚好做过 #include<iostream> using namespace std; #include<stdlib.h> typedef int ElemType;struct Pnomial //Pnomial=Polynomial(多项式) { ElemType co,de1,de2,de3; //co=coefficient(系数), de=degree(次数)Pnomial* next; };...

柳城县14775046241: c++多项式的计算(单项链表的应用)设计处理n次一元多项式P(x) = a0 + a1x + a2x2 + … + anxn, -
辕鲁尼为: #include <iostream> using namespace std; class Polynomial { double *coefs; //系数数组 int *exps; //指数数组 int size; //项数 public: Polynomial() {coefs=NULL,exps=NULL,size=0;cout<<"构造完成"<<endl;} Polynomial(double coef[],int exp[],...

柳城县14775046241: C/C++数据结构用单链表实现两个多项式的相加运算,要求对于两个给定的有序多项式(按指数升序排列) -
辕鲁尼为: c#界面绘制的时候,底层重绘每次会清除画布背景,然后再全部重新绘制,这才是导致闪烁最主要的原因.于是重载消息发送函数操作,禁掉这条消息.代码如下: protected override void WndProc(ref Message m) { if (m.Msg == 0x0014) // 禁掉清除背景消息 return; base.WndProc(ref m); }

柳城县14775046241: c++ 用链表实现一元多项式的赋值运算,一定采纳! -
辕鲁尼为: 错误在主函数里:void main() { double a1[1]={1.2}; int b1[1]={2}; double a2[1]={1.2}; int b2[1]={2}; poly po1(a1,b1,3); //第三个参数为3,说明多项式有三项,而你传入的参数、指数都只有一项.a1[1]、b1[1]都只有一个有效元素. poly po2(a2,b2,4); //错误类似 cout<<po1.value(2); }

柳城县14775046241: 怎么用链表实现多项式的相加 -
辕鲁尼为: #include#include#define NULL 0typedef struct list{ int num; int num2; struct list *next;}*link;/* 链表实现多项式的相加*///建立单链表link creat_list(int n){ link p1,p2,L; int i; p2=p1=(link)malloc(sizeof(*p1)); scanf("%d,%d",&p1->num,&p1->num2); ...

柳城县14775046241: 用C语言链表实现多元多项式及其乘法,加法. -
辕鲁尼为: 用C语言链表实现多项式, 例如f(x_{i,k}^{l})=3+x_{1,2}^2x_{3,2}+x_{1,3}x_{4,3}^3 (变量x_{i,k}^{l}有3个指标i,k,l, i,k,l可以取遍1到n的整数).要求多项式由键盘输入,用链表存储单项式(节点是x_{i,k}^{l}),用链表存储多项式(节点是单项式).编写3个函数分别是实现多项式加法,乘法的函数,以及输出多项式的函数.

柳城县14775046241: C++用链表实现两个一元多项式相加,结果存放在第三个链表中. -
辕鲁尼为: #include<iostream.h> typedef struct LNode { float a; //系数 int b; //指数struct LNode *next; }LNode; LNode *InitList() //建立链表并输入多项式函数 { LNode *p,*q,*head; float a; int n=0; int i,j; head=new LNode; cout<<"最高项次数:"<<endl;...

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网