//Polynomial.cpp
#include"predefined.h"
#include"Polynomial.h"
#include"ExtenLinkedList.h"
void CreatPolyn(polynomial *P,int m)
//算法2.22:输入m项的系数和指数,建立表示一元多项式的有序链表。
{
Position h;
Link q;
int i;
ElemType e;
InitList_E(P);
h=GetHead_E(*P);
e.coef=0.0;
e.expn=-1;
SetCurElem_E(&h,e);
(*h).next=NULL;
for(i=1;i<=m;i++)
{
printf("▲请输入第%d组元素:",i);
scanf("%f,%d",&(e.coef),&(e.expn));
MakeNode_E(&q,e);
InsFirst_E(P,h,q);
h=(*h).next;
}
}
void DestroyPolyn(polynomial *P)
//销毁一元多项式P
{
DestroyList_E(P);
}
void PrintPolyn(polynomial P)
//打印输出一元多项式P
{
int i;
Link q;
q=(*P.head).next;
for(i=1;i<=P.len;i++)
{
if(i==1)
printf("%g",(*q).data.coef);
else
{
if((*q).data.coef>0)
{
printf("+");
printf("%g",(*q).data.coef);
}
else
{
printf("-");
printf("%g",-(*q).data.coef);
}
}
if((*q).data.expn)
{
printf("X");
if((*q).data.expn!=1)
printf("^%d",(*q).data.expn);
}
q=(*q).next;
}
}
int PolyLength(polynomial P)
//返回一元多项式P中的项数
{
return ListLength_E(P);
}
int cmp(term a,term b)
//依a的指数值<(或=)(或>)b的指数值,分别返回-1、0和+1。
{
if(a.expn
#include"predefined.h"
#include"Polynomial.h"
#include"ExtenLinkedList.h"
void CreatPolyn(polynomial *P,int m);
void DestroyPolyn(polynomial *P);
void PrintPolyn(polynomial P);
int PolyLength(polynomial P);
void AddPolyn(polynomial *Pa,polynomial *Pb);
int cmp(term a,term b);
int main()
{
polynomial Pa,Pb;
int m,n,i;
m=6;
n=5;
printf("Function 1\n★函数CreatPolyn(polynomial *P,int m)测试...\n");
printf("▲请输入一元多项式Pa的元素...\n");
CreatPolyn(&Pa,m);
printf("\n");
printf("▲请输入一元多项式Pb的元素...\n");
CreatPolyn(&Pb,n);
printf("\n");
printf("Function 2\n★函数PrintPolyn(polynomial P)测试...\n");
printf("▲一元多项式Pa=");
PrintPolyn(Pa);
printf("\n");
printf("▲一元多项式Pb=");
PrintPolyn(Pb);
printf("\n\n");
printf("Function 3\n★函数PolyLength(polynomial P)测试...\n");
n=PolyLength(Pa);
printf("▲一元多项式Pa的项数为:%d\n",n);
n=PolyLength(Pb);
printf("▲一元多项式Pb的项数为:%d\n\n",n);
printf("Function 4\n★函数AddPolyn(polynomial *Pa,polynomial *Pb)测试...\n");
printf("▲Pa=Pa+Pb=");
AddPolyn(&Pa,&Pb);
PrintPolyn(Pa);
printf("\n");
printf("Function 5\n★函数DestroyPolyn(polynomial *P)测试...\n");
printf("▲销毁Pa前:");
(Pa.head&&Pa.tail&&Pa.len)?printf("Pa存 在!!!\n"):printf("Pa不存在!!!\n");
DestroyPolyn(&Pa);
printf("▲销毁Pa后:");
(Pa.head&&Pa.tail&&Pa.len)?printf("Pa存 在!!!\n\n"):printf("Pa不存在!!!\n\n");
}
#include"predefined.h"
#include"Polynomial.h"
#include"ExtenLinkedList.h"
Status MakeNode_E(Link *p,ElemType e)//
//分配由p指向的值为e的结点,并返回OK;
//若分配失败,则返回ERROE。
{
(*p)=(Link)malloc(sizeof(LNode));
if(!(*p)) exit(OVERFLOW);
(**p).data=e;
(**p).next=NULL;
return OK;
}
void FreeNode_E(Link *p)//
//释放p所指的结点。
{
free(*p);
*p=NULL;
}
Status InitList_E(LinkList *L)//
//构造一个空的线性链表L。
{
Link p;
p=(Link)malloc(sizeof(LNode));
if(!p) exit(OVERFLOW);
(*p).next=NULL;
(*L).head=(*L).tail=p;
(*L).len=0;
return OK;
}
Status DestroyList_E(LinkList *L)//
//销毁线性链表L,L不再存在。
{
Link p,q;
p=(*L).head;
while(p)
{
q=p;
p=(*p).next;
free(q);
}
(*L).head=(*L).tail=NULL;
(*L).len=0;
return OK;
}
Status InsFirst_E(LinkList *L,Link h,Link s)//
//已知h指向线性链表的头结点,将s所指结点插入在第一个结点之前。
{
(*s).next=(*h).next;
(*h).next=s;
(*L).len++;
if((*L).tail==h) (*L).tail=s;
return OK;
}
Status DelFirst_E(LinkList *L,Link h,Link *q)//
//已知h指向线性链表的头结点,删除链表中的第一个结点并以q返回。
{
if(!((*h).next)) return ERROR;
if(!(*(*h).next).next) (*L).tail=(*L).head;
*q=(*h).next;
(*h).next=(*(*h).next).next;
(*L).len--;
return OK;
}
Status Append_E(LinkList *L,Link s)//
//将指针s所指(彼此以指针相连)的一串结点链接在线性表L的最后一个结点
//之后,并改变链表L的尾指针指向新的尾结点。
{
Link p,q;
int count=0;
p=(*L).tail;
(*p).next=s;
while(s)
{
q=s;
s=(*s).next;
count++;
}
(*L).tail=q;
(*L).len+=count;
return OK;
}
Status SetCurElem_E(Link *p,ElemType e)//
//已知p指向线性链表中的一个结点,用e更新p所指结点中数据元素的值。
{
if(!(*p)) return ERROR;
(**p).data=e;
return OK;
}
ElemType GetCurElem_E(Link p)//
//已知p指向线性链表中的一个结点,返回p所指结点中数据元素的值。
{
return (*p).data;
}
int ListLength_E(LinkList L)//
//返回线性链表L中元素的个数。
{
return L.len;
}
Position GetHead_E(LinkList L)//
//返回线性链表L中头结点的位置。
{
return L.head;
}
Position NextPos_E(LinkList L,Link p)//
//已知p指向线性链表L中的一个结点,返回p所指结点的直接后继的位置,
//若无后继,则返回NULL。
{
return (*p).next;
}
typedef struct
{
float coef;
int expn;
}term,ElemType;
typedef struct LNode//结点类型
{
ElemType data;
struct LNode *next;
}LNode,*Link,*Position;
typedef struct//链表类型
{
Link head,tail;
int len;
}LinkList;
typedef LinkList polynomial;
Status MakeNode_E(Link *p,ElemType e);
void FreeNode_E(Link *p);
Status InitList_E(LinkList *L);
Status DestroyList_E(LinkList *L);
Status InsFirst_E(LinkList *L,Link h,Link s);
Status DelFirst_E(LinkList *L,Link h,Link *q);
Status Append_E(LinkList *L,Link s);
Status SetCurElem_E(Link *p,ElemType e);
ElemType GetCurElem_E(Link p);
int ListLength_E(LinkList L);
Position GetHead_E(LinkList L);
Position NextPos_E(LinkList L,Link p);
#include "stdio.h"
#include "stdlib.h"
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define OVERFLOW -2
typedef int Status;