/*
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; }