1.head.h
#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;
typedef struct{ //项的表示,多项式的项作为数据元素
float coef; //系数
int expn; //指数
} term,ElemType; //两个类型名,term用于本ADT,ElemType为LinkList的数据对象名
typedef struct LNode{
ElemType data;
struct LNode *next;
} * Link, *Position;
typedef struct{
Link head, tail;
int len;
} LinkList;
typedef LinkList polynomail;//用带有头结点的有序链表表示多项式
Status MakeNode(Link &p, ElemType e);
void FreeNode(Link &p);
Status InitList(LinkList &L);
Status ClearList(LinkList &L);
Status DestroyList(LinkList &L);
Status InsFirst(LinkList &L,Link h, Link s);
Status DelFirst(LinkList &L,Link h, Link &q);
Status Append(LinkList &L, Link s);
Status Remove(LinkList &L, Link &q);
Status SetCurElem(Link &p, ElemType e);
ElemType GetCurElem(Link p);
Status ListEmpty(LinkList L);
int ListLength(LinkList L);
Position GetHead(LinkList L);
Position PriorPos(LinkList L, Link p);
Position NextPos(LinkList L, Link p);
int compare(ElemType a,ElemType b);
Status LocateElem(LinkList L,ElemType e,Position &q,Status (*compare)(ElemType,ElemType));
void visit(ElemType e);
Status ListTraverse(LinkList L,void(*visit)(ElemType));
//遍历链表中数据并输出
void CreatPolyn(polynomail &P,int m);
//1 输入m项的系数和指数,建立表示一元多项式的有序链表p
void DestoryPolyn(polynomail &P);
//2 销毁一元多项式p
void PrintPolyn(polynomail P);
//3 打印输出一元多项式p中的项数
int PolynLength(polynomail P);
//4 返回一元多项式p中的项数
int cmp(term a,term b);
//5 比较指数值
void AddPolyn(polynomail &Pa,polynomail &Pb);
//6 完成多项式相加运算,并销毁pb
void SubtractPolyn(polynomail &Pa,polynomail &Pb);
//7 完成多项式相减运算,并销毁pb
void OrderInsert(LinkList &L,ElemType e,int (compare)(ElemType,ElemType));
//按照有序判定函数compare的约定,将值为e的结点插入到有序链表L的适当位置上
void MultiplyPolyn(polynomail &Pa,polynomail &Pb);
//8 完成多项式相乘运算,并销毁pb
2.head.cpp
#include "head.h"
Status MakeNode(Link &p, ElemType e)
{
p = (LNode*)malloc(1 * sizeof(LNode));
p->data.coef= e.coef;
p->data.expn= e.expn;
if(p)
return OK;
else
return ERROR;
}
void FreeNode(Link &p)
{
free(p);
p = NULL;
}
Status InitList(LinkList &L)
{
L.head = (LNode*)malloc(1 * sizeof(LNode));
L.head->next = NULL;
L.tail = L.head;
L.len = 0;
if(L.head){
printf("初始化成功");
return OK;
}else
return ERROR;
}
Status ClearList(LinkList &L)
{
Link p = L.head->next;
while(p){
L.head->next = p->next;
free(p);
p = NULL;
L.len--;
p = L.head->next;
}
if(L.head->next==NULL){
return OK;
}else
return ERROR;
}
Status DestroyList(LinkList &L)
{
ClearList(L);
free(L.head);
L.head = NULL;
L.tail = NULL;
if(!L.head)
return OK;
else
return ERROR;
}
Status InsFirst(LinkList &L,Link h, Link s)
{
s->next = h->next;
h->next = s;
if(h==L.tail)
L.tail = h->next;
L.len++;
return OK;
}
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;
}else
return ERROR;
}
Status Append(LinkList &L, Link s)
{
//向链表内插入数据,s以后的一个或若干个节点插入链表的尾部
//并修改链表的tail指针
int i = 1;
L.tail->next = s;
while(s->next){
s = s->next;
i++;
}
L.tail = s;
L.len += i;
return OK;
}
Status Remove(LinkList &L, Link &q)
{
//删除链表尾节点元素,由q返回
if(!L.head){
printf("线性链表不存在");
return ERROR;
}
q = L.head;
while(q->next!=L.tail){
q = q->next;
}
L.tail = q;
q = q->next;
L.tail->next = NULL;
L.len--;
free(q);
q = NULL;
return OK;
}
Status SetCurElem(Link &p, ElemType e)
{
//修改当前指针p指向的元素的数据域的值为e
p->data = e;
return OK;
}
ElemType GetCurElem(Link p)
{
return p->data;
}
Status ListEmpty(LinkList L)
{
if(!L.head){
printf("线性链表不存在");
return ERROR;
}
if(L.head->next==NULL)
return OK;
else
return ERROR;
}
int ListLength(LinkList L)
{
if(!L.head){
printf("线性链表不存在");
return ERROR;
}
return L.len;
}
Position GetHead(LinkList L)
{
if(!L.head){
printf("线性链表不存在");
return ERROR;
}
return L.head;
}
Position PriorPos(LinkList L, Link p)
{
Link q = L.head;
if(!L.head){
printf("线性链表不存在");
return ERROR;
}
if(p==L.head)
return NULL;
while(q->next!=p){
q = q->next;
}
return q;
}
Position NextPos(LinkList L, Link p)
{
if(!L.head){
printf("线性链表不存在");
return ERROR;
}
if(p==L.tail)
return NULL;
return p->next;
}
int compare(ElemType a,ElemType b)
{
if(a.expn>b.expn) return 1;
else if(a.expn<b.expn) return -1;
else {
if(a.coef>b.coef) return 1;
else if(a.coef<b.coef) return -1;
else return 0;
}
}
Status LocateElem(LinkList L,ElemType e,Position &q,Status (*compare)(ElemType,ElemType))
{
Link p = L.head, pp = p;
p = p->next;
while(p && (compare(p->data,e)<0)){
pp = p;
p = p->next;
}
if(!p||compare(p->data,e)>0){
q = pp;
return ERROR;
}
else{
q = p;
return OK;
}
}
void visit(ElemType e)
{
if (e.coef > 0 && e.coef != 1 && e.expn != 0)
{
if (e.expn > 0)
printf("%fx^%d",e.coef,e.expn);
else
printf("%fx^(%d)",e.coef,e.expn);
}
else if (e.coef < 0 && e.expn != 0)
{
if (e.expn > 0)
printf("(%f)x^%d",e.coef,e.expn);
else
printf("(%f)x^(%d)",e.coef,e.expn);
}
else if (e.coef == 1 && e.expn != 0)
{
if (e.expn > 0)
printf("x^%d",e.expn);
else
printf("x^(%d)",e.expn);
}
else if (e.expn == 0 && e.coef != 0)
printf("%f",e.coef);
else
printf("");
}
Status ListTraverse(LinkList L,void(*visit)(ElemType))
{
Link p = L.head->next;
for (int i = 1; i <= L.len;i++)
{
visit(p->data);
if(i!=L.len)
printf("+");
p = p->next;
}
if(L.len == 0)
printf("0");
return OK;
}
void CreatPolyn(polynomail &P,int m)
{
InitList(P);
Link h = GetHead(P);
ElemType e;
Link q, s;
e.coef = 0.0;
e.expn = -1;
SetCurElem(h, e);//设置头结点的数据元素
for (int i = 1; i <= m;i++){
printf("第%d项的系数:",i);
scanf("%f",&e.coef);
printf("第%d项的指数:",i);
scanf("%d",&e.expn);
if(!LocateElem(P,e,q,cmp)){
if(e.coef!=0)
if(MakeNode(s,e))
InsFirst(P, q, s);
}else{
q->data.coef = q->data.coef + e.coef;
if(q->data.coef==0)
Remove(P, q);
}
}
printf("线性链表初始化成功。\n");
}
void DestoryPolyn(polynomail &P)
{
DestroyList(P);
printf("线性链表已经销毁。");
}
void PrintPolyn(polynomail P)
{
ListTraverse(P, visit);
}
int PolynLength(polynomail P)
{
return ListLength(P);
}
int cmp(term a,term b)
{
if (a.expn == b.expn)
return 0;
else if(a.expn> b.expn)
return 1;
else
return -1;
}
void AddPolyn(polynomail &Pa,polynomail &Pb)
{
Link ha, hb, qa=NULL, qb=NULL;
ElemType a, b;
ha = GetHead(Pa); hb = GetHead(Pb);
if (Pa.len != 0 && Pb.len != 0)
{
qa = NextPos(Pa, ha);
qb = NextPos(Pb, hb);
while (qa && qb)
{
a = GetCurElem(qa);
b = GetCurElem(qb);
float sum;
switch (cmp(a, b))
{
case -1:
ha = qa;
qa = NextPos(Pa, ha);
break;
case 0:
sum = a.coef + b.coef;
if (sum != 0){
qa->data.coef = sum;
ha = qa;
}
else{
DelFirst(Pa ,ha, qa);
FreeNode(qa);
}
DelFirst(Pb ,hb, qb);
qb = NextPos(Pb, hb);
qa = NextPos(Pa, ha);
break;
case 1:
DelFirst(Pb ,hb, qb);
InsFirst(Pa ,ha, qb);
qb = NextPos(Pb, hb);
qa = NextPos(Pa, ha);
break;
}
}
if (!ListEmpty(Pb))
Append(Pa, qb);
FreeNode(hb);
}
if (Pa.len == 0){
Pa = Pb;
}
}
void SubtractPolyn(polynomail &Pa,polynomail &Pb)
{
Link p;
p = Pb.head;
while (p->next)
{
p = p->next;
p->data.coef *= -1;
}
AddPolyn(Pa, Pb);
}
void OrderInsert(LinkList &L,ElemType e,int (compare)(ElemType,ElemType))
{
Link q, s;
if(LocateElem(L,e,q,compare)){
q->data.coef += e.coef;
if (!q->data.coef){ //系数为0,删除多项式中当前节点
s = PriorPos(L, q);
if(!s)//q无前驱
s = L.head;
DelFirst(L, s, q);
FreeNode(q);
}
}else{//生成并插入
MakeNode(s, e);
InsFirst(L, q, s);
}
}
void MultiplyPolyn(polynomail &Pa,polynomail &Pb)
{
Link qa = GetHead(Pa);
Link qb = NULL;
polynomail Pc;
ElemType a, b, c;
InitList(Pc);
if (Pa.len != 0 && Pb.len != 0){
qa = qa->next;
while(qa){
a = GetCurElem(qa);
qb = GetHead(Pb);
qb = qb->next;
while(qb){
b = GetCurElem(qb);
c.coef = a.coef * b.coef;
c.expn = a.expn + b.expn;
OrderInsert(Pc, c, cmp);
qb = qb->next;
}
qa = qa->next;
}
DestoryPolyn(Pb);
ClearList(Pa);
Pa.head = Pc.head;
Pa.tail = Pc.tail;
Pa.len = Pc.len;
}
else if(Pb.len==0){
Pa = Pb;
}
}
3.main.cpp
#include "head.h"
int main()
{
polynomail A, B;
printf("请输入第一个多项式的项数为:");
int length;
scanf("%d",&length);
CreatPolyn(A, length);
printf("PA(x)的项数为: ");
int lena= PolynLength(A);
printf("%d",lena);
printf("PA(x) = ");
PrintPolyn(A);
printf("\n");
//DestoryPolyn(A);
printf("请输入第二个多项式的项数为:");
scanf("%d",&length);
CreatPolyn(B, length);
printf("PB(x) = ");
PrintPolyn(B);
printf("\n");
char m;
printf("请输入运算符号:");
getchar();
scanf("%c",&m);
switch (m){
case '+':
AddPolyn(A, B);
printf("PA(x)+PB(x) = ");
ListTraverse(A, visit);
printf("\n");
break;
case '-':
SubtractPolyn(A, B);
printf("PA(x)-PB(x) = ");
ListTraverse(A, visit);
printf("\n");
break;
case '*':
MultiplyPolyn(A, B);
printf("PA(x)*PB(x) = ");
ListTraverse(A, visit);
printf("\n");
break;
default:
printf("请输入正确符号");
}
ElemType a,b;
printf("请输入a的系数和指数:");
scanf("%f %d",&a.coef,&a.expn);
printf("请输入b的系数和指数:");
scanf("%f %d",&b.coef,&b.expn);
printf("%d 如果为1表示a>b,如果为-1表示a<b,如果为0表示a=b。",cmp(a,b));
return 0;
}