课程设计报告
简单计数器
一、问题描述:
设计一元稀疏多项式简单计数器,能够完成多项式相加和相减的运算。
二、基本要求
1 用带表头结点的单链表存储多项式;
2 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2… …cn,en,其中n是多项式的项数,ci,ei分别为第i项的系 数和指数。序列按指数降序排列。
3多项式a和b相加,建立多项式a+b,输出相加的多项式。
4多项式a和b相减,建立多项式a-b,输出相减的多项式。
三、测试数据
1 (2x+5x8-3.1x11)+(7-5x8+11x9)
2 (6x-3-x+4.4x2-1.2x9)-(-6x-3+5.4x2+7.8x15)
四、算法思想
1:AddPolyn(Pa,Pb)函数是实现多项式的加法的主要函数,其算法思想是:把两个多项式结合成和多项式Pa,用p记录和多项式Pa中刚连接上的结点,用qa,qb分别从Pa,Pb的头结点开始记录Pa,Pb的各项,当qa与qb都不空时分别执行:
(1)当qa的指数小于qb的指数时,连接p与qa,p和qa分别下;
(2)当qa的指数等于qb的指数时,求系数和,若系数和为0,释放当前qa,qb,再将qa,qb下移,若系数和不为0,修改qa中的系数域,连接p与qa,p和qa分别下移,释放qb,qb下移;
(3)当qa的指数大于qb的指数时,连接p与qb,p和qb分别下移;
重复执行(1)(2)(3),直到qa或qb为空,最后连接Pa,Pb中剩余 结点,返回头结点。
2:ReducePolyn(Pa,Pb)函数是实现多项式的减法的主要函数,其算法思想是:把两个多项式结合成差多项式Pa,只需将Pb多项式中的各项系数变成相反数,再调用AddPolyn(Pa,Pb)函数即可。
五、模块划分:
1 term *CreatPolyn(term *P,int m), 其功能是输入m项的系数和指数,建立表示一元多项式的有序链表P;
2 term *selsort(term *h) , 其功能是保证链表h指数有序(升序),且相同指数结点只有一个;
3 void PrintfPoly(term *P), 其功能是输出多项式P;
4 int Compare(term *a, term *b) ,比较a,b的大小关系,a与b大小关系是小于,等于,大于分别返回-1,0,1;
5 term *AddPolyn(term *Pa, term *Pb) , 其功能是多项式加法Pa = Pa+Pb,利用两个多项式的结点构成"和多项式",并返回和Pa的头结点。
6 term *AddResult(term *Pa, term *Pb), 其功能是输出Pa各项加Pb各项,并输出加后Pa的结果;
7 term *ReducePolyn(term *Pa, term *Pb) , 其功能是多项式减法:Pa = Pa-Pb,利用两个多项式的结点构成"差多项式",并返回差Pa的头结点。
8 term *ReduceResult(term *Pa, term *Pb) ,其功能是 输出Pa各项加Pb各项,并输出减后Pa的结果;
9 void main() 主函数,对两个多项式进行加法和减法运算
六、数据结构:
数据类型term的定义如下:
typedef struct term { float coef; /*系数*/
int expn; /*指数*/
struct term *next;/*下一个结点*/
}term;
七、源程序:
#include<stdlib.h>
#include<stdio.h>
#include<ctype.h>
typedef struct term /*项的表示,多项式的项作为LinkList的数据元素 */
{ float coef; /*系数*/
int expn; /*指数*/
struct term *next;
}term;
term *CreatPolyn(term *P,int m) /* 输入m项的系数和指数,建立一个表示一
元多项式的有序链表P,并返回头结点 */
{ term *h,*q; float x; int i,y;
P=(term*)malloc(sizeof(term));
h=P;
if (m<=0) return NULL;
printf("\nPut %d not zero items : ",m);
printf("\n");
for (i=1; i<=m; ++i) /* 依次输入m个非零项*/
{ scanf("%f,%d",&x,&y);
P->coef=x;P->expn=y;
if(P->coef)
q = P;
P = (term*)malloc(sizeof(term)); /* P后移并分配新空间 ,q记录P的前结点 */
q->next=P;
}
q->next = NULL;
free(P);
return h;
}
term *selsort(term *h) /*保证链表h指数有序,且无同指数结点,返回头结点*/
{ term *g, *p, *q;
float f;
int i, fini = 1;
if(!h) return NULL;
for(g = h;g->next&&fini;g = g->next) /*将表中指数排序,思路同冒泡排序*/
{
fini = 0;
for(p = h,q = h->next;q;p = p->next,q = q->next) /* p始终指在q的前面 */
if (p->expn > q->expn) /* 如果p大于q的指数就交换*/
{
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; /*只要p下移*/
free(q);
}
else if(g->next)
{
g=g->next; /*p,g都下移*/
p=p->next;
}
return h;
}
void PrintfPoly(term *P) /*输出代表多项式的链表P*/
{ term *q;
q=P;
if(!q) /* 0多项式 */
{
putchar('0');
return;
}
if(q->coef!=1) /* 第一项的系数不为1 */
{
printf("%f",q->coef); /*输出第一项的系数*/
if(q->expn==1) putchar('X');
else if(q->expn) printf("X%d",q->expn);
}
else if(!q->expn) putchar('1'); /* 系数为1,指数为0*/
else if(q->expn==1) putchar('X');
else printf("X%d",q->expn); /*以上是针对第一项,因为第一项系数大于0不需要加号*/
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;
}
}
int Compare(term *a, term *b) /* 比较a,b的大小关系,a与b大小关系是小于,c语言的冒泡排序算法
等于,大于分别返回-1,0,1;*/
{
if (a->expn < b->expn) return -1;
if (a->expn > b->expn) return 1;
return 0;
}
term *AddPolyn(term *Pa, term *Pb) /* 实现多项式加法运算:Pa = Pa+Pb,利用两个多
项式的结点构成"和多项式",并返回和Pa的头结点。*/
{ term *h, *qa = Pa, *qb = Pb, *p, *q;
float sum;
h = p = (term*)malloc(sizeof(term));
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论