数据结构 一元多项式的表示及相加

/*

typedef struct

{

    float coef; //系数

    int expn;   //指数

}term,ElemType;

//定义结构体 

typedef LinkList polynomial; 

//用带头结点的有序链表表示多项式

int cmp(term a,term b); 

//a的指数值< = >b的指数值。分别返回-1 0 1 

Status InitList(polynomial &P);

//构造空的线性链表

Position GetHead(polynomial P);

//返回P的头结点 

Status SetCurElem(Position h,term e);

//修改h元素为

Status LocateElem(LinkList P,ElemType e,Position &q,int(*cmp)(ElemType,ElemType));

//返回是否存在该指数项 

Status MakeNode(Link &p,ElemType e);

//申请一个结点 

Status InsFirst(LinkList &P,Link h,Link s);

//插入 

void CreatPolyn(polynomial &P,int m);

//输入m项的指数及系数,建立表示一元多项式的有序链表P

Position NextPos(Link p);

//指向下一结点 

ElemType GetCurElem(Link p);

//返回数值 

Status DelFirst(LinkList &L,Link h,Link &q);

//删除当前结点 

void FreeNode(Link &p);

//释放

Status ListEmpty(LinkList L);

//判断L是否是空链表 

Status Append(LinkList &L,Link s);

//连接s剩余结点到

void PrintPolyn(polynomial P);

//打印输出一元多项式

Status ClearList(LinkList &L);

// 清空链表

Status DestroyPolyn(LinkList &L);

// 销毁线性链表LL不再存在

void AddPolyn(polynomial &Pa,polynomial &Pb);

// 多项式加法:Pa=Pa+Pb,并销毁一元多项式Pb

*/


#include<stdio.h>

#include<stdlib.h>

#define OK 1

#define ERROR -1

#define FALSE 0

#define TRUE 2

 

typedef int Status;

 

typedef struct{

    float coef; //系数

    int expn;   //指数

}term,ElemType; //定义结构体

 

typedef struct LNode{

    ElemType data;

    struct LNode *next;

}*Link,*Position;

 

typedef struct{

    Link head,tail;

    int len;

}LinkList;

 

typedef LinkList polynomial; //用带头结点的有序链表表示多项式

 

int cmp(term a,term b)

{//依a的指数值< = >b的指数值。分别返回-1 0 1

    if(a.expn<b.expn) return -1;

    else if(a.expn==b.expn) return 0;

    else return 1;

}

Status InitList(polynomial &P)

{//构造空的线性链表

    Link p;

    p=(Link)malloc(sizeof(LNode));//生成头结点

    if(p)

      {

           p->next=NULL;

           P.head=P.tail=p;

           P.len=0;

           return OK;

      }

    else return ERROR;

}

 

Position GetHead(polynomial P)

{//返回P的头结点

    return P.head;

}

 

Status SetCurElem(Position h,term e)

{//修改h元素为e

    h->data=e;

    return OK;

}

 

Status LocateElem(LinkList P,ElemType e,Position &q,int(*cmp)(ElemType,ElemType))

{//返回是否存在该指数项

    Link p=P.head,pp;

    while(p&&(cmp(p->data,e)==-1))

    {

        pp=p;

        p=p->next;

    }

    if(!p||(cmp(p->data,e)==1))

    {

        q=pp;

        return FALSE;

    }

    else

    {

        q=p;

        return TRUE;

    }

}

 

Status MakeNode(Link &p,ElemType e)

{//申请一个结点

    p=(Link)malloc(sizeof(LNode));

    if(!p) return ERROR;

    p->data=e;

    return OK;

}

 

Status InsFirst(LinkList &P,Link h,Link s)

{//插入

    s->next=h->next;

    h->next=s;

    if(h==P.tail)

           P.tail=h->next;

    ++P.len;

    return OK;

}

 

void CreatPolyn(polynomial &P,int m)

{//输入m项的指数及系数,建立表示一元多项式的有序链表P

    InitList(P);

    Position h,q,s;

    h=GetHead(P); //h指向P的头结点

    term e;

    e.coef=0.0;

    e.expn=-1;

    SetCurElem(h,e);//设置头结点的数据元素

    printf("有多少个非零项:\n");

    scanf("%d",&m);

    printf("依次输入%d个非零项(系数^指数)\n",m);

    for(int i=1;i<=m;++i)

      {

          scanf("%f^%d",&e.coef,&e.expn);

          if(!LocateElem(P,e,q,cmp))

            {

                if(MakeNode(s,e)) InsFirst(P,q,s);

            }//if不存在,则生成新结点并插入

      }

}

 

Position NextPos(Link p)

{//指向下一结点

    return p->next;

}

 

ElemType GetCurElem(Link p)

{//返回数值

    return p->data;

}

 

Status DelFirst(LinkList &L,Link h,Link &q)

{//删除当前结点

    q=h->next;

    if(q)//非空链表

      {

           h->next=q->next;

           if(!h->next) //删除尾结点

                  L.tail=h;

           L.len--;

           return OK;

      }//if

    else return FALSE; //链表空

}

 

void FreeNode(Link &p)

{//释放P

    free(p);

    p=NULL;

}

 

Status ListEmpty(LinkList L)

{//判断L是否是空链表

    if(L.len)

           return FALSE;

    else return TRUE;

}

 

Status Append(LinkList &L,Link s)

{//判断L是否是空链表

    int i=1;

    L.tail->next=s;

    while(s->next)

      {

          s=s->next;

          i++;

      }//while

    L.tail=s;

    L.len+=i;

    return OK;

}

 

void PrintPolyn(polynomial P)

{//打印输出一元多项式P

    Link q;

    q=P.head->next;

    printf("此一元多项式为:");

    printf("0.0^0");

    while(q)

      {

           printf("+%.6f^%d",q->data.coef,q->data.expn);

           q=q->next;

      }//while

      printf("\n");

}

 

Status ClearList(LinkList &L)

{ // 清空链表

    Link q,p;

    if(L.head!=L.tail)

      {

           p=q=L.head->next;

           L.head->next=NULL;

           while(p!=L.tail)

           {

               p=q->next;

               free(q);

               q=p;

           }//while

           free(q);

           L.tail=L.head;

           L.len=0;

      }//if

    return OK;

}

 

Status DestroyPolyn(LinkList &L)

{ // 销毁线性链表L,L不再存在

   ClearList(L);

   FreeNode(L.head);

   L.tail=NULL;

   L.len=0;

   return OK;

}

 

 void AddPolyn(polynomial &Pa,polynomial &Pb)

 {// 多项式加法:Pa=Pa+Pb,并销毁一元多项式Pb

   Position ha,hb,qa,qb;

   term a,b;

   ha=GetHead(Pa);  hb=GetHead(Pb); // ha和hb分别指向Pa和Pb的头结点

   qa=NextPos(ha);  qb=NextPos(hb); // qa和qb分别指向Pa和Pb中当前结点(现为第一个结点)

   while(qa&&qb)

   { // Pa和Pb均非空且ha没指向尾结点(qa!=0)

     a=GetCurElem(qa);  b=GetCurElem(qb); // a和b为两表中当前比较元素

     switch(cmp(a,b))

     {

       case -1:ha=qa; // 多项式Pa中当前结点的指数值小

               qa=NextPos(ha); // ha和qa均向后移一个结点

               break;

       case 0: qa->data.coef+=qb->data.coef;

              // 两者的指数值相等,修改Pa当前结点的系数值

               if(qa->data.coef!=0.0)

                     ha=qa;

               else

   {

                     DelFirst(Pa,ha,qa);

                     FreeNode(qa);

                   }// 删除多项式Pa中当前结点

               DelFirst(Pb,hb,qb);

               FreeNode(qb);

               qb=NextPos(hb);

               qa=NextPos(ha);

               break;

       case 1: DelFirst(Pb,hb,qb); // 多项式Pb中当前结点的指数值小

               InsFirst(Pa,ha,qb);

               ha=ha->next;

               qb=NextPos(hb);

               break;

     }

   }

   if(!ListEmpty(Pb))

   {

     Pb.tail=hb;

     Append(Pa,qb); // 链接Pb中剩余结点

   }

   DestroyPolyn(Pb); // 销毁Pb

 }

 

int main()

{

    polynomial Pa,Pb;

    int m;

    CreatPolyn(Pa,m);

    PrintPolyn(Pa);

    printf("有%d项\n",Pa.len);

    CreatPolyn(Pb,m);

    PrintPolyn(Pb);

    printf("有%d项\n\n\n",Pb.len);

    AddPolyn(Pa,Pb);

    PrintPolyn(Pa);

    printf("相加所得有%d项\n",Pa.len);

    return 0;

}


你可能感兴趣的:(数据结构 一元多项式的表示及相加)