//
//polyarray.h
//
#pragma once
#include <malloc.h>
#include <stdio.h>
//
//求两个多项式相加运算,单链表实现
//譬如 4x^2+3x与-4x^2+3x^2 相加结果为3x^2+3x
//2013-9-26 23:09
//
#define MAX 20 //多项式最多项数
typedef struct //存放多项式的数组类型
{
float coef;
int exp;
}PolyArray[MAX];
typedef struct pnode
{
float coef;
int exp;
pnode *next;
}PolyNode;
void CreatListR(PolyNode* &L,PolyArray a,int n); //建立单链表
void DispPloy(PolyNode* L);
void Sort(PolyNode* &L); //按exp域递减排序
void AddPloy(PolyNode *ha,PolyNode* hb,PolyNode *&hc); //两个多项式相加
//
//polyarray.cpp
//
#include "polyarray.h"
void CreatListR( PolyNode* &L,PolyArray a,int n )
{
L = (PolyNode*)malloc(sizeof(PolyNode));
L->next = NULL;
PolyNode* p;
PolyNode* q = L;
for ( int i = 0; i < n; i ++)
{
p = (PolyNode*)malloc(sizeof(PolyNode));
p->coef = a[i].coef;
p->exp = a[i].exp;
p->next = NULL;
q->next = p;
q = p;
}
}
void DispPloy( PolyNode* L )
{
PolyNode* p = L->next;
while ( NULL != p)
{
printf(" %gX^%d ",p->coef,p->exp);
p = p->next;
}
printf("\n");
}
void Sort( PolyNode* &L )
{
PolyNode* p = L;
PolyNode *q,*r;
if ( p->next == NULL)
{
return;
}
r = p->next->next;
p->next->next = NULL;
while ( r != NULL )
{
q = r;
r = r->next;
p = L;
while ( p->next != NULL && p->next->exp > q->exp)
{
p = p->next;;
}
//此时p指向要插入位置的上一个节点
q->next = p->next;
p->next = q;
}
}
void AddPloy( PolyNode *ha,PolyNode* hb,PolyNode *&hc )
{
hc = (PolyNode*)malloc(sizeof(PolyNode));
hc->next = NULL;
PolyNode *pa = ha->next, *pb = hb->next;
PolyNode *pc; //每次要创建的节点
PolyNode *tc = hc; //总是指向hc最后一个节点的指针
while ( pa != NULL && pb != NULL)
{
pc = (PolyNode*)malloc(sizeof(PolyNode));
pc->next = NULL;
if (pa->exp > pb->exp)
{
pc->exp = pa->exp;
pc->coef = pa->coef;
pa = pa->next;
}
else if ( pa->exp < pb->exp)
{
pc->exp = pb->exp;
pc->coef = pb->coef;
pb = pb->next;
}
else
{
if ( pa->coef + pb->coef == 0)
{
pa = pa->next;
pb = pb->next;
free(pc);
continue;
}
pc->exp = pb->exp;
pc->coef = pa->coef + pb->coef;
pa = pa->next;
pb = pb->next;
}
tc->next = pc;
tc = pc;
}
//复制余下的节点
if ( pb == NULL)
{
pb = pa;
}
while( pb != NULL)
{
pc = (PolyNode*)malloc(sizeof(PolyNode));
pc->next = NULL;
pc->coef = pb->coef;
pc->exp = pb->exp;
tc->next = pc;
tc = pc;
pb = pb->next;
}
}
#include "polyarray.h"
int main()
{
PolyNode* ha,*hb,*hc;
PolyArray a = {{1.2,0},{3.2,3},{2.5,1},{-2.5,5}};
PolyArray b = {{-1.2,0},{2.5,1},{3.2,3},{2.5,5},{5.4,10}};
CreatListR(ha,a,4);
DispPloy(ha);
CreatListR(hb,b,5);
DispPloy(hb);
Sort(ha);
Sort(hb);
DispPloy(ha);
DispPloy(hb);
//PolyNode* hc;
AddPloy(ha,hb,hc);
DispPloy(hc);
return 0;
}