您的位置:首页 > 其它

多项式ADT的链表实现

2014-04-04 20:23 141 查看
昨天用数组实现了多项式,今天用链表实现了一下。在写代码的过程中,发现以前一直忽略的弱点。在链表的插入过程中要注意开创新的空间,要不修改了以后链表会随着改变。同时申请的空间需要销毁,我这里偷懒没有写了。在看我是歌手,谁是歌王呢。注意函数InsertNode,等下再来详细复习一下
//Using List to achieve Polynomial
#include<iostream>
#include<stdio.h>
using namespace std;
struct Node;
typedef Node *PtrNode;
typedef PtrNode Polynomial;
//struct used to store inform of polynomial
struct Node{
double Coefficient;
double Exponent;
PtrNode Next;
};
//method to initialize
void ZeroPolynomial(Polynomial Poly)
{
Poly->Coefficient=0;
Poly->Exponent=0;
Poly->Next=NULL;
}
//method to find previous
PtrNode FindPrevious(PtrNode PNode,Polynomial Poly)
{
PtrNode TempNode;
TempNode=Poly;
while(TempNode->Next!=PNode)
{
TempNode=TempNode->Next;
}
return TempNode;
}
//method used to insert the node to the right place
void InsertNode(PtrNode InNode,Polynomial Poly)
{
PtrNode TempNode;
PtrNode InsertNodes;
InsertNodes=(PtrNode)malloc(sizeof(struct Node));
ZeroPolynomial(InsertNodes);
InsertNodes->Coefficient=InNode->Coefficient;
InsertNodes->Exponent=InNode->Exponent;
TempNode=Poly->Next;
if(TempNode==NULL)
{
Poly->Next=InsertNodes;
}
while(TempNode!=NULL)
{
if(InNode->Exponent==TempNode->Exponent)
{
TempNode->Coefficient+=InsertNodes->Coefficient;
break;
}
if(InNode->Exponent>TempNode->Exponent)
{
TempNode=FindPrevious(TempNode,Poly);
InsertNodes->Next=TempNode->Next;
TempNode->Next=InsertNodes;
break;
}
if(TempNode->Next==NULL)
{
TempNode->Next=InsertNodes;
break;
}
TempNode=TempNode->Next;
}

}
//method used to sum
Polynomial SumPolynomial(const Polynomial Poly1,const Polynomial Poly2)
{
Polynomial SumPoly;
SumPoly=(Polynomial)malloc(sizeof(struct Node));
ZeroPolynomial(SumPoly);
PtrNode Node1,Node2;
Node1=Poly1->Next;
Node2=Poly2->Next;
while(Node1!=NULL)
{
InsertNode(Node1,SumPoly);
Node1=Node1->Next;
}
while(Node2!=NULL)
{
InsertNode(Node2,SumPoly);
Node2=Node2->Next;
}
return SumPoly;
}
//method used to multi
Polynomial MultiPolynomial(const Polynomial Poly1,const Polynomial Poly2)
{
Polynomial MultiPoly;
MultiPoly=(Polynomial)malloc(sizeof(struct Node));
ZeroPolynomial(MultiPoly);
PtrNode Node1,Node2,TempNode;
Node1=Poly1->Next;
Node2=Poly2->Next;
TempNode=(PtrNode)malloc(sizeof(struct Node));
while(Node1!=NULL)
{
while(Node2!=NULL)
{
TempNode->Coefficient=Node1->Coefficient*Node2->Coefficient;
TempNode->Exponent=Node1->Exponent+Node2->Exponent;
InsertNode(TempNode,MultiPoly);
Node2=Node2->Next;
}
Node2=Poly2->Next;
Node1=Node1->Next;
}
free(TempNode);
return MultiPoly;
}
//print the Polynomial
void PrintPolynomial(Polynomial Poly)
{
PtrNode TempNode;
TempNode=Poly->Next;
while(TempNode!=NULL)
{
if((TempNode->Coefficient>0)&&TempNode!=Poly->Next)
cout<<"+";
cout<<TempNode->Coefficient<<"X^"<<TempNode->Exponent;
TempNode=TempNode->Next;
}
cout<<endl;
}
//The main method to test
int main()
{
Polynomial Poly1,Poly2;
Poly1=(Polynomial)malloc(sizeof(struct Node));
Poly2=(Polynomial)malloc(sizeof(struct Node));
ZeroPolynomial(Poly1);
ZeroPolynomial(Poly2);
PtrNode Nodes;
Nodes=(PtrNode)malloc(sizeof(struct Node));
ZeroPolynomial(Nodes);
char ch;
int count=0;
while((ch=getchar())!='\n')
{
if(ch!=' ')
{
if(count%2==0)
Nodes->Coefficient=ch-48;
else
{
Nodes->Exponent=ch-48;
InsertNode(Nodes,Poly1);
}
}
else
{
count++;
}
}
count=0;
while((ch=getchar())!='\n')
{
if(ch!=' ')
{
if(count%2==0)
Nodes->Coefficient=ch-48;
else
{
Nodes->Exponent=ch-48;
InsertNode(Nodes,Poly2);
}
}
else
{
count++;
}
}
cout<<"The First Polynomial is:";
PrintPolynomial(Poly1);
cout<<"The Second Polynomial is:";
PrintPolynomial(Poly2);
Polynomial SumPoly;
SumPoly=(Polynomial)malloc(sizeof(struct Node));
ZeroPolynomial(SumPoly);
SumPoly=SumPolynomial(Poly1,Poly2);
cout<<"The sum of them is:";
PrintPolynomial(SumPoly);
Polynomial MultiPoly;
MultiPoly=(Polynomial)malloc(sizeof(struct Node));
ZeroPolynomial(MultiPoly);
MultiPoly=MultiPolynomial(Poly1,Poly2);
cout<<"The Multi if them is:";
PrintPolynomial(MultiPoly);
system("pause");
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  多项式ADT 链表