您的位置:首页 > 理论基础 > 数据结构算法

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

2015-04-15 21:15 351 查看
/*

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元素为e

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);

//释放P

Status ListEmpty(LinkList L);

//判断L是否是空链表

Status Append(LinkList &L,Link s);

//连接s剩余结点到L

void PrintPolyn(polynomial P);

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

Status ClearList(LinkList &L);

// 清空链表

Status DestroyPolyn(LinkList &L);

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

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;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: