您的位置:首页 > 其它

线性表---一元多项式相加

2012-11-04 15:54 302 查看
线性表链式存储实现一元多项式相加。
//Define.h内为基本定义
#include<stdio.h>
#include<Define.h>
#include<stdlib.h>

typedef int ElemType;

typedef struct LNode
{
float coef;						//系数
ElemType expn;						//指数
struct LNode *next;
}LNode, *LinkList;

typedef struct
{
float coef;						//系数
ElemType expn;						//指数
}term;

typedef LinkList polynomail;		//有序链表表示多项式

Status InitPolyn(polynomail *P);					//初始化链表
Status MakeNode(polynomail *P, term e);				//开辟新的节点,用e赋值
void CreatPolyn(polynomail *P, int m);				//建立新的链表,输入m项的系数和指数
void DestroyPolyn(polynomail *P);					//销毁链表
Status PrintPolyn(polynomail P);					//打印输出链表
int PolynLength(polynomail P);						//得到链表的长度
Status SetCurElem(polynomail *P, term e);			//用e给链表P的节点赋值
Status LocateElem(polynomail P, term e, polynomail *q, Status (*compare)(term, term));
int cmp (term a, term b);
Status InsFirst(polynomail *p, polynomail *s);       //插入
Status DelFirst(polynomail *p, polynomail *q);		//删除
void AddPolyn(polynomail *Pa, polynomail *Pb);		//多项式的加法, 并且销毁Pb

Status InitPolyn(polynomail *P)
{
(*P) = (LinkList)malloc(sizeof(LNode));
(*P)->next = NULL;
if ((*P) == NULL)
{
return ERROR;
}
(*P)->coef = 0.0;
(*P)->expn = -1;
printf("初始化成功!\n");
return OK;
}

Status SetCurElem(polynomail *P, term e)
{
if ((*P) == NULL)
{
return ERROR;
}
(*P)->coef = e.coef;
(*P)->expn = e.expn;
return OK;
}
Status cmp(term a, term b)
{
if (a.expn < b.expn)
{
return -1;
}
else if (a.expn == b.expn)
{
return 0;
}
else
{
return 1;
}
}
Status LocateElem(polynomail P, term e, polynomail *q, Status (*compare)(term, term))  //小于
{
polynomail p, prior;
term x;
for (p = P->next, prior = P; p != NULL; p = p->next, prior = prior->next)
{
x.coef = p->coef;
x.expn = p->expn;
if (cmp(x, e) == 0)
{
(*q) = p;
return TRUE;
}
else if (cmp(x, e) == 1)
{
(*q) = prior;
return FALSE;
}
}
(*q) = prior;			//重要
return FALSE;
}

Status MakeNode(polynomail *p, term e)
{
(*p) = (polynomail)malloc(sizeof(LNode));
(*p)->next = NULL;
if ((*p) == NULL)
{
return ERROR;
}
else
{
(*p)->coef = e.coef;
(*p)->expn = e.expn;
return TRUE;
}
}

Status InsFirst(polynomail *p, polynomail *s)
{
(*s)->next = (*p)->next;
(*p)->next = (*s);

return OK;
}

Status DelFirst (polynomail *p, polynomail *q)	//删除
{
(*p)->next = (*q)->next;
(*q)->next = NULL;

return OK;
}

void CreatPolyn(polynomail *P, int m)
{
int i;
polynomail head, q, s;
term e;
head = (*P);
e.coef = 0.0;
e.expn = -1;
SetCurElem(&head, e);
for (i = 1; i <=m; i ++)
{
scanf("%f%d", &e.coef, &e.expn);
if (! LocateElem (*P, e, &q, (* cmp)))
{
if (MakeNode (&s, e))
{
InsFirst(&q, &s);
}
}
else
{
q->coef += e.coef;						//优化
}
}
//	free(s);
}

void AddPolyn(polynomail *Pa, polynomail *Pb)
{
float sum;
term a, b;
polynomail ha, hb, qa, qb;

ha = (*Pa); hb = (*Pb);
qa = ha->next;
qb = hb->next;

while (qa && qb)
{
a.coef = qa->coef;
a.expn = qa->expn;
b.coef = qb->coef;
b.expn = qb->expn;
switch (cmp (a, b))					//参数是term型
{
case -1:
ha = qa;
qa = qa->next;
break;
case 0:
sum = a.coef + b.coef;
if (sum != 0)
{
qa->coef = sum;
ha = qa;
}
else
/*			{
DelFirst (&hb, &qb);
free(qb);

qb = hb ->next;
qa = ha->next;
break;
}*/
{
DelFirst(&ha, &qa);
free(qa);
}
DelFirst(&hb, &qb);
free(qb);
qb = hb->next;
qa = ha->next;
break;
case 1:
DelFirst(&ha, &qb);
InsFirst(&ha, &qb);
qb = hb->next;
ha = ha->next;
break;
}
}
if ((*Pb) != NULL)
{
//		qa->next = qb;
ha->next = qb;
}
free(hb);
}

Status PrintPolyn(polynomail P)						//打印输出链表
{
polynomail p;
p = P->next;
if (p == NULL)
{
printf("F(x) = 0\n");
return 0;
}
printf("F(x) = ");
while(p)
{
//		if (p->next == NULL)
if (p == P->next)
{
if (p->coef < 0 && p->coef == -1)
{
printf("-x^(%d)", p->expn);
}
else if (p->coef < 0 && p->coef != -1)
{
printf("%.1fx^(%d)", p->coef, p->expn);
}
else if (p->coef == 1)
{
printf("x^(%d)", p->expn);
}
else if (p->expn == 1)
{
printf("%.1fx", p->coef);
}
else if (p->expn == 0)
{
printf("%.1f", p->coef);
}
else
{
printf("%.1fx^(%d)", p->coef, p->expn);
}
}
else
{
if (p->coef < 0 && p->coef == -1)
{
printf("-x^(%d)", p->expn);
}
else if (p->coef < 0 && p->coef != -1)
{
printf("%.1fx^(%d)", p->coef, p->expn);
}
else if (p->coef == 1)
{
printf("+x^(%d)", p->expn);
}
else if (p->expn == 1)
{
printf("+%.1fx", p->coef);
}
else if (p ->expn == 0)
{
printf("+%.1f", p->coef);
}
else
{
printf("+%.1fx^(%d)", p->coef, p->expn);
}
}
p = p->next;
}
printf("\n");
return OK;
}

Status main(void)
{
int m;
polynomail Pa, Pb;
InitPolyn(&Pa);
InitPolyn(&Pb);
printf("请输入要输入Pa的项数:");
scanf("%d", &m);
printf("请依次输入Pa中%d组数据:\n", m);
CreatPolyn(&Pa, m);
PrintPolyn(Pa);
printf("请输入要输入Pb的项数:");
scanf("%d", &m);
printf("请依次输入Pb中%d组数据:\n", m);
CreatPolyn(&Pb, m);
PrintPolyn(Pb);
AddPolyn(&Pa, &Pb);
printf("多项式Pa和Pb相加的结果为:\n");
PrintPolyn(Pa);

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: