数据结构-实验一-一元多项式相加精品

合集下载

数据结构实验一一元多项式相加

数据结构实验一一元多项式相加

数据结构实验报告实验一:一元多项式相加姓名:周成学号:专业:软件工程任课教师:马慧珠2013年12 月01 日1.实验名称:一元多项式相加2.实验目的:如何使用C语言实现链表的说明、创建以及结点的插入和删除等操作。

3.实验要求:对一元多项式能实现输入、输出,以及两个一元多项式相加及结果显示。

4.实验内容:一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。

它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。

根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。

核心算法PolyAdd是把分别由pa和pb所指的两个多项式相加,结果为pa所指的多项式。

运算规则如下:相加时,首先设两个指针变量qa和qb分别从多项式的首项开始扫描,比较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指向的链表即为两个多项式之和。

5.实验程序代码及运行结果:#include""#include<>#include<>#include<>#include<>#define NULL 0typedef struct NODE{float coef;验总结本来我对编程很没有信心,做这样一个课程设计感觉有点吃力,虽然有些人觉得很简单,但是我还是坚持做下来了,我不断的看书,翻阅资料,询问同学,上网搜索,总算有模有样地把这个程序编的能运行了。

一元多项式相加问题的实验报告

一元多项式相加问题的实验报告
struct node
{
ﻩfloatcoef; //系数域
intexp;//指数域
structnode*next;
};
三、功能函数设计
1、输入多项式的系数和指数初始化多项式的功能模块
具体函数为node *in_fun()
此函数的处理较为全面,要求用户按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项,输入一个子项建立一个相关结点,当遇到输入结束标志时停止输入。关键步骤具体如下:
if(q!=NULL)q->next=NULL;
ﻩreturna;
⑷动态分配空间新建结点存储系数和指数的代码如下:
p=new node;
ﻩp->coef=x;
ﻩp->exp=y;
ﻩﻩif(a==NULL)a=p;
ﻩelseq->next=p;
ﻩﻩq=p;
2、多项式显示功能函数
由于系数有正有负,故采取如下处理:
二、数据结构设计
一个一元多项式的每一个子项都由“系数-指数”两部分组成,因此可将其抽象为包含系数coef、指数exp、指针域next构成的链式线性表。将两个多项式分别存放在两个线性表中,然后经过相加后将所得多项式存放在一个新的线性表中,但是不用再开辟新的存储空间,只依靠结点的移动来构成新的线性表,期间可以将某些不需要的空间回收。基于这样的分析,可以采用不带头结点的单链表来表示一个一元多项式。具体数据类型定义为:
ﻩif(p!=NULL)
{
ﻩﻩwhile(p)
{
w=p;
p=p->next;
ﻩﻩﻩr->next=w;
ﻩﻩr=w;
}
ﻩ}
if(q!=NULL)
{
ﻩﻩwhile(q)

一元多项式相加问题实验报告

一元多项式相加问题实验报告

一元多项式相加问题实验报告一元多项式相加问题一、问题描述通过键盘输入两个形如P 0 +P 1 X 1 +P 2 X 2 +…+P n X 的多项式,经过程序运后在屏幕上输出它们的相加和。

二、数据结构设计一个一元多项式的每一个子项都由“系数-指数”两部分组成,因此可将其抽象为包含系数coef、指数exp、指针域next 构成的链式线性表。

将两个多项式分别存放在两个线性表中,然后经过相加后将所得多项式存放在一个新的线性表中,但是不用再开辟新的存储空间,只依靠结点的移动来构成新的线性表,期间可以将某些不需要的空间回收。

基于这样的分析,可以采用不带头结点的单链表来表示一个一元多项式。

具体数据类型定义为:struct node {float coef;//系数域int exp;//指数域struct node *next; }; 三、功能函数设计1、输入多项式的系数和指数初始化多项式的功能模块具体函数为node *in_fun() 此函数的处理较为全面,要求用户按照指数递增的顺序和一定的输入格式输入各个系数不为0 的子项,输入一个子项建立一个相关结点,当遇到输入结束标志时停止输入。

关键步骤具体如下:⑴控制用户按照指数递增的顺序输入r=a; while(r!=q-next){if(y=r-exp){cout“请按照指数递增顺序输入,请重新输入“;cinxy;break;}r=r-next;} 从头开始遍历,若遇到目前输入的指数不是最大时,就跳出循环,让用户重新输入。

⑵当输入的系数为零时,不为其分配存储空间存储while(x==0) { cinxy; continue;} 即若系数为0,不再进行动态分配并新建结点,而是重新提取用户输入的下一个子项的系数和指数,利用continue 进入下一次循环。

⑶初始化完成后将最后一个结点的指针域置为空,并返回该新建链表的首地址。

if(q!=NULL)q-next=NULL;return a; ⑷动态分配空间新建结点存储系数和指数的代码如下:p=new node;p-coef=x;p-exp=y;if(a==NULL) a=p;else q-next=p;q=p; 2、多项式显示功能函数由于系数有正有负,故采取如下处理:对于正数,输出时在前面加“+”,头指针除外;对于负数,直接将系数输出即可,即:p=a;while(p){if(p==a)coutp-coef"*x^"p-else if(p-coef0)coutp-coef"*x^"p-else if(p-coef0)cout"+"p-coef"*x^"p-p=p-next;} 输出的多项式的形式形如:P 1 X^1+P 2 X^2+…+P n X^n 3、多项式相加的功能函数函数为:node *plus_fun(node *a,node *b) 此函数根据在 1 中初始化的两个多项式进行相加运算,并存放在以c 为头指针的一个新链表中。

一元多项式相加问题实验报告

一元多项式相加问题实验报告

一元多项式相加问题一.问题描述设计算法实现一元多项式的简单运算。

二.数据结构设计分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数---指数”两部分组成,所以可以将它抽象成一个由“系数----指数对”构成的线性表。

基于这样的分析,可以采用一个带有头结点的单链表来表示一个一元多项式。

具体数据类型定义为:typedef struct node{float cofe; //系数域int exp; //指数域struct node* next; //指针域指向下一个子项}*polynode,poly;Polynode head_a,head_b,head_c;这三个指针分别作为链表A,B和C的头指针。

三.功能设计1.输入并建立多项式的功能模块此模块要求按照“系数---指数对”的输入格式输入各个子项,输入一个子项,通过遍历链表比较指数的大小,将新结点插在合适的位置,使多项式的指数按递增的顺序存储。

当遇到输入结束标志是停止输入,而转去执行程序下面的部分。

具体函数构造为:polynode creat_polynode(){polynode A ,p,q,s; //建立这种类型的头指针,尾指针,遍历指针和动态指针float a;int b;A=new poly;A->next=NULL;q=A;p=A;cin>>a;cin>>b;while(a!=0||b!=0){s=new poly;s->cofe=a;s->exp=b;while(q->next){if(q->next->exp<b)q=q->next; //遍历链表,若指数大于原链表指数,指针后移一个else{s->next=q->next;q->next=s;break; //若不是,将结点插入指针后面}}if(q->next==NULL){s->next=p->next;p->next=s;p=s; //q遍历到链表尾仍未插入,将结点插入最后,改变尾指针使其指向新结点}q=A; //让q返回头指针处,以便下一次遍历链表cin>>a;cin>>b;}if(p!=NULL)p->next=NULL;return A;}2.多项式相加的功能模块此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新链表中。

数据结构 线性结 一元多项式的加法乘法实现

数据结构 线性结  一元多项式的加法乘法实现
5x20-4x4-5x2+9x-2
求解思路
1.多项式表示 2. 程序框架 3. 读多项式 4. 加法实现 5. 乘法实现 6. 多项式输出
多项式的表示
仅表示非零项
数组: 编程简单、调试容易
需要事先确定数组大小
一种比较好的实现方法是: 动态数组
链表:
动态性强 编程略为复杂、调试比较困难
while (t1 && t2) {
if (t1->expon == t2->expon) {
…..
}
else if (t1->expon > t2->expon) {
……
}
else {
……
}
}
while (t1) {
return 0; }
如何读入多项式
Polynomial ReadPoly() {
…… scanf("%d", &N); …… while ( N-- ) {
scanf("%d %d", &c, &e); Attach(c, e, &Rear); } ….. return P; }
4 3 4 -5 2 6 1 -2 0
两种处理方法: 1. Rear初值为NULL
在Attach函数中根据Rear是 否为NULL做不同处理
Attach
ce
Rear (当前结果表达式尾项指针)
Rear
如何读入多项式
Polynomial ReadPoly() {
…… scanf("%d", &N); …… while ( N-- ) {
多项式的乘积: (a+b)(c+d) = ac+ad+bc+bd

一元多项式相加数据结构实验一-1307班谭淇蔚

一元多项式相加数据结构实验一-1307班谭淇蔚

中南大学《数据结构与算法》课程实验实验报告题目实验一线性表的操作学生姓名谭淇蔚学生学号 3901130721 专业班级软件工程1307班完成日期2014年3月31日星期一实验一线性表的操作(一元多项式相加)1. 需求分析我们使用计算机处理的对象之间通常存在着的是一种最简单的线性关系,这类数学模型可称为线性的数据结构。

而数据存储结构有两种:顺序存储结构和链式存储结构。

线性表是最常用且最简单的一种数据结构。

所以我们做的是实验一-----------线性表的操作。

实验的目的是掌握线性表的基本操作,插入、删除、查找,以及线性表合并等运算在顺序存储结构和链接存储结构上的运算以及熟练运用掌握的线性表的操作,实现一元n次多项式的加法运算。

学习实现一元n次多项式的加法是符号多项式的操作,是表处理的典型用例,需要注意的是:顺序存储结构指的是用数组方法,使用数组方法实现时,在插入和删除的方面,数组不如链表灵活,方法复杂,删除其中一个需要将其后的数组元素改变位置,使其数组保持原有的顺序结构,在查找方面较链表简单,只需要知道其下标就可以知道。

链接存储结构指的是用链表方法,值得注意的是,删除和插入较为灵活,不需要变动大多数元素,但是查找过程相对于数组这种顺序存储结构来说较为复杂,耗时巨大。

我们要学习的是通过对两种方法基本操作的掌握来做到实现一元n次多项式的相加减。

我们程序的任务是:能进行简单的线性表操作(插入、删除、查找)以及线性表合并等运算。

能通过这些基本操作实现一元多项式相加。

明确规定:输入的形式:按照提示(比如:“请您输入第一个结构体数组的项数(不超过50项):”、“请您输入第二个结构体数组的项数(不超过50项):”、“请输入第n项的系数”、“请输入第n项的指数”等等),先输入多项式的项数,之后顺次输入每一项的系数与指数。

输入值的范围:项数没有要求,但不能过于巨大;系数取为float型数据,指数取为int 型数据,输出的形式:按照提示(比如:“您输入的第一个多项式为:”、“您输入的第二个多项式为:”等等),会输出原输入的多项式和经过排序和合并之后的降幂型多项式。

[计算机]一元多项式相加完整实验报告

[计算机]一元多项式相加完整实验报告

[计算机]一元多项式相加完整实验报告一元多项式的相加一实验内容根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加二需求分析1掌握线性结构的逻辑特性和物理特性。

2建立一元多项式。

3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。

4能够完成两个多项式的加减运算,并输出结果。

三概要设计1 本程序所用到的抽象数据类型:typedef OrderedLinkList polynomial;// 用带表头结点的有序链表表示多项式结点的数据元素类型定义为:typedef struct { // 项的表示oat flcoef; // 系数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 主程序流程图开始申请结点空间输入多项式各项的系数X,指数Y输出已输出的多项式否是否输入正确合并同类项结束四详细设计根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。

数据结构:一元多项式的表示与相加

数据结构:一元多项式的表示与相加

实验一一元多项式的表示与相加实验目的:1.复习并熟练掌握数据结构所使用的程序设计语言——C语言;2.学会单步跟踪、调试自己的程序;3.加深对线性表特别是链表知识的理解和掌握,并能够运用相关知识来解决相关的具体问题,如一元多项式相加等;程序流程:1.定义一元多项式链表结构体类型;2.输入多项式项数以分配存储空间;3.输入多项式每项的系数和指数,将其插入当前多项式链表。

同时判断是否有与当前节点指数相同的项,若存在,则将两项系数相加合并。

此外,若存在系数为0的项,将其存储空间释放;4.进行多项数加法时,新建一个存储结果的链表,分别将两多项式各项依次插入结果多项式即完成多项式相加运算;5.进行多项数加法时,将减项多项式各项系数化为相反数后进行加法操作,即完成多项式相减运算;6.对x赋值后,将x值代入多项式进行运算得到多项式的值;7.输出多项式。

注意:进行完一次运算以后,应该及时销毁无用多项式以释放空间以便再次应用。

算法及注释:1)定义一元多项式链表结构体类型typedef struct Lnode{float cof; //定义系数int exp; //定义指数struct Lnode *next; //定义指针变量指向下一个节点}Lnode ,*Linklist; //定义新的变量类型2)建立多项式存储线性链表头结点void makehead(Linklist &head){ head=(Linklist)malloc(sizeof(Lnode)); //建立新的节点head->exp=-1; head->next=NULL; //指针赋空head->cof=1; }3)将输入的多项式信息存储于节点中void makelnode(Lnode *&p){ p=(Lnode*)malloc(sizeof(Lnode)); //建立新的节点printf(Input the cof and exp\n); scanf(%fx%d,&p->cof,&p->exp); //输入多项式底数指数信息p->next=NULL; //指针赋空}4)清除系数为零的多项式节点void clear(Linklist la){ Lnode *p,*q; //定义两个指向结构体的指针p=la; q=p->next; while (q){ if (fabs(q->cof)<=0.000001) { //判断系数为零p->next=q->next; //指针指向相隔的下一个节点free(q); //销毁系数为零的节点q=p->next; //指针后移一位} else { p=p->next; //p q分别后移一位q=q->next;} } }5)找到多项式中与当前节点同指数项位置int locate(Linklist l,Lnode *&p,Lnode*e){ p=l;//标记表头if (!l->next)return(0); while(p&&e->exp!=p->exp){//当p存在且指数不相等时指针后移p=p->next; } if(p) return(p);//当p存在时,返回p地址else {//没找到时寻找出插入位置p=l; while (p->next&&e->exp<=p->next->exp) p=p->next; if (!p->next){ p=p;return(0); } return(0); } }6)将多项式节点插入已有多项式链表中,同时完成系数运算void caseinsert(Linklist &l,Lnode *e){ Lnode *p;if (locate(l,p,e)){//指数相同项系数相加p->cof += e->cof; free(e); } else{//插入新的项e->next=p->next; p->next=e; } }7)创建新的多项式链表void creat(Linklist &head,int m){ Lnode *p;int i; makehead(head);//建立头结点for (i=1;i<=m;i++){ p=(Linklist)malloc(sizeof(Linklist));//建立新的多项式单个节点空间makelnode(p);//建立赋值caseinsert(head,p);//将多项式节点插入已有多项式链表中,同时完成系数运算} clear(head); }8)输入多项式项数并创建节点进行存储void input(Linklist &l){ int m; printf(Input the Poly numbers\n); scanf(%d,&m); creat(l,m);//建立一个l 指向的头指针有m项的多项式链表}9)输出多项式void print(Linklist l){ Lnode *p; p=l->next;printf(Poly:ox^%d,p->cof,p->exp); p=p->next; while (p){ if(p->cof>0) printf(+);//系数正负号if (fabs(p->cof)<=0.000001); break;//不输出系数为零的项printf(ox^%d,p->cof,p->exp); p=p->next;//指针后移} printf(\n); }10)进行多项式加法运算void add(Linklist la,Linklist lb,Linklist &lc) { Lnode *p,*q,*q1,*p1; p=la->next; q=lb->next; makehead(lc);//建立一个新的表头while(p){ p1=p->next; caseinsert(lc,p);//将多项式节点p插入已有多项式链表lc中,同时完成系数运算p=p1;//指针后移} while(q){ q1=q->next; caseinsert(lc,q);//将多项式节点q插入已有多项式链表lc中,同时完成系数运算q=q1; } }11)将减项多项式转化为系数为相反数的多项式便于转化为加法运算void reverse(Linklist &l){ Linklist p; p=l->next; while(p){ p->cof*=-1;//系数自乘-1p=p->next; } }12)进行多项式减法运算void sub(Linklist la,Linklist lb,Linklist &lc){ reverse(lb); add(la,lb,lc);clear(lc);//清除头结点}13)对x赋值进行多项式赋值运算float value(Linklist l,float x){ float sum=0,t; int i; Linklist p=l->next; while(p){t=1;for (i=p->exp;i>0;i--) t*=x; sum=sum+t*p->cof; p=p->next; } return(sum); }14)销毁已有多项式,清除已有多项式占用的存储空间void destroy(Linklist la){ Lnode *p,*q; p=la; while(p){ q=p; p=p->next; free(q); } }15)创建主程序即菜单界面void main(){ Linklist l[10]; int c,n,m,i; float a; printf(Choose the number to operate:\n); printf( 1:Creat a Poly\n); printf( 2:Poly Addition\n); printf( 3:Poly Substraction\n); printf( 4:Evaluation\n); printf( 5:Destroy a Poly\n); printf( 6:Print a Poly\n); printf( 0:Exit\n); printf(\nDestroy the Polys after used.\n); printf(\n*use ',' to separate\n);scanf(%d,&c); while (c){ switch (c){ case 1: printf(Input the Poly number 1~9\n);scanf(%d,&n); input(l[n]);break; case 2: printf( Input the Poly number to add,and the Poly number stored in\n); scanf(%d,%d,%d,&n,&m,&i); add(l[n],l[m],l[i]);break; case 3: printf( Input the Poly number to subtract,and the Poly number stored in\n); scanf(%d,%d,%d,&n,&m,&i);sub(l[n],l[m],l[i]);break; case 4: printf(Input the number to operate and the value of x:\n);scanf(%d,%f,&n,&a); printf(%f\n,value(l[n],a));break; case 5: printf(Input the Poly number:\n); scanf(%d,&n); destroy(l[n]);break; case 6: printf( Input the Poly number:\n); scanf(%d,&n); print(l[n]); case 0: n=0;break; default:printf(ERROR!); } printf(Choose the number to operate:\n); scanf(%d,&c); }printf(OK!\n);程序运行截图:实验总结:这次实验室数据结构第一次上机实验,由于与C语言课程的学习相隔已经一个学期,对C语言有些生疏和遗忘,在编程过程中出现很多错误。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

【关键字】情况、空间、运行、继续、掌握、信心、工程、能力、结构、坚持、巩固、实现、核心、耐心数据结构实验报告实验一:一元多项式相加姓名:周成学号:专业:软件工程任课教师:马慧珠2013年12 月01 日1.实验名称:一元多项式相加2.实验目的:如何使用C语言实现链表的说明、创建以及结点的插入和删除等操作。

3.实验要求:对一元多项式能实现输入、输出,以及两个一元多项式相加及结果显示。

4.实验内容:一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。

它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。

根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对于两个一元多项式中所有指数不相同的项,则分别复抄到“和多项式”中去。

核心算法PolyAdd是把分别由pa和pb所指的两个多项式相加,结果为pa所指的多项式。

运算规则如下:相加时,首先设两个指针变量qa和qb分别从多项式的首项开始扫描,比较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指向的链表即为两个多项式之和。

5.实验程序代码及运行结果:#include"stdafx.h"#include<stdio.h>#include<stdlib.h>#include<malloc.h>#include<stdio.h>#define NULL 0typedef struct NODE{float coef; //系¦Ì数ºyint expn; //指?数ºystruct 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);/*创ä¡ä建¡§链¢¡ä表À¨ª*/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("请?输º?入¨?系¦Ì数ºy和¨ª指?数ºy : ");scanf("%f%d", &current->coef, &current->expn);previous->next = current;previous = current;}previous->next = NULL;return head;}/*一°?元a多¨¤项?式º?的Ì?想?加¨®,ê?总Á¨¹体¬?考?虑?,ê?可¨¦分¤?qa的Ì?指?数ºy比À¨¨qb小?,ê?或¨°等̨¨于®¨²pb(如¨?果?系¦Ì数ºy相¨¤加¨®等̨¨于®¨²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; /*系¦Ì数ºy的Ì?和¨ª*/if(sum != 0.0) { /*如¨?果?不?是º?0.0*/qa->coef = sum; /*改?变À?系¦Ì数ºy*/ha = qa;}else{free(Delfirst(ha, qa));}free(Delfirst(hb, qb));qa = ha->next;qb = hb->next; /*qb释º¨ª放¤?后¨®要°a重?新?赋3值¦Ì*/ 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;elsereturn 0;}/*删¦?除y结¨¢点Ì?q*/NODE *Delfirst(NODE *p1, NODE *q){p1 -> next = q -> next;return (q);}/*插?入¨?结¨¢点Ì?,引°y入¨?结¨¢点Ì?p,可¨¦以°?让¨?p插?入¨?到Ì?p2和¨ªp1之?间?*/ void InsertBefore(NODE *p1, NODE *p2){NODE *p;p = p1->next;p1->next = p2;p2->next = p;}/*打䨰印®?,为a了¢?美¨¤观?程¨¬序¨°分¤?开a打䨰印®?*/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);//system(ê¡§"pause");}int main(){NODE *head1, *head2, *head3;int n1, n2;printf("请?输º?入¨?你?需¨¨要°a的Ì?多¨¤项?式º?的Ì?项?数ºy n1 : ");scanf("%d", &n1);head1 = Creat(n1);printf("第̨²一°?个?多¨¤项?式º?的Ì?显?示º? : \n");print(head1);printf("\n请?输º?入¨?你?需¨¨要°a的Ì?多¨¤项?式º?的Ì?项?数ºy n2 : ");scanf("%d", &n2);head2 = Creat(n2);printf("\n第̨²二t个?多¨¤项?式º?的Ì?显?示º? : \n");print(head2);head3 = AddPolyn(head1, head2);printf("\n合?并¡é后¨®的Ì?多¨¤项?式º?的Ì?显?示º? : \n");print(head3);printf("\n");}运行结果:实验数据1如图:输入一个四次二项式X^3+2X^4,一个五次二项式X^4+2X^5,输出如图:实验数据2如图:输入一个五次四项式X^2+X^3+X^4+X^5,还有一个五次五项式1+X+X^3+2X^4+2X^5输出如图所示实验数据3如图:输入一个七次三项式1+2x^5+3X^7,还有一个五次四项式1+2X^2+3X^4+4X^5,输出如图:6.实验总结本来我对编程很没有信心,做这样一个课程设计感觉有点吃力,虽然有些人觉得很简单,但是我还是坚持做下来了,我不断的看书,翻阅资料,询问同学,上网搜索,总算有模有样地把这个程序编的能运行了。

相关文档
最新文档