一元多项式的基本操作
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
将一元多项式存储为链式结构的线性表,表中数据元素存储有两个数据项(系数项和指数项)。其中,线性表按照指数升序存储。分别用Pa和Pb表示两个一元多项式。Pa=Pa+Pb,“和多项式”链表中的结点无需另生成,而应该是从两个多项式的链表中摘取。其运算规则如下:假设指针qa和qb分别指向A,两个多项式中当前进行比较的某个结点,则比较两个结点中的指数项,有下列3种情况:1指针qa所指结点的指数值小于指针qb所指结点的指数值,则应摘取qa所指的结点插入到“和多项式”链表中去;2指针qa所指结点的指数值大于指针qb所指结点的指数值,则应摘取qb所指的结点插入到“和多项式”链表中去;3指针qa所指结点的指数值等于指针qb所指结点的指数值,则应将两个结点的系数项相加,若和数不等于零,则修改qa所指结点的系数值,同时释放qb所指的结点,反之,从多项式A的链表中删除相应的结点,并且释放qa,qb所指结点。具体代码如下:
typedef struct {
float coef;
int expn;
}term,ElemType;
typedef struct LNode{
ElemType data;
struct LNode *next;
}LNode,*LinkList;
typedef LinkList polynomial;
Status InitList(LinkList &L){
L=(LinkList)malloc(sizeof(LNode));
if(!L) return ERROR;
L->data.coef=0.0;
L->data.expn=-1;
L->next=NULL;
return OK;
}
LinkList Get head(LinkList L){
return L;
}
void SetCurElem(LNode* &NodeAdd,ElemType e){
NodeAdd->data.coef=e.coef;
NodeAdd->data.expn=e.expn;
}
Status cmp(ElemType a,ElemType b){
if(a.expn if(a.expn==b.expn)return 0; return 1; } Status MakeNode(LNode* & n,ElemType e){ n=(LNode*)malloc(sizeof(LNode)); if(!n) return ERROR; SetCurElem(n,e); n->next=NULL; return OK; } void InsFirst(LinkList &InsertAdd,LNode* &n){ n->next=InsertAdd->next; InsertAdd->next=n; } Status DelFirst(LinkList L,LNode* &q){ if(L->next==NULL) return ERROR; q=L->next; L->next=L->next->next; return OK; } Status LocateElem(LinkList L,ElemType e,LinkList & q,int (*cmpare)(ElemType ,ElemType)){//the var q is a position LinkList BefAddCurNode; BefAddCurNode=L; while(L->next){ BefAddCurNode=L; L=L->next; int result=cmpare(L->data,e); if(result==0){ q=L; return true; } if(result==1){ q=BefAddCurNode; return false; } BefAddCurNode=L; } q=BefAddCurNode; return false; } LinkList NextPos(LinkList List,LinkList List head){ while(List){ if(List==ListHead) return List->next; List=List->next; } return NULL; } ElemType GetCurElem(LinkList NodeAdd){ return NodeAdd->data; } Status ListEmpty(LinkList list){ if(list->next==NULL) return true; return false; } Status Append(polynomial & Polyn,LinkList NodeAdd){ if(NodeAdd==NULL)return ERROR; LinkList head=Polyn; while(head->next){ head=head->next; } head->next=NodeAdd; return true; } void FreeNode(LNode * NodeAdd){ free(NodeAdd); }