資料結構 一元多項式的表示及相加
/*
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;
}