当前位置:文档之家› 数据结构一元多项式的加减乘

数据结构一元多项式的加减乘

#ifndef _POL YNOMIAL_H#define _POL YNOMIAL_H#include<iostream>using namespace std;#include<assert.h>//#define ElemType chartypedef struct // 项的表示,多项式的项作为LinkList的数据元素{float coef; // 系数int expn; // 指数}term, ElemType;typedef struct LNode // 结点类型{ElemType data;struct LNode *next;}LNode,*Link,*Position;typedef struct LinkList // 链表类型{Link head,tail; // 分别指向线性链表中的头结点和最后一个结点int len; // 指示当前线性链表中数据元素的个数}LinkList;typedef LinkList polynomial;void InitList(LinkList &P);void CreatPolyn(polynomial &P,int m);void DestroyPolyn(polynomial &P);void CreatePolyn(polynomial &P,int m);//建立表示一元多项式的有序链表Pvoid DestroyPolyn(polynomial &P);//销毁一元多项式Pvoid PrintPolyn(polynomial P);//打印int PolyLength(polynomial P);//项数void AddPolyn(polynomial &Pa,polynomial &Pb);//相加运算void SubtractPolyn(polynomial &Pa,polynomial &Pb);//相减运算void MultiplyPolyn(polynomial &P,polynomial &Pa,polynomial &Pb);//相乘运算int cmp(term a,term b);//依a的指数值<(或=)(或>)b的指数值,分别返回-1,0,+1int LocateElemP(LinkList L,ElemType e,Position *q, int(*compare)(ElemType,ElemType)); int MakeNode(Link *p,ElemType e);int InsFirst(LinkList *L,Link h,Link s);#endif#include"Polynomial.h"void InitList(polynomial &P){P.head = P.tail = (LNode *)malloc(sizeof(LNode));assert(P.head != NULL);P.head->next = NULL;P.len = 0;}void CreatePolyn(polynomial &P,int m)//建立表示一元多项式的有序链表P {Position q,s;term e;int i;InitList(P);cout<<"请依次输入"<<m<<"个系数,指数(一递增的方式输入) "<<endl;for (i = 1;i <= m;i++){cin>>e.coef>>e.expn;q = P.tail;s = (LNode *)malloc(sizeof(LNode));assert(s != NULL);s->data.coef = e.coef;s->data.expn = e.expn;P.tail->next = s;s->next = NULL;P.tail = s;P.len++;}}void DestroyPolyn(polynomial &P)//销毁一元多项式P{free(P.head); //再释放头尾结点}void PrintPolyn(polynomial P)//打印{if (P.len == 0){cout<<"多项式不存在!"<<endl;}else{LNode *p = P.head->next;for (int i = 1;i <P.len;i++){cout<<p->data.coef<<"x"<<"^"<<p->data.expn<<"+";p = p->next;}cout<<p->data.coef<<"x"<<"^"<<p->data.expn<<endl;}}int PolyLength(polynomial P)//项数{return P.len;}void AddPolyn(polynomial &Pa,polynomial &Pb)//相加运算{LNode *pa = Pa.head->next;LNode *pb = Pb.head->next;while(pa != NULL && pb != NULL){if(pa->data.expn < pb->data.expn){pa = pa->next;}else if(pa->data.expn == pb->data.expn ){pa->data.coef = pa->data.coef + pb->data.coef;pa=pa->next;pb=pb->next;}else if((pa->data.expn) > (pb->data.expn)){LNode *q = Pa.head;while(q->next!=pa)q=q->next;}q->next = pb;pb = pb->next;Pa.len++;}}if(pa == NULL){LNode *q = Pa.head;while(q->next!=pa){q=q->next;}while (pb != NULL){q->next = pb;q = pb;pb = pb->next;Pa.len++;}Pa.tail = Pb.tail;}}void SubtractPolyn(polynomial &Pa,polynomial &Pb)//相减运算{LNode *pa = Pa.head->next;LNode *pb = Pb.head->next;while(pa !=NULL && pb != NULL){if(pa->data.expn < pb->data.expn){pa = pa->next;}else if(pa->data.expn == pb->data.expn ){pa->data.coef = pa->data.coef - pb->data.coef;pa=pa->next;pb=pb->next;}else if((pa->data.expn) > (pb->data.expn)){LNode *q = Pa.head;while(q->next!=pa){q=q->next;}q->next = pb;pb->data.coef = -pb->data.coef;pb = pb->next;Pa.len++;}}if(pa == NULL){LNode *q = Pa.head;while(q->next!=pa){q=q->next;}while (pb != NULL){q->next = pb;pb->data.coef = -pb->data.coef;q = pb;pb = pb->next;Pa.len++;}Pa.tail = Pb.tail;}}void MultiplyPolyn(polynomial &Pd,polynomial &Pa,polynomial &Pb)//相乘运算{polynomial Pc;InitList(Pd);LNode *pa = Pa.head->next;while(pa != NULL){for (int i= 1; i <= Pa.len; i++){InitList(Pc);LNode *pc = Pc.head;LNode *pb = Pb.head->next;for (int j = 1; j <= Pb.len; j++){LNode *s = (LNode *)malloc(sizeof(LNode));assert(s != NULL);s->data.coef = pa->data.coef * pb->data.coef;s->data.expn = pa->data.expn + pb->data.expn;pc->next = s;s->next = NULL;pc = s;pb = pb->next;Pc.len++;}Pc.tail = pb;AddPolyn(Pd,Pc);free(Pc.head);free(Pc.tail);pa = pa->next;}}}#include "Polynomial.h"void main(){polynomial mypoly;polynomial mypoly1;polynomial mypoly2;InitList(mypoly);InitList(mypoly1);InitList(mypoly2);int m;int select = 1;while (select){cout<<"************************************************"<<endl;cout<<"*1.建立一元多项式 2.销毁一元多项式*"<<endl;cout<<"*3.打印一元多项式 4.一元多项式相加*"<<endl;cout<<"*5.一元多项式相减 6.一元多项式相乘*"<<endl;cout<<"************************************************"<<endl;cout<<"请选择";cin>>select;switch (select){case 1:cout<<"请输入第一个一元多项式的项数:>";cin>>m;CreatePolyn(mypoly,m);break;case 2:DestroyPolyn(mypoly);break;case 3:PrintPolyn(mypoly);break;case 4:cout<<"请输入第一个一元多项式的项数:>";cin>>m;CreatePolyn(mypoly1,m);cout<<"请输入第二个一元多项式的项数:>";cin>>m;CreatePolyn(mypoly2,m);AddPolyn(mypoly1,mypoly2);PrintPolyn(mypoly1);break;case 5:cout<<"请输入第一个一元多项式的项数:>";cin>>m;CreatePolyn(mypoly1,m);cout<<"请输入第二个一元多项式的项数:>";cin>>m;CreatePolyn(mypoly2,m);SubtractPolyn(mypoly1,mypoly2);PrintPolyn(mypoly1);break;case 6:cout<<"请输入第一个一元多项式的项数:>";cin>>m;CreatePolyn(mypoly1,m);cout<<"请输入第二个一元多项式的项数:>";cin>>m;CreatePolyn(mypoly2,m);MultiplyPolyn(mypoly,mypoly1,mypoly2);PrintPolyn(mypoly);break;default:break;}}}。

相关主题