数据结构--线性表--一元多项式加法运算
来源:互联网 发布:东莞网络外包 编辑:程序博客网 时间:2024/05/17 05:55
刚刚看过线性表,做一个一元多项式加法运算的练习巩固一下相关知识。
教材 严蔚敏《数据结构(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。
0 0
- 数据结构--线性表--一元多项式加法运算
- 数据结构(3)--线性表实现一元多项式加法
- 数据结构 PAT 02-线性结构1 一元多项式的乘法与加法运算
- 02-线性结构1 一元多项式的乘法与加法运算[网易云课堂-数据结构]
- 02-线性结构1 一元多项式的乘法与加法运算 -数据结构
- PAT数据结构_02-线性结构2 一元多项式的乘法与加法运算 (20分)
- [数据结构]02-线性结构2 一元多项式的乘法与加法运算
- 线性结构2 一元多项式的乘法与加法运算
- [数据结构]-- PTA一元多项式的乘法与加法运算
- [数据结构]-- PTA一元多项式的乘法与加法运算
- 【数据结构_链表_List_1040】一元多项式加法运算的实现
- 1467 数据结构:一元多项式加法
- 2-11-一元多项式运算-线性表-第2章-《数据结构》课本源码-严蔚敏吴伟民版
- 一元多项式加法与乘法运算链表实现
- 【数据结构】C++链表实现一元多项式的加法
- 3.数据结构--线性表之一元多项式的加法与乘法运算
- 数据结构一元多项式运算分析
- 一元多项式的加法和乘法运算
- 0080 Oracle 11g服务详细介绍及哪些服务是必须开启的?【基础】
- C - Ultra-QuickSort(7.2.2)(7.2应用排序算法编程的实验范例)
- 输入6个字符串,并对它们按从大到小的顺序排序后输出。
- UBI简介
- Qt 遇到的一些小问题
- 数据结构--线性表--一元多项式加法运算
- 百度离职总结:如何做个好员工?
- 使用java开发工行银企互联中间件(NC方式)以及一些错误总结
- python的logging模块2
- 网站分析 - 吉斯特及其实现途径
- SimpleXMLElement Object ( [code] => 530 [msg] => Remote service error [sub_code] => isv.item-add-se
- 1407230837-hd-查找最大元素.cpp
- pca算法实现人脸识别
- 安卓应用安装错误:INSTALL_FAILED_MEDIA_UNAVAILABLE 解决方法