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

来源:互联网 发布:东莞网络外包 编辑:程序博客网 时间: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