《数据结构》
课 程 设 计 报 告 书
题
系
学
目: 多项式的加 减 乘法
别: 计算机科学与应用系
号:
学生姓名:
指导教师:
完成日期:
12 月 9 日
多项式的运算
1. 需求分析
输入部分,要求用户能从屏幕上格式化输入两个一元多项式。如
多项式 A 为:x^3+2x^2-x;多项式 B 为:-x^3+3x^2-x。
程序通过语句得到这两个字符串,进行解析,分解出系数和指数,
存储在不同的线性表 Pa,Pb 中。
然后,程序基于线性表 Pa、Pb 来实现多项式的加、减、乘运算。
最终,输出部分将得到的运算结果格式化输出,如上述多项式 A
和 B 的和为:5x^2-2x。
2. 概要设计
程序流程可以用以下流程图来刻画:
从屏幕输入多
项式 a 和 b
分析 A、B,并将指数、系数
对存储到线性表 Pa、Pb 中
多项式加法
多项式减法
多项式乘法
将结果显
示出来
图 1.多项式运算的流程图
3. 详细设计
采用 VC++6.0 作为开发工具,用链表来存储多项式的指数、系
数对,为多项式开发一个多项式类,其中有成员函数加、减、乘、除。
3.1 函数和结构体的声明
用 C 中的结构体来描述一个多项式的系数和指数,定义如下:
struct term
{
//项的表示,多项式的项作为 LinkList 的数据元素
float coef; //系数
int expn; //指数
struct term *next;
}
3.2 主要函数简介
A. term* CreatPolyn(term *P,int m)
函数的功能:输入 m 项的系数和指数,建立表示一元多项式的有
序链表 P
函数的参数:整型变量 m,表示多项式的项数
实型变量 coef; 表示多项式的系数
整型变量 expn, 表示多项式的指数
函数返回值:一个多项式
B. void PrintfPoly(term *P)
函数的功能:输出一元多项式
函数的参数:实型变量 coef; 表示多项式的系数
整型变量 expn, 表示多项式的指数
函数返回值:无
term* APolyn(term *Pa, term *Pb)
函数的功能:输出一元多项式
函数的参数:实型变量 coef; 表示多项式的系数
整型变量 expn, 表示多项式的指数
函数返回值:无
4. 调试分析
在设计过程中主要遇到下列问题:
(1)多项式的显示方法:比如是降幂还是升幂排列,哪种排列方式
更符合人们经常的习惯,是人一目了然,可读性强。通过与同
学讨论得出结果,应用降幂排列。
(2)结构体的一些具体用法:结构体的应用不是很熟练,在调试中
经常出错,此问题经过查资料与问老师后得到解决。
5.源代码
#include
#include
#include
typedef struct term
{
//项的表示,多项式的项作为 LinkList 的数据元素
float coef; //系数
int expn; //指数
struct term *next;
}term;
term* CreatPolyn(term *P,int m) { //
// 输入 m 项的系数和指数,建立表示一元多项式的有序链表 P
if(m <= 0) return NULL;
term *h = P = (term*)malloc(sizeof(term)), *q;
P->coef = 0.0;
int i;
printf("依次输入%d 个非零项\n",m);
for (i = 1; i <= m; ++i)
{
// 依次输入 m 个非零项
scanf("%f%d",&P->coef,&P->expn);
if(P->coef)
q = P;
P = P->next = (term*)malloc(sizeof(term));
}
q->next = NULL;
free(P);
return h;
} // CreatPolyn
term* selsort(term *h)
{
term *g, *p, *q;
if(!h) return NULL;
float f;
int i, fini = 1;
for(g = h;g->next&&fini;g = g->next)
{
fini = 0;
for(p = h,q = h->next;q;p = p->next,q = q->next)
if (p->expn < q->expn)
{
f = p->coef;i = p->expn;
p->coef = q->coef;p->expn = q->expn;
q->coef = f;q->expn = i;
fini = 1;
}
}
for(g = h,p = g->next;p;)
if(g->expn==p->expn)
{
g->coef += p->coef;
g->next = p->next;
q = p;
p = p->next;
free(q);
}
else if(g->next)
{
g = g->next;
p = p->next;
}
return h;
}
void PrintfPoly(term *P)
{
term *q = P;
if(!q)
{
putchar('0');
return;
}
if(q->coef!=1)
{
printf("%g",q->coef);
if(q->expn==1) putchar('X');
else if(q->expn) printf("X^%d",q->expn);
}
else if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
q = q->next;
while (q)
{
if(q->coef > 0) putchar('+');
if(q->coef!=1)
{
printf("%g",q->coef);
if(q->expn==1) putchar('X');
else if(q->expn) printf("X^%d",q->expn);
}
else if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
q = q->next;
}
}
Compare(term *a, term *b)
{
if (a->expn < b->expn) return -1;
if (a->expn > b->expn) return 1;
return 0;
}
term* APolyn(term *Pa, term *Pb)
{
// 多项式加法:Pa = Pa+Pb,利用两个多项式的结点构成"和多项式"。
term *h, *qa = Pa, *qb = Pb, *p, *q;
float sum;
h = p = (term*)malloc(sizeof(term));
p->next = NULL;
while (qa && qb)
{ // Pa 和 Pb 均非空
switch (Compare(qa,qb))
{
case -1: // 多项式 PA 中当前结点的指数值小
p->next = qb;
p = qb;
qb = qb->next;
break;
case 0: // 两者的指数值相等
sum = qa->coef + qb->coef;
if (sum != 0.0)
{ // 修改多项式 PA 中当前结点的系数值
p->next = qa;
qa->coef = sum;
p = qa;
qa = qa->next;
}
else
{ // 删除多项式 PA 中当前结点
q = qa;
qa = qa->next;
free(q);
}
q = qb;
qb = qb->next;
free(q);
break;
case 1: // 多项式 PB 中当前结点的指数值小
p->next = qa;
p = qa;
qa = qa->next;
break;
} // switch
} // while
if (Pa) p->next = qa; // 链接 Pa 中剩余结点
if (Pb) p->next = qb; // 链接 Pb 中剩余结点
q = h;
h = h->next;
free(q);
return h;
} // APolyn
term* A(term *Pa, term *Pb)
{
int n;
puts("再输入一一元多项式的项数");
scanf("%d",&n);
Pb = CreatPolyn(Pb,n);
Pb = selsort(Pb);
PrintfPoly(Pa);
if(Pb && Pb->coef>0) printf(" + ");
PrintfPoly(Pb);
Pa = APolyn(Pa,Pb);
printf(" = ");
Pa = selsort(Pa);
PrintfPoly(Pa);
return Pa;
}
term* BPolyn(term *Pa, term *Pb)
{
// 多项式减法:Pa = Pa-Pb,利用两个多项式的结点构成"差多项式"。
term *p = Pb;
while(p)
{
p->coef *= -1;
p = p->next;
}
return APolyn(Pa,Pb);
} // BPolyn
term* B(term *Pa, term *Pb)
{
int n;
puts("再输入一一元多项式的项数");