您的位置:首页 > 理论基础 > 数据结构算法

数据结构--线性表--一元多项式加法运算

2014-07-23 09:51 375 查看
刚刚看过线性表,做一个一元多项式加法运算的练习巩固一下相关知识。

教材 严蔚敏《数据结构(c语言版)》。

将一元多项式存储为链式结构的线性表,表中数据元素存储有两个数据项(系数项和指数项)。其中,线性表按照指数升序存储。分别用Pa和Pb表示两个一元多项式。Pa=Pa+Pb,“和多项式”链表中的结点无需另生成,而应该是从两个多项式的链表中摘取。其运算规则如下:假设指针qa和qb分别指向A,两个多项式中当前进行比较的某个结点,则比较两个结点中的指数项,有下列3种情况:1指针qa所指结点的指数值小于指针qb所指结点的指数值,则应摘取qa所指的结点插入到“和多项式”链表中去;2指针qa所指结点的指数值大于指针qb所指结点的指数值,则应摘取qb所指的结点插入到“和多项式”链表中去;3指针qa所指结点的指数值等于指针qb所指结点的指数值,则应将两个结点的系数项相加,若和数不等于零,则修改qa所指结点的系数值,同时释放qb所指的结点,反之,从多项式A的链表中删除相应的结点,并且释放qa,qb所指结点。具体代码如下:

typedef struct {
float coef;
int expn;
}term,ElemType;

typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;

typedef LinkList polynomial;

Status InitList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
if(!L) return ERROR;
L->data.coef=0.0;
L->data.expn=-1;
L->next=NULL;
return OK;
}

LinkList GetHead(LinkList L){
return L;
}

void SetCurElem(LNode* &NodeAdd,ElemType e){
NodeAdd->data.coef=e.coef;
NodeAdd->data.expn=e.expn;
}

Status cmp(ElemType a,ElemType b){
if(a.expn<b.expn)return -1;
if(a.expn==b.expn)return 0;
return 1;
}

Status MakeNode(LNode* & n,ElemType e){
n=(LNode*)malloc(sizeof(LNode));
if(!n) return ERROR;
SetCurElem(n,e);
n->next=NULL;
return OK;
}

void InsFirst(LinkList &InsertAdd,LNode* &n){
n->next=InsertAdd->next;
InsertAdd->next=n;
}

Status DelFirst(LinkList L,LNode* &q){
if(L->next==NULL) return ERROR;
q=L->next;
L->next=L->next->next;
return OK;
}

Status LocateElem(LinkList L,ElemType e,LinkList & q,int (*cmpare)(ElemType ,ElemType)){//the var q is a position
LinkList BefAddCurNode;
BefAddCurNode=L;
while(L->next){
BefAddCurNode=L;
L=L->next;
int result=cmpare(L->data,e);
if(result==0){
q=L;
return true;
}
if(result==1){
q=BefAddCurNode;
return false;
}
BefAddCurNode=L;
}
q=BefAddCurNode;
return false;
}

LinkList NextPos(LinkList List,LinkList ListHead){
while(List){
if(List==ListHead)
return List->next;
List=List->next;
}
return NULL;
}

ElemType GetCurElem(LinkList NodeAdd){
return NodeAdd->data;
}

Status ListEmpty(LinkList list){
if(list->next==NULL)
return true;
return false;
}

Status Append(polynomial & Polyn,LinkList NodeAdd){
if(NodeAdd==NULL)return ERROR;
LinkList head=Polyn;
while(head->next){
head=head->next;
}
head->next=NodeAdd;
return true;
}

void FreeNode(LNode * NodeAdd){
free(NodeAdd);
}

void CreatePolyn(polynomial &P,int m){
InitList(P);
LNode* h=GetHead(P);
ElemType e;
e.coef=0.0; e.expn=-1;
SetCurElem(h,e);
LinkList q;
LNode * s;
for(int i=1;i<=m;++i){
cout<<"please input "<<i<<" coef and expn:";
cin>>e.coef>>e.expn;
if(!LocateElem(P,e,q,(*cmp)) ){//fun pointer no para
if(MakeNode(s,e)) InsFirst(q,s);
}
}
}

void AddPolyn(polynomial &Pa,polynomial &Pb){
LNode * ha,*hb,*qa,*qb;
ha=GetHead(Pa); hb=GetHead(Pb);
qa=NextPos(Pa,ha); qb=NextPos(Pb,hb);
ElemType a,b,sum;
while(qa&&qb){
a=GetCurElem(qa); b=GetCurElem(qb);
switch(cmp(a,b)){
case -1:
ha=qa;
qa=NextPos(Pa,qa);break;
case 0:
sum.coef=a.coef+b.coef;
if(sum.coef!=0.0){
sum.expn=a.expn;
SetCurElem(qa,sum);
ha=qa;
}else{
DelFirst(ha,qa);
FreeNode(qa);
}
DelFirst(hb,qb);
FreeNode(qb);
qb=NextPos(Pb,hb);
qa=NextPos(Pa,ha);
break;
case 1:
DelFirst(hb,qb);
InsFirst(ha,qb);
qb=NextPos(Pb,hb);
ha=NextPos(Pa,ha);
break;
}
}
if(!ListEmpty(Pb)) Append(Pa,qb);
FreeNode(hb);
}

void PrintPolyn(polynomial p){
cout<<"The polynomial is :";
while(p->next){
p=p->next;
cout<<p->data.coef<<"x^"<<p->data.expn;
if(p->next!=NULL) cout<<"+";
}
cout<<endl;
}

int main()
{
//.........test.........
polynomial pa,pb;
CreatePolyn(pa,3);
PrintPolyn(pa);
CreatePolyn(pb,4);
PrintPolyn(pb);
AddPolyn(pa,pb);
cout<<"the result of add pa and pb is:";
PrintPolyn(pa);
//.........test.........
return 1;
}




另要理解指向函数的指针,具体参见《C++Primer》ch7.9 指向函数的指针 p237。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐