数据结构(c++)一元多项式的代数运算
看我的:
#include "Polynomial.h"
#include
using namespace std;
void Polynomial::DestroyLink(Link &L)
{
Link p;
p=L->next;
while(p)
{
L->next=p->next;
delete p;
p=L->next;
}
delete L;
L=NULL;
}
//创建含有n个链表类型结点的项,即创建一个n项多项式
void Polynomial::CreateLink(Link &L,int n)
{
if(L!=NULL)
{
DestroyLink(L);
}
Link p,newp;
L=new LNode;
L->next=NULL;
(L->data).exp=-1;//创建头结点
p=L;
for(int i=1;i <=n;i++)
{
newp=new LNode;
cout <<"请输入第" <<i <<"项的系数和指数:" <<endl;
cout <<"系数:";
cin>>(newp->data).coef;
cout <<"指数:";
cin>>(newp->data).exp;
if(newp->data.exp <0)
{
cout <<"输入有误,指数不允许为负值!" <<endl;
delete newp;
i--;
continue;
}
newp->next=NULL;
p=L;
if(newp->data.coef==0)
{
cout <<"系数为零,请重新输入!" <<endl;
delete newp;
i--;
continue;
}
while((p->next!=NULL)&&((p->next->data).exp data).exp))
{
p=p->next; //p指向指数最小的那一个
}
newp->next=p->next;
p->next=newp;
}
}
/*输出链表*/
void Polynomial::PrintList(Link L)
{
Link p;
if(L==NULL||L->next==NULL)
cout <<"该一元多项式为空!" <<endl;
else
{
p=L->next;
//项的系数大于0的5种情况
if((p->data).coef>0)
{
if((p->data).exp==0)
cout data).coef;
else if((p->data).coef==1&&(p->data).exp==1)
cout <<"x";
else if((p->data).coef==1&&(p->data).exp!=1)
cout data).exp;
else if((p->data).exp==1&&(p->data).coef!=1)
cout data).coef <<"x";
else cout data).coef data).exp;
}
//项的系数小于0的5种情况
if((p->data).coef <0)
{
if((p->data).exp==0)
cout data).coef;
else if(p->data.coef==-1&&p->data.exp==1)
cout <<"-x";
else if(p->data.coef==-1&&p->data.exp!=1)
cout data.exp;
else if(p->data.exp==1)
cout data.coef <<"x";
else cout data).coef data).exp;
}
p=p->next;
while(p!=NULL)
{
if((p->data).coef>0)
{
if((p->data).exp==0)
cout data).coef;
else if((p->data).exp==1&&(p->data).coef!=1)
cout data).coef <<"x";
else if((p->data).exp==1&&(p->data).coef==1)
cout <<"+" <<"x";
else if((p->data).coef==1&&(p->data).exp!=1)
cout data).exp;
else cout data).coef data).exp;
}
if((p->data).coef <0)
{
if((p->data).exp==0)
cout data).coef;
else if(p->data.coef==-1&&p->data.exp==1)
cout <<"-x";
else if(p->data.coef==-1&&p->data.exp!=1)
cout data.exp;
else if(p->data.exp==1)
cout data.coef <<"x";
else cout data).coef data).exp;
}
p=p->next;
}
}
cout <<endl;
}
/*把一个链表的内容复制给另一个链表*/
void Polynomial::CopyLink(Link &pc,Link pa)
{
Link p,q,r;
pc=new LNode;
pc->next=NULL;
r=pc;
p=pa;
while(p->next!=NULL)
{
q=new LNode;
q->data.coef=p->next->data.coef;
q->data.exp=p->next->data.exp;
r->next=q;
q->next=NULL;
r=q;
p=p->next;
}
}
/*将两个一元多项式相加*/
void Polynomial::PolyAdd(Link &pc,Link pa,Link pb)
{
Link p1,p2,p,pd;
CopyLink(p1,pa);
CopyLink(p2,pb);
pc=new LNode;
pc->next=NULL;
p=pc;
p1=p1->next;
p2=p2->next;
while(p1!=NULL&&p2!=NULL)
{
if(p1->data.exp data.exp)
{
p->next=p1;
p=p->next;
p1=p1->next;
}
else if(p1->data.exp>p2->data.exp)
{
p->next=p2;
p=p->next;
p2=p2->next;
}
else
{
p1->data.coef=p1->data.coef+p2->data.coef;
if(p1->data.coef!=0)
{
p->next=p1;
p=p->next;
p1=p1->next;
p2=p2->next;
}
else
{
pd=p1;
p1=p1->next;
p2=p2->next;
delete pd;
}
}
}
if(p1!=NULL)
{
p->next=p1;
}
if(p2!=NULL)
{
p->next=p2;
}
}
/*将两个多项式相减*/
void Polynomial::PolySubstract(Link &pc,Link pa,Link pb)
{
Link p,pt;
CopyLink(pt,pb);
p=pt;
while(p!=NULL)
{
(p->data).coef=(-(p->data).coef);
p=p->next;
}
PolyAdd(pc,pa,pt);
DestroyLink(pt);
}
//清屏函数
void Polynomial::Clear()
{
system("pause");
system("cls");
}
Polynomial::Polynomial()
{
a=0;
}
#include "Polynomial.h"
#include
using namespace std;
void Menu()
{
cout <<"----输入“1”:创建两个一元多项式 ----" <<endl;
cout <<"----输入“2”:将两个一元多项式进行相加 ----" <<endl;
cout <<"----输入“3”:将两个一元多项式进行相减 ----" <<endl;
}
//判断输入的整数是不是为1到2的数字
int CompareIfNum(int i)
{
if(i>0&&i <8)
return 0;
else return 1;
}
int main()
{
Polynomial test;
int n;
Link L,pc=NULL,pa=NULL,pb=NULL,La=NULL,Lb=NULL;//La,Lb分别为创建的两个多项式
int choose;
while(1)
{
Menu(); //调用菜单函数
cin>>choose;
switch(choose)
{
case 1:
cout <<"请输入你要运算的第一个一元多项式的项数:" <<endl;
cin>>n;
if(CompareIfNum(n)==1)
{
cout <<"您的输入有误,请重新输入!" <<endl;
test.Clear();
break;
}
test.CreateLink(La,n);
cout <<"请输入您要运算的第二个一元多项式的项数:" <<endl;
cin>>n;
if(CompareIfNum(n)==1)
{
cout <<"您的输入有误,请重新输入!" <<endl;
test.Clear();
break;
}
test.CreateLink(Lb,n);
test.Clear();
break;
case 3:
if(La==NULL||Lb==NULL)
{
cout <<"您的多项式创建有误,请重新选择!" <<endl;
test.Clear();
break;
}
test.PolySubstract(L,La,Lb);
cout <<"要相减的两个一元多项式分别为:" <<endl;
test.PrintList(La);
test.PrintList(Lb);
cout <<"两个式子相减后的结果为:" <<endl;
test.PrintList(L);
test.Clear();
test.DestroyLink(L);
break;
case 2:
if(La==NULL||Lb==NULL)
{
cout <<"您的多项式创建有误,请重新选择!" <<endl;
test.Clear();
break;
}
test.PolyAdd(L,La,Lb);
cout <<"要相加的两个一元多项式分别为:" <<endl;
test.PrintList(La);
test.PrintList(Lb);
cout <<"两个式子相加后的结果为:" <<endl;
test.PrintList(L);
test.Clear();
test.DestroyLink(L);
break;
}
}
return 0;
}
#ifndef POLYNOMIAL_H
#define POLYNOMIAL_H
struct Node
{
float coef;//结点类型
int exp;
};
typedef Node polynomial;
struct LNode
{
polynomial data;//链表类型
LNode *next;
};
typedef LNode* Link;
class Polynomial {
public:
Polynomial();
void CreateLink(Link &L,int n);
void PrintList(Link L);
void PolyAdd(Link &pc,Link pa,Link pb);
void PolySubstract(Link &pc,Link pa,Link pb);
void CopyLink(Link &pc,Link pa);
void DestroyLink(Link &L);
void Clear();
private:
int a;
};
#endif
#include #define N 1000int ap[N];int ae[N];int bp[N];int be[N];int main() { int i = 0, j = 0; int alen, blen; while (scanf("%d%d", &ap[i], &ae[i]), ap[i] >= 0 && ae[i] >= 0) { i++; } while (scanf("%d%d", &bp[j], &be[j]), bp[j] >= 0 && be[j] >= 0) { j++; } alen = i, blen = j; i = j = 0; while (i be[j]) { printf("%d %d ", ap[i], ae[i]); i++; } else if (ae[i] < be[j]) { printf("%d %d ", bp[j], be[j]); j++; } else { printf("%d %d ", bp[j]+ap[i], be[j]); i++; j++; } } while (i < alen) { printf("%d %d ", ap[i], ae[i]); i++; } while (j < blen) { printf("%d %d ", bp[j], be[j]); j++; } return 0;}大体上代码就是这样了,可能还需要根据题目微调一下N的大小,还有对0系数的处理
#include<stdlib.h>
#include"stdio.h"
typedef struct
{ float coef;//结点类型
int expn;
}polynomial;
typedef struct LNode
{ polynomial data;//链表类型
struct LNode *next;
}LNode,*Link;
void createLink(Link &L,int n);
void printList(Link L);
void addPolyn(Link &pc,Link pa,Link pb);
void substractPolyn(Link &pc,Link pa,Link pb);
void copyLink(Link &pc,Link pa);
void mulPolyn(Link &pc,Link pa,Link pb);
int locateLink(Link pa,Link e);
void destroyLink(Link &L);
int compareNum(int i);
void destroyLink(Link &L)
{
Link p;
p=L->next;
while(p)
{
L->next=p->next;
delete p;
p=L->next;
}
delete L;
L=NULL;
}
void createLink(Link &L,int n)
{
if(L!=NULL){destroyLink(L);}
Link p,newp;
//int k=0;
L=new LNode;
L->next=NULL;
(L->data).expn=-1;//创建头结点
p=L;
/*newp=new LNode;
cout<<"请输入第1项的系数和指数:"<<endl;
cout<<"系数:";
cin>>(newp->data).coef;
cout<<"指数:";
cin>>(newp->data).expn;
p->next=newp;
newp->next=NULL;*/
for(int i=1;i<=n;i++)
{
newp=new LNode;
cout<<"请输入第"<<i<<"项的系数和指数:"<<endl;
cout<<"系数:";
cin>>(newp->data).coef;
cout<<"指数:";
cin>>(newp->data).expn;
if(newp->data.expn<0){cout<<"您输入有误,指数不允许为负值!"<<endl;delete newp;i--;continue;}
newp->next=NULL;
p=L;
if(newp->data.coef==0){cout<<"系数为零,重新输入!"<<endl;delete newp;i--;continue;}
// if(i==1) {p->next=newp;continue; }
while((p->next!=NULL)&&((p->next->data).expn<(newp->data).expn))
{p=p->next;}
if(!locateLink( L, newp))
{
newp->next=p->next;
p->next=newp;
}
else
{
cout<<"输入的该项指数与多项式中已存在的某项相同,请重新创建一个正确的多项式"<<endl;
delete newp;
destroyLink(L);
createLink(L,n);
break;
}
}
}
/*判断指数是否与多项式中已存在的某项相同*/
int locateLink(Link L,Link e)
{
Link p;
p=L->next;
while(p!=NULL&&(e->data.expn!=p->data.expn))
p=p->next;
if(p==NULL)return 0;
else return 1;
}
/*输出链表*/
void printList(Link L)
{
Link p;
if(L==NULL||L->next==NULL) cout<<"该一元多项式为空!"<<endl;
else
{
p=L->next;
if((p->data).coef>0)
{
//if((p->data).coef==1&&(p->data).expn==0)
// cout<<"1";
if((p->data).expn==0)
cout<<(p->data).coef;
else if((p->data).coef==1&&(p->data).expn==1)
cout<<"x";
else if((p->data).coef==1&&(p->data).expn!=1)
cout<<"x^"<<(p->data).expn;
else if((p->data).expn==1&&(p->data).coef!=1)
cout<<(p->data).coef<<"x";
else cout<<(p->data).coef<<"x^"<<(p->data).expn;
}
if((p->data).coef<0)
{
if((p->data).expn==0)
cout<<(p->data).coef;
else if(p->data.coef==-1&&p->data.expn==1)
cout<<"-x";
else if(p->data.coef==-1&&p->data.expn!=1)
cout<<"-x^"<<p->data.expn;
else if(p->data.expn==1)
cout<<p->data.coef<<"x";
else cout<<(p->data).coef<<"x^"<<(p->data).expn;
}
p=p->next;
while(p!=NULL/*&&(p->data).coef!=0*/)
{
if((p->data).coef>0)
{
if((p->data).expn==0)
cout<<"+"<<(p->data).coef;
else if((p->data).expn==1&&(p->data).coef!=1)
cout<<"+"<<(p->data).coef<<"x";
else if((p->data).expn==1&&(p->data).coef==1)
cout<<"+"<<"x";
else /*if((p->data).coef==1&&(p->data).expn==0)
cout<<"+"<<"1";
else*/ if((p->data).coef==1&&(p->data).expn!=1)
cout<<"+"<<"x^"<<(p->data).expn;
else cout<<"+"<<(p->data).coef<<"x^"<<(p->data).expn;
}
if((p->data).coef<0)
{
if((p->data).expn==0)
cout<<(p->data).coef;
else if(p->data.coef==-1&&p->data.expn==1)
cout<<"-x";
else if(p->data.coef==-1&&p->data.expn!=1)
cout<<"-x^"<<p->data.expn;
else if(p->data.expn==1)
cout<<p->data.coef<<"x";
else cout<<(p->data).coef<<"x^"<<(p->data).expn;
}
p=p->next;
}
}
cout<<endl;
}
/*把一个链表的内容复制给另一个链表*/
void copyLink(Link &pc,Link pa)
{
Link p,q,r;
pc=new LNode;
pc->next=NULL;
r=pc;
p=pa;
while(p->next!=NULL)
{q=new LNode;
q->data.coef=p->next->data.coef;
q->data.expn=p->next->data.expn;
r->next=q;
q->next=NULL;
r=q;
p=p->next;
}
}
/*将两个一元多项式相加*/
void addPolyn(Link &pc,Link pa,Link pb)
{
Link p1,p2,p,pd;
copyLink(p1,pa);
copyLink(p2,pb);
pc=new LNode;
pc->next=NULL;
p=pc;
p1=p1->next;
p2=p2->next;
while(p1!=NULL&&p2!=NULL)
{
if(p1->data.expn<p2->data.expn)
{
p->next=p1;
p=p->next;
p1=p1->next;
}
else if(p1->data.expn>p2->data.expn)
{
p->next=p2;
p=p->next;
p2=p2->next;
}
else
{
// newp=new LNode;
p1->data.coef=p1->data.coef+p2->data.coef;
//p1->data.expn=p1->data.expn;
if(p1->data.coef!=0)
{
p->next=p1;
p=p->next;
p1=p1->next;
p2=p2->next;
}
else
{
pd=p1;
p1=p1->next;
p2=p2->next;
delete pd;
}
}
}
if(p1!=NULL)
{
p->next=p1;
}
if(p2!=NULL)
{
p->next=p2;
}
}
/*将两个多项式相减*/
void substractPolyn(Link &pc,Link pa,Link pb)
{
Link p,pt;
copyLink(pt,pb);
p=pt;
while(p!=NULL)
{
(p->data).coef=(-(p->data).coef);
p=p->next;
}
addPolyn(pc,pa,pt);
destroyLink(pt);
}
//清屏函数
void Clear()
{
char a;
cout<<"请按 回车键 继续……"<<endl;
a=getchar();
system("cls");
}
/*将两个一元多项式相乘*/
void mulPolyn(Link &pc,Link pa,Link pb)
{
Link p1,p2,p,pd,newp,t;
pc=new LNode;
pc->next=NULL;
p1=pa->next;
p2=pb->next;
while(p1!=NULL)
{
pd=new LNode;
pd->next=NULL;
p=new LNode;
p->next=NULL;
t=p;
while(p2)
{
newp=new LNode;
newp->next=NULL;
newp->data.coef=p1->data.coef*p2->data.coef;
newp->data.expn=p1->data.expn+p2->data.expn;
t->next=newp;
t=t->next;
p2=p2->next;
}
addPolyn(pd,pc,p);
copyLink(pc,pd);
p1=p1->next;
p2=pb->next;
destroyLink(p);
destroyLink(pd);
}
/*
Link p,q,r,pd,pe;
pc=new LNode;
pc->next=NULL;
pe=new LNode;
pe->next=NULL;
p=pa->next;
q=pb->next;
while(p!=NULL)
{
while(q!=NULL)
{r=new LNode;
r->data.coef=p->data.coef*q->data.coef;
r->data.expn=p->data.expn+q->data.expn;
pe->next=r;
r->next=NULL;
addPolyn(pd,pc,pe);
copyLink(pc,pd);
pe->next=NULL;
q=q->next;
destroyLink(pd);
}
destroyLink(pe);
p=p->next;
q=pb->next;
}*/
}
//菜单函数
void menuPrint()
{
cout<<"\t***********一元多项式的简单运算*************"<<endl;
cout<<"\t\t 1创建要运算的两个一元多项式"<<endl;
cout<<"\t\t 2将两个一元多项式相加"<<endl;
cout<<"\t\t 3将两个一元多项式相减"<<endl;
cout<<"\t\t 4将两个一元多项式相乘"<<endl;
cout<<"\t\t 5显示两个一元多项式"<<endl;
cout<<"\t\t 6销毁所创建的二个多项式"<<endl;
cout<<"\t\t 7退出"<<endl;
cout<<"请输入你要进行的操作(1-7)"<<endl;
}
//判断输入的整数是不是字符
int compareNum(int i)
{
if(i==-32766)
return 0;
else return 1;
}
void main()
{
int n=-32766;
Link L,La=NULL,Lb=NULL;
int choose;
while(1)
{
menuPrint();
cin>>choose;
switch(choose)
{
case 1:
cout<<"请输入你要运算的第一个一元多项式的项数:"<<endl;
cin>>n;
if(compareNum(n)==0){cout<<"您的输入有误,请重新输入……"<<endl;Clear();break;}
createLink(La,n);
cout<<"请输入你要运算的第二个一元多项式的项数:"<<endl;
cin>>n;
if(compareNum(n)==0){cout<<"您的输入有误,请重新输入……"<<endl;Clear();break;}
createLink(Lb,n);
Clear();
break;
case 2:
if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl;Clear();break;}
addPolyn(L,La,Lb);
cout<<"相加的两个一元多项式为:"<<endl;
printList(La);
printList(Lb);
cout<<"相加后的结果为:"<<endl;
printList(L);
Clear();
destroyLink(L);
break;
case 3:
if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl;Clear();break;}
substractPolyn(L,La,Lb);
cout<<"相减的两个一元多项式为:"<<endl;
printList(La);
printList(Lb);
cout<<"相减后的结果为:"<<endl;
printList(L);
Clear();
destroyLink(L);
break;
case 4:
if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl;Clear();break;}
mulPolyn(L,La,Lb);
cout<<"相乘的两个一元多项式为:"<<endl;
printList(La);
printList(Lb);
cout<<"相乘后的结果为:"<<endl;
printList(L);
destroyLink(L);
Clear();
break;
case 5:
if(La==NULL||Lb==NULL){cout<<"您的多项式创建有误,请重新选择……"<<endl;Clear();break;}
cout<<"第一个一元多项式为:"<<endl;
printList(La);
cout<<"第二个一元多项式为:"<<endl;
printList(Lb);
Clear();
break;
case 6:
if(La&&Lb){destroyLink(La);destroyLink(Lb);cout<<"销毁成功!"<<endl;Clear();}
else
{ cout<<"多项式不存在,请重新选择^^^"<<endl;Clear();}
break;
case 7:
exit(0);
default:
cout<<"您的输入有误,请重新选择操作……"<<endl;Clear();
break;
}
}
}
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/zhoubols/archive/2008/04/01/2241936.aspx
数据结构(c++)一元多项式的代数运算视频
相关评论:
咎省洋一元多项式的相加 提示:(1) 一元多项式的表示问题:对于任意一元多项式:Pn(x)= P0+ P1X1+ P2X2+ … + PiXi+ … + PnXn 可以抽象为一个由“系数-指数”对构成的线性表,且线性表中各元素的指数项是递增的:P=( ( P0,0), ( P1,1), ( P2,2), … , ( Pn,n) )(2 ) ...
咎省洋我记得数据结构书上有源代码的啊...还是帮你写了一个,整整一个小时啊,累死我了 include <stdio.h> include <stdlib.h> include <assert.h> typedef struct _List List;struct _List { int c;int e;List* next;};define OPER_PLUS 0 define OPER_MINUS 1 static List* list_oper(List*...
咎省洋数据结构(C语言版)严蔚敏 清华大学出版社 目录 第1章 绪论 1.1 什么是数据结构 1.2 基本概念和术语 1.3 抽象数据类型的表现与实现 1.4 算法和算法分析 第2章 线性表 2.1 线性表的类型定义 2.2 线性表的顺序表示和实现 2.3 线性表的链式表示和实现 2.4 一元多项式的表示及相加 第3章 ...
咎省洋scanf("%d,%d",&c,&e);输入时要有逗号 4,4,3,3,2,2,0,0 还有 你这c c++输入输出流一起用 真是...
咎省洋\/*:---一元稀疏多项式计算(部分)--- 基本功能:(1)输入并建立多项式;(2)多项式输出,以 c1,e1,c2,e2,...输出 其中ci为系数,ei为指数;(3)多项式相加,c=a+b。说明: (1)多项式一指数升序排序,但输入时不检查;(2)以带头指针的单链表存储。---*\/ define OK 1 define FAILE 0 defin...
咎省洋数据结构(C语言版) (1光盘)的目录内容概述如下:第1章 绪论 1.1 数据结构的基础介绍 1.2 基本概念和术语解析 1.3 抽象数据类型的理论与实现方法 1.4 算法与分析 1.4.1 算法的定义与理解 1.4.2 算法设计的关键要素 1.4.3 算法效率评估指标 1.4.4 算法对存储空间的需求...
咎省洋1. 用链表作一元多项式的数据结构,用C语言对链表作说明 2. 生成输入一元多项式的函数 3. 输入一元多项式A(x)和B(x)4. 以一元多项式A(x)为和多项式,将B(x)多项式中系数加入到A(x)中去 实验二 后缀表达式计算 一、实验目的 熟悉栈的使用。掌握如何使用C语言实现栈的说明、创建以及进栈和出栈...
咎省洋2. 应用场景:手机通讯录,一元多项式 3. 需要了解的名词:前驱:指定元素的前面的元素 后继:指定元素的后面的元素 4. 链表分为:单向链表,双向链表,循环链表,静态链表 四,树 1. 树是节点的有限集合 2. 需要了解的名词:孩子:BCD之于A 双亲:A 度:A的度为3,B的度为2,C的度为0,D...
咎省洋\/\/我有个建立的用c++.net写的老窖了 加法自己做嘛 也不难的 \/\/main.cpp include "stdafx.h"include<iostream> include<windows.h> include<stdlib.h> include<ctime> include"data_structure.h"include"tripleTable_class.h"include"tripleTable_function.h"include"crossLink_class.h"include"cross...
咎省洋while(c!=0){ s=(polynode *)malloc(sizeof(polynode));s->coef=c;s->exp=e;r->next=s;r=s;printf("enter coef :");scanf("%d",&c);printf("enter exp :");scanf("%d",&e);} r->next=NULL;return (h);} void Dispolynode(polynode *p)\/\/输出函数,打印出一元多项式 { pr...