数据结构--线性表--一元多项式加法运算
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所指结点。具体代码如下:
![](http://img.blog.csdn.net/20140723202255875?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvbGl0dGxlYmVhdDEyMw==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
另要理解指向函数的指针,具体参见《C++Primer》ch7.9 指向函数的指针 p237。
教材 严蔚敏《数据结构(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。
相关文章推荐
- 实习一 线性表及其应用 (题目:一元稀疏多项式的加法运算 )
- PAT数据结构_02-线性结构2 一元多项式的乘法与加法运算 (20分)
- 数据结构 PAT 02-线性结构1 一元多项式的乘法与加法运算
- 【数据结构_链表_List_1040】一元多项式加法运算的实现
- 02-线性结构2 一元多项式的乘法与加法运算-中国大学MOOC-陈越、何钦铭-数据结构-2017秋
- 一元多项式的加法和乘法运算(Java实现)——浙大数据结构(陈越)
- 2-11-一元多项式运算-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
- 网易云课堂-陈越、何钦铭-数据结构-2016春,02-线性结构1 一元多项式的乘法与加法运算,学习笔记
- PTA 数据结构 一元多项式的乘法与加法运算 (仅供参考,请勿粘贴)
- 2-11-一元多项式运算-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
- 中国大学MOOC-陈越、何钦铭-数据结构 一元多项式的乘法与加法运算
- [数据结构]02-线性结构2 一元多项式的乘法与加法运算
- 3.数据结构--线性表之一元多项式的加法与乘法运算
- 实验项目3-4:一元多项式的乘法与加法运算
- pta 一元多项式的乘法与加法运算
- 一元多项式的乘法与加法运算
- 一元多项式的乘法与加法运算【Java实现--通过单项链表实现队列】
- 线性结构2 一元多项式的乘法与加法运算
- 02-线性结构1 一元多项式的乘法与加法运算
- 浙江大学PAT上机题解析之3-04. 一元多项式的乘法与加法运算