资源描述
一元多项式相加完整实验报告
一元多项式相加完整实验报告
编辑整理:
尊敬的读者朋友们:
这里是精品文档编辑中心,本文档内容是由我和我的同事精心编辑整理后发布的,发布之前我们对文中内容进行仔细校对,但是难免会有疏漏的地方,但是任然希望(一元多项式相加完整实验报告)的内容能够给您的工作和学习带来便利。同时也真诚的希望收到您的建议和反馈,这将是我们进步的源泉,前进的动力。
本文可编辑可修改,如果觉得对您有帮助请收藏以便随时查阅,最后祝您生活愉快 业绩进步,以下为一元多项式相加完整实验报告的全部内容。
一元多项式相加
实验报告
一元多项式的相加
一 实验内容
根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题--—---——-—两个多项式相加
二 需求分析
1掌握线性结构的逻辑特性和物理特性.
2建立一元多项式.
3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。
4能够完成两个多项式的加减运算,并输出结果。
三 概要设计
1 本程序所用到的抽象数据类型:
typedef OrderedLinkList polynomial;
// 用带表头结点的有序链表表示多项式
结点的数据元素类型定义为:
typedef struct { // 项的表示
float coef; // 系数
int expn; // 指数
term, ElemType;
Void AddPolyn(polynomail&Pa,polynomail&Pb)
Position GetHead()
Position NextPos(LinkList L,Link p)
Elem GetCurElem(Link p)
int cmp(term a term b)
Status SetCurElem(Link&p, ElemType e)
Status DelFirst(Link h, Link &q)
Status ListEmpty(LinkList L)
Status Append(LinkList&L, Link S)
FreeNode()
2 存储结构
一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项.它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。
序数coef
指数exp
指针域next
创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。
3 模块划分
a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式
4 主程序流程图
四 详细设计
根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。
核心算法PolyAdd是把分别由pa和pb所指的两个多项式相加,结果为pa所指的多项式.运算规则如下:相加时,首先设两个指针变量qa和qb分别从多项式的首项开始扫描(见图2-5—1),比较qa和qb所指结点指数域的值,可能出现下列三种情况之一:
(1)qa—>exp大于qb-〉exp,则qa继续向后扫描。
(2)qa->exp等于qb-〉exp,则将其系数相加。若相加结果不为零,将结果放入qa-〉coef中,并删除qb所指结点,否则同时删除qa和qb所指结点。然后qa、qb继续向后扫描。
(3)qa->exp小于qb—>exp,则将qb所指结点插入qa所指结点之前,然后qa、qb继续向后扫描。
扫描过程一直进行到qa或qb有一个为空为止,然后将有剩余结点的链表接在结果表上。所得pa指向的链表即为两个多项式之和。
五 源程序代码
#include <stdio。h>
#include 〈malloc。h〉
#include <stdlib.h〉
#define NULL 0
typedef struct NODE {
float coef; //系数
int expn; //指数
struct NODE *next;
}NODE;
NODE *Creat(int n);
void print(NODE *head);
NODE *AddPolyn(NODE *head1, NODE *head2);
NODE *Delfirst(NODE *head, NODE *q);
void InsertBefore(NODE *p1, NODE *p2);
int compare(int a, int b);
main()
{
NODE *head1, *head2, *head3;
int n1, n2;
printf("请输入你需要的多项数的数目 n1 : ");
scanf(”%d", &n1);
head1 = Creat(n1);
printf(”第一个多项式的显示 : \n”);
print(head1);
printf(”\n请输入你需要的多项数的数目 n2 : ”);
scanf(”%d”, &n2);
head2 = Creat(n2);
printf("\n第二个多项式的显示 : \n");
print(head2);
head3 = AddPolyn(head1, head2);
printf(”\n合并后的多项式的显示 : \n”);
print(head3);
printf("\n");
}
/*创建链表*/
NODE *Creat(int n)
{
NODE *current, *previous, *head;
int i;
head = (NODE *)malloc(sizeof(NODE)); /*创建头结点*/
previous = head;
for(i = 0; i < n; i++)
{
current = (NODE *)malloc(sizeof(NODE));
printf("请输入系数和指数 : ");
scanf(”%f%d", ¤t—〉coef, ¤t—>expn);
previous—>next = current;
previous = current;
}
previous->next = NULL;
return head;
}
/*一元多项式的想加,总体考虑,可分qa的指数比qb小,或等于pb(如果系数相加等于0和不等于0),或大于pb
里面由InsertBefore和Delfirst两个小模块组成一部分*/
NODE *AddPolyn(NODE *head1, NODE *head2)
{
NODE *ha, *hb, *qa, *qb;
int a, b;
float sum;
ha = head1; /*ha和hb指向头结点*/
hb = head2;
qa = ha-〉next; /*qa和qb指向头结点的下一个结点*/
qb = hb—>next;
while(qa && qb) /*qa和qb均非空*/
{
a = qa—〉expn;
b = qb->expn;
switch(compare(a, b)) {
case -1 : /*qa—〉expn < qb—〉expn*/
ha = qa;
qa = qa—>next;
break;
case 0 :
sum = qa-〉coef + qb—>coef; /*系数的和*/
if(sum != 0.0) { /*如果不是0。0*/
qa->coef = sum; /*改变系数*/
ha = qa;
}else {
free(Delfirst(ha, qa));
}
free(Delfirst(hb, qb));
qa = ha—〉next;
qb = hb->next; /*qb释放后要重新赋值*/
break;
case 1 : /*如果qa—〉 expn 〉 qb -> expn*/
Delfirst(hb, qb);
InsertBefore(ha, qb); /*把qb插入到ha下一个结点之前*/
qb = hb—>next;
ha = ha—>next;
break;
}
}
if(qb)
ha->next = qb; /*插入剩余的pb*/
free(head2);
return head1;
}
/*比较*/
int compare(int a, int b)
{
if(a < b)
return —1;
else if(a > b)
return 1;
else
return 0;
}
/*删除结点q*/
NODE *Delfirst(NODE *p1, NODE *q)
{
p1 —> next = q -> next;
return (q);
}
/*插入结点,引入结点p,可以让p插入到p2和p1之间*/
void InsertBefore(NODE *p1, NODE *p2)
{
NODE *p;
p = p1—>next;
p1-〉next = p2;
p2—〉next = p;
}
/*打印,为了美观程序分开打印*/
void print(NODE *head)
{
NODE *current;
current = head-〉next;
while(current—〉next != NULL)
{
printf("%0。f * x^%d + ", current-〉coef, current->expn);
current = current -> next;
}
printf("%0.f * x^%d", current-〉coef, current—〉expn);
}
六 调试分析
如图第八行,如果直接一次性输完两项的次数和项数,还是会显示“请输入系数和指数”
纠正办法:输入时输完一项的系数和指数,按回车后继续输入.
七 测试结果
输入一个二次三项式X^2+3X^+1,一个三次四项式2X^3+4X^2+X+1
输出如图:
八 心得体会
首先,我的C++学的不是很好,因此做这样一个课程设计感觉有点吃力,还好我不断的看书,翻阅资料,询问同学,上网搜索,总算像模像样地把这个程序编的能运行了。功夫不负有心人。
其次,这次编程是我更多地理解掌握了线性链表的逻辑机构和物理特性。对大一时学过的知识有了很好的巩固.困难还是很多的,比如初次运行的时候,好几十个错误,当时真的感到非常崩溃。幸亏我没有放弃,才最终完成.长舒一口气.
最后,通过这次编程,不仅仅考察了我对知识的掌握,更重要的是锻炼了我的思维能力和耐心,在最困难的时候没有放弃,今天才能如此舒心.
展开阅读全文