帮忙设计一个C++程序,关于线性表的

一元多项式的表示问题:对于任意一元多项式:
Pn(x)= P0+ P1*X^1+ P2*X^2+ … + Pi*X^i+ … + Pn*X^n
可以抽象为一个由“系数-指数”对构成的线性表,且线性表中各元素的指数项是递增的:
P=( ( P0,0), ( P1,1), ( P2,2), … , ( Pn,n) )
帮忙设计这样一个程序,设计这样的一个线性表,使其提供输入界面以输入线性表,并以友好界面的方式将线性表输出。谢谢了,好的我还会加分。
就是创建并输入两个那样的线性表,然后将他们分别输出,再做他们的加减法的结果(也是线性表),再分别输出。 前面说错了,不是一个线性表,是两个,而且要求进行加减法计算。

#include<iostream>
using namespace std;
typedef struct NODE{
int num;//系数
int index;//次数
NODE* next;
NODE(int n,int i){num=n,index=i,next=NULL;} //构造函数
}node,*pnode;
class Poly
{
public:
pnode head,tail;
Poly(){//构造函数
head=tail=new node(0,0);
}

void init();
void insert(int,int);
void insert2end(int,int);
Poly add_and_minus(const Poly&,int);
void output();
void destroy();
friend Poly operator+(const Poly&,const Poly&);
friend Poly operator-(const Poly&,const Poly&);
friend ostream& operator<<(ostream&,Poly);
friend istream& operator>>(istream&,Poly&);
};
void Poly::init(){//初始化
cout<<"请输入多项式项数:"<<endl;
int n;cin>>n;
cout<<"请输入多项式的系数和次数比如 45*x^3 请输入45 3:"<<endl;
int num,index;
for(int i=1;i<=n;i++){
cin>>num>>index;
if(num)
insert(num,index);}
cout<<"下面是你输入的一元多项式:"<<endl;
output();
}
void Poly::insert(int num,int index){//顺序插入
pnode newone=new node(num,index);
pnode p=head;
while(p->next){
if(p->next->index>index){
newone->next=p->next;
p->next=newone;break;}
p=p->next;
}
if(!p->next){
p->next=newone;
tail=newone;}
}
void Poly::insert2end(int num,int index){//尾插法
pnode newone=new node(num,index);
tail->next=newone;
tail=newone;
}
void Poly::output(){//输出
pnode p=head->next;
if(!p){cout<<0<<endl;return;}
while(p){
if(p->index){
if(p->num!=1&&p->num!=-1){
if(p!=head->next)
cout<<(p->num>0?p->num:-p->num)<<" * ";
else cout<<p->num<<" * ";
}
cout<<"x";
if(p->index!=1)
cout<<"^"<<p->index;
}
else cout<<p->num;
p=p->next;
if(p)
if(p->num>0)cout<<" + ";
else cout<<" - ";
}
cout<<endl;
}
Poly Poly::add_and_minus(const Poly& a,int st){//相加想减合成一个函数 st为1相加 为-1相减
pnode p=head->next;
pnode pa=a.head->next;
Poly c;int num,index;
while(p&&pa){//归并排序
if(p->index<pa->index)
num=p->num,index=p->index,p=p->next;
else if(p->index>pa->index)
num=st*pa->num,index=pa->index,pa=pa->next;
else
num=p->num+st*pa->num,index=p->index,p=p->next,pa=pa->next;
if(num)c.insert2end(num,index);
}
while(p)
c.insert2end(p->num,p->index),p=p->next;
while(pa)
c.insert2end(st*pa->num,pa->index),pa=pa->next;
return c;
}
void Poly::destroy(){//析构函数
pnode p=head;
while(p->next){
pnode pp=p->next;
p->next=pp->next;
delete pp;
}
delete head;
head=tail=NULL;
}
Poly operator+(Poly& a, Poly& b){//重载加法
return a.add_and_minus(b,1);
}
Poly operator-(Poly& a,Poly& b){//重载减法
return a.add_and_minus(b,-1);
}
ostream& operator<<(ostream& out,Poly a){//重载输出
a.output();
return out;
}
istream& operator>>(istream& in,Poly& a){//重载输入
a.init();
return in;
}
void add(){
Poly a,b;
cin>>a>>b;
cout<<"相加结果:"<<endl;
cout<<a+b<<endl;
}
void mus(){
Poly a,b;
cin>>a>>b;
cout<<"相减结果:"<<endl;
cout<<a-b<<endl;
}

void solve(){
char ch='y';
while(ch=='y'||ch=='Y'){
cout<<"***************************************"<<endl
<<"* 一元多项式加减法 *"<<endl
<<"***************************************"<<endl<<endl
<<"1 加法"<<endl
<<"2 减法"<<endl;
int n;cin>>n;
switch(n){
case 1:add();break;
case 2:mus();break;
default:cout<<"输入错误!"<<endl;break;
}
cout<<"继续?(y/n)"<<endl;
cin>>ch;
}
}

int main()
{
solve();
}
温馨提示:内容为网友见解,仅供参考
第1个回答  2010-06-27
个人建议 你可以去.红客联盟.哪里..哪里专门回答编程问题
第2个回答  2010-06-27
还是没把问题说明白

怎么输入的?

如果只是要达到Pn(x)= P0+ P1*X^1+ P2*X^2+ … + Pi*X^i+ … + Pn*X^n
效果 那是非常简单的

你的目的是想达到什么效果?
第3个回答  2010-06-27
#include <iostream>
#include <map>
using namespace std;
//定义指数系数对
typedef map<int,double> IndexCoefPeer;
//表示多项式的类
class Polynomial
{
private:
IndexCoefPeer coef;
public:
//输出多项式
friend ostream& operator <<(ostream& os,Polynomial& p)
{
int k,ak;
IndexCoefPeer::iterator it;
IndexCoefPeer::iterator it_begin=p.coef.begin();
IndexCoefPeer::iterator it_end=p.coef.end();
os<<"( ";
for(it=it_begin;it!=it_end;++it)
{
k=it->first;
ak=it->second;
if(it!=it_begin)
{
os<<",";
}
os<<"("<<ak<<","<<k<<")";
}
os<<" )";
return os;
}
//给多项式添加项,k为指数,ak为系数
void AddItem(int k,double ak)
{
coef[k]=ak;
}
//多项式加法
friend Polynomial operator +(Polynomial& p1, Polynomial& p2)
{
Polynomial ret(p1);
int k,ak;
IndexCoefPeer::iterator it;
IndexCoefPeer::iterator it_begin=p2.coef.begin();
IndexCoefPeer::iterator it_end=p2.coef.end();
IndexCoefPeer::iterator it_p1;
for(it=it_begin;it!=it_end;it++)
{
k=it->first;
ak=it->second;
it_p1=p1.coef.find(k);
if(it_p1==p1.coef.end())
{
ret.coef[k]=ak;
}
else
{
ak += p1.coef[k];
ret.coef[k] = ak;
}
}
return ret;
}
//多项式减法
friend Polynomial operator -(Polynomial& p1, Polynomial& p2)
{
Polynomial ret(p1);
int k,ak;
IndexCoefPeer::iterator it;
IndexCoefPeer::iterator it_begin=p2.coef.begin();
IndexCoefPeer::iterator it_end=p2.coef.end();
IndexCoefPeer::iterator it_p1;
for(it=it_begin;it!=it_end;it++)
{
k=it->first;
ak=it->second;
it_p1=p1.coef.find(k);
if(it_p1==p1.coef.end())
{
ret.coef[k]= -ak;
}
else
{
ak = p1.coef[k] -ak;
ret.coef[k] = ak;
}
}
return ret;
}
};

void Main()
{
Polynomial p1;
p1.AddItem(0,5);
p1.AddItem(7,7);
p1.AddItem(2,1);
cout<<"P1(x) = "<<p1<<endl;

Polynomial p2;
p2.AddItem(1,1);
p2.AddItem(0,7);
p2.AddItem(2,1);
cout<<"P2(x) = "<<p2<<endl;
Polynomial p3;
p3=p1+p2;
cout<<"P3(x) = P1 + P2 = "<<p3<<endl;
Polynomial p4;
p4=p1-p2;
cout<<"P4(x) = P1 - P2 = "<<p4<<endl;
}

用了标准库的map类型,输出格式为
( ( P0,0), ( P1,1), ( P2,2), … , ( Pn,n) )
至于输入,你自己想吧,反正我已经有一个void AddItem(int k,double ak)方法给你用了。

用c++编写程序,求两线性表的交集,并集,差集。
b;int c,d;cout<<"请输入第一个闭区间的a,b"<<endl;cin>>a>>b;cout<<"请输入第二个闭区间的c,d"<<endl;cin>>c>>d;if(a>b||c>d) {cout<<"输入的区间不合法"<<endl;}else{if(d<a){cout<<"交集为:空集"<<endl;

C++线性表,分不多。进来帮帮忙。
printf("请输入待建立的表长");scanf("%d",&L->length);getchar();printf("请输入%d个元素用空格分开,",L->length);for(i=0;i<L->length;i++){ scanf("%c",&L->data[i]);} getchar();printf("\\n成功建立表!按任意键继续!\\n");} int length_List(SqList L){ return L.l...

用C++建立一个线性表,输入10个数,并按从小到大显示出来
L.listsize=LIST_INIT_SIZE;\/* 初始存储容量*\/ return OK;} Status ListInsert_Sq(SqList &L,int i,ElemType e) \/* 算法2. 4 *\/ { \/* 初始条件:顺序线性表L 已存在,1≤i≤ListLength(L)+1 *\/ \/* 操作结果:在L 中第i 个位置之前插入新的数据元素e,L 的长度加1 *\/ ElemType...

如何建立一个线性表,用c++的基本语法是什么?
用c++建立一个线性表有以下5步:1、准备数据:定义了顺序表的最大长度MAXLEN、顺序表数据元素的类型DATA以及顺序表的数据结构SLType。在数据结构SLType中,Listen为顺序表已存结点的数量,也就是当前顺序表的长度,ListData是一个结构数组,用来存放各个数据结点。我们认为该顺序表是一个班级学生的记录。...

怎样C++实现线性表的建立、插入、删除、倒序?
cout<<" 创建第二个顺序表"<<endl; CreateList(&L2); Sort1List(&L1); \/\/对第一个顺序表进行直接插入排序 PrintList(L1); Sort2List(&L2); \/\/对第二个顺序表进行折半排序 PrintList(L2); MergeList(L1,L2,&L3); PrintList(L3); break; case 'r': cout<<" 创建第一个顺序表"<<endl; Create...

用C语言实现线性表的顺序存储(创建,插入,删除和查找)
ptemp=head->next;\/\/ptemp指向未排好序的第一个结点 head->next=ptemp->next;\/\/ ptemp->next=p1;\/\/ptemp也排好序了,ptemp变成排好序的第一个结点了 p1=ptemp;\/\/再次让p1成为第一个排好序的结点 } return p1;\/\/头结点为第一个结点}void create_menu()\/\/功能:输出功能菜单,提供人-机接口{ char men...

用c++实现线性表在顺序存储上的删除,判空,表置空操作
删除元素:bool deleteElement(index){ if(index>0&&index<Maxsize){ deleted ary[index];return ture;} else return false;} 判空:bool isEmpty(){ if(ary[0] == null)return true;else return false;} 表置空:bool clear() { if(ary[0] == 0)return true;else for(int i = 0;...

我用c++实现一个线性顺序表,用的是void类型,没有返回值,用if后,return...
函数前面加void就是没有返回值的意思,如果加了void,函数中就不必出现return语句。如果函数中有“return;”语句,执行到这里,会跳出函数。注意是“return;”,不是“return()”。加分号就行了,不要加括号。

【100分】数据结构——使用C语言(线性表)
define OVERFLOW 1 define OK 1 using namespace std;\/\/c++的一个指令 typedef struct { int *elem; \/\/存储空间基址 int length; \/\/当前长度 int listsize;\/\/当前分配的存储容量 \/\/ (以sizeof(ElemType)为单位)\/\/int *next;}sqlist;void initList(sqlist &La){\/\/构造一个空线性表L ...

C++单链线性表的初始化问题
L->next=p; \/\/ █ 代表节点 <--- 代表指针 你那个程序指针是这样指的 █ <-- █ <-- █ <--- █for循环一结束就指向最后面的节点了 这样L是往后移动的, 所以输出时倒着输出 L-next存储p上次创建的节点的地址 p是后来创建的节点 所以后面节点总是指向前面的节点 ...

相似回答
大家正在搜