一元多项式相加的实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
《数据结构》实验报告
1、实验名称:实现一元多项式的加法
2、实验日期: 2011-3-7
3、基本要求:
1)编程实现一元多项式的加法;
2)设计一个测试主函数。
4、实验目的:
通过实验使学生掌握链表的最基本和最主要的操作:插入和删除操作。
5、测试数据:
随意输入两个一元多项式的系数和指数:
第一个:系数:4 8 6 7;指数:2 3 4 5
第二个:系数:5 9 3 8;指数:1 3 5 6
两式相加后输出结果。
6、算法思想或算法步骤:
1)用尾插入法创建单链表
(PLoy *create_Ploy_LinkList(void))
2)输出单链表中所有结点的值,得到一元多项式
(void output_Ploy_LinkList(PLoy *L, char ch))
3)进行多项式的相加,采用链式存储表示加法,根据结点类型定义,若指数不同,则进行链表的合并;若指数相同,则进行系数相加;
若和为0,则去掉结点;若和不为0,则修改结点的系数域。(PLoy *add_ploy(PLoy *La, PLoy *Lb))
7、模块划分:
1)头文件stdiob.h。头文件stdiob.h中包括:结点结构体定义、一元多项式的系数和指数的输入、一元多项式的输出以及两式相加输出结果的操作等;
2)实现文件yydxsxj.cpp。包含主函数int main(),其功能是测试所设计的一元多项式加法的正确性。
8、数据结构:
链表中的结点的结构体定义如下:
typedef struct Node
{
float coef; /*系数部分*/
int expn; /*指数部分*/
struct Node *next ;
} PloyNode;
9、源程序:
源程序存放在两个文件中,即头文件stdiob.h和实现文件yydxsxj.cpp。
//头文件stdiob.h
typedef struct Node
{
float coef; /*系数部分*/
int expn; /*指数部分*/
struct Node *next ;
} PloyNode;
PloyNode *create_Ploy_LinkList(void)
{
/* 尾插入法创建单链表,链表的头结点head作为返回值 */ float coef ; int expn ;
PloyNode *head, *p, *q;
head=p=(PloyNode *)malloc(sizeof(PloyNode));
p->next=NULL; /* 创建单链表的表头结点head */
while (1)
{
printf("\n请输入一元多项式的系数(0表示结束): ") ;
scanf("%f",&coef);
if (coef==0) break ;
else
{
printf("\n请输入一元多项式的指数: ") ;
scanf("%d",&expn);
q=(PloyNode *)malloc(sizeof(PloyNode));
q->coef=coef ; /* 指数部分赋值 */
q->expn=expn ; /* 系数部分赋值 */
q->next=p->next; p->next=q; p=q ;
/* 钩链,新创建的结点总是作为最后一个结点 */ }
}
return(head);
}
void output_Ploy_LinkList(PloyNode *L, char ch)
/* 输出以L为头结点的单链表中所有结点的值 */ {
PloyNode *p;
p=L->next; /* 使p指向第一个结点 */
if (p==NULL) printf("\n此多项式为空!!\n\n") ;
else
{
printf("f(x)= \n",ch) ;
while (p!=NULL)
{
if (p->coef>0)
printf("%+g",p->coef) ;
else printf("%g",p->coef) ;
if (p->expn!=0)
{
printf("X^") ;
printf("%d",p->expn);
}
p=p->next;
}
} /* 移动指针p */
printf("\n\n") ;
}
PloyNode *add_Ploy(PloyNode *La, PloyNode *Lb)
{
PloyNode *Lc , *pc , *pa , *pb ,*ptr ; float x ;
Lc=pc=La ; pa=La->next ; pb=Lb->next ;
if(pa==NULL&&pb==NULL)printf("两个式子之和也为空项");
while (pa!=NULL&&pb!=NULL)
{
if (pa->expn< pb->expn)
{
pc->next=pa ; pc=pa ; pa=pa->next ; } else
{
if (pa->expn>pb->expn)
{ pc->next=pb ; pc=pb ; pb=pb->next ; }
else
{
x=pa->coef+pb->coef ;
if (x==0)
{ ptr=pa ; pa=pa->next ;
ptr=pb ; pb=pb->next ;
}
else
{ pc->next=pa ; pa->coef=x ;
pc=pa ; pa=pa->next ;
ptr=pb ; pb=pb->next ;
}
}
}
}
if (pa==NULL) pc->next=pb ;