实验一 完成多项式的相加运算

实验一 完成多项式的相加运算
实验一 完成多项式的相加运算

实验项目列表

序号实验项目名称成绩指导教师

1 线性表及其应用

2 哈夫曼树及哈夫曼编码译码的实现

3 Prim最小生成树

4 实现Fibonacci检索算法

5 快速、堆、基数排序算法的设计

6

7

8

9

10

11

12

实验一:完成多项式的相加运算(验证性、4学时)

一、实验目的和要求

完成多项式的相加、相乘运算。

(1)掌握线性表的插入、删除、查找等基本操作设计与实现

(2)学习利用线性表提供的接口去求解实际问题

(3)熟悉线性表的的存储方法

二、实验内容和原理

1.实验内容

设计一个一元多项式的简单计算程序,其基本功能有:(1)输入并建立多项式;(2)输出多项式;(3)多项式的相加运算。利用单链表实现。

2.实验原理

使用单链表实现一元多项式的存储,并实现两个一元多项式的加法运算。

三、实验环境

硬件:(1)学生用微机(2)多媒体教室或远程教学(3)局域网环境

软件:(1)Windows XP中文操作系统(2)Turbo C 3.0或者VC6.0

四、算法描述及实验步骤

1描述

1、创建两个单链表A、B,分别调用CreatePolyn();

2、输出多项式,分别调用PrintPolyn();

3、多项式相加运算AddPolyn()。

2算法流程图

3代码(注释)

#include

#include

#include

typedef struct Polynomial

{float coef;//系数变量

int exp;//指数变量

struct Polynomial *next;//定义next指针

}*Polyn,Polynomial; //Polyn为结点指针类型

void Insert(Polyn p,Polyn h) //插入新的结点p

{if(p->coef==0) free(p); //系数为0的话释放结点

else

{Polyn q1,q2;

q1=h;q2=h->next;

while(q2&&p->expexp) //查找插入位置

{q1=q2;

q2=q2->next;

}

if(q2&&p->exp==q2->exp) //将指数相同相合并

{q2->coef+=p->coef;

free(p);

if(!q2->coef) //系数为0的话释放结点

5

4 6

inputA-B inputA-B inputA-B end

{q1->next=q2->next;

free(q2);

}

}

else //指数为新时将结点插入

{p->next=q2;

q1->next=p;

}

}

}//Insert

int f(float x)//判断输入是否为整形

{float a;

a=x-(long int)x;

if(a==0&&x==fabs(x))

return 1;

else

return 0;

}

Polyn CreatePolyn(Polyn head,int m) //建立一个头指针为head、项数为m的一元多项式{int i;

Polyn p;

p=head=(Polyn)malloc(sizeof(struct Polynomial));

head->next=NULL;

for(i=0;i

{

p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据

printf("please input NO.%d coef and exp:",i+1);

scanf("%f %d",&p->coef,&p->exp);

while(!f(p->coef)&&!f(p->exp))

{printf("输入有错,请重新输入: ");

scanf("%f %d",&p->coef,&p->exp);

}

Insert(p,head); //调用Insert函数插入结点

}

return head;

}//CreatePolyn

void DestroyPolyn(Polyn p) //销毁多项式p

{Polyn q1,q2;

q1=p->next;

q2=q1->next;

while(q1->next)

{free(q1);

q1=q2;//指针后移

q2=q2->next;

}

}

void PrintPolyn(Polyn P)//输出多项式

{Polyn q=P->next;

int flag=1; //项数计数器

if(!q) //若多项式为空,输出0

{putchar('0');

printf("\n");

return;

}

while (q)

{

if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项

if(q->coef!=1&&q->coef!=-1) //系数非1或-1的普通情况{

printf("%g",q->coef);

if(q->exp==1) putchar('X');

else if(q->exp) printf("X^%d",q->exp);

}

else

{

if(q->coef==1)

{if(!q->exp) putchar('1');

else if(q->exp==1) putchar('X');

else printf("X^%d",q->exp);

}

if(q->coef==-1)

{if(!q->exp) printf("-1");

else if(q->exp==1) printf("-X");

else printf("-X^%d",q->exp);

}

}

q=q->next;

flag++;

}//while

printf("\n");

}//PrintPolyn

int compare(Polyn a,Polyn b)

{if(a&&b)

{if(!b||a->exp>b->exp) return 1;

else if(!a||a->expexp) return -1;

else return 0;

}

else if(!a&&b) return -1;//A多项式已空,但B多项式非空

else return 1;//B多项式已空,但A多项式非空

}//compare

Polyn AddPolyn(Polyn pa,Polyn pb)//求解并建立多项式A+B,返回其头指针{Polyn qa=pa->next;

Polyn qb=pb->next;

Polyn headc,hc,qc;

hc=(Polyn)malloc(sizeof(struct Polynomial)); //建立头结点

hc->next=NULL;

headc=hc;

while(qa||qb)

{qc=(Polyn)malloc(sizeof(struct Polynomial));

switch(compare(qa,qb)) //功能选择

{ case 1:

{

qc->coef=qa->coef;

qc->exp=qa->exp;

qa=qa->next;

break;

}

case 0:

{

qc->coef=qa->coef+qb->coef;

qc->exp=qa->exp;

qa=qa->next;

qb=qb->next;

break;

}

case -1:

{

qc->coef=qb->coef;

qc->exp=qb->exp;

qb=qb->next;

break;

}

}//switch

if(qc->coef!=0)

{qc->next=hc->next;

hc->next=qc;

hc=qc;

}

else free(qc);//当相加系数为0时,释放该结点

}//while

return headc;

}//AddPolyn

Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式A-B,返回其头指针Polyn h=pb;

Polyn p=pb->next;

Polyn pd;

while(p){ //将pb的系数取反

p->coef*=-1;

p=p->next;

}

pd=AddPolyn(pa,h);

for(p=h->next;p;p=p->next) //恢复pb的系数

p->coef*=-1;

return pd;

}//SubtractPolyn

Polyn MultiplyPolyn(Polyn pa,Polyn pb){//求解并建立多项式A*B,返回其头指针Polyn hf,pf;

Polyn qa=pa->next;

Polyn qb=pb->next;

hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点

hf->next=NULL;

for(;qa;qa=qa->next){

for(qb=pb->next;qb;qb=qb->next){

pf=(Polyn)malloc(sizeof(struct Polynomial));

pf->coef=qa->coef*qb->coef;

pf->exp=qa->exp+qb->exp;

Insert(pf,hf);//调用Insert函数以合并指数相同的项

}

}

return hf;

}//MultiplyPolyn

void DevicePolyn(Polyn pa,Polyn pb){//求解并建立多项式A/B,返回其头指针Polyn hf,pf,af,temp1,temp2,q;

Polyn qa=pa->next;

Polyn qb=pb->next;

hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储商

hf->next=NULL;

pf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点,存储余数

pf->next=NULL;

temp1=(Polyn)malloc(sizeof(struct Polynomial));

temp1->next=NULL;

temp2=(Polyn)malloc(sizeof(struct Polynomial));

temp2->next=NULL;

temp1=AddPolyn(temp1,pa);

while(qa!=NULL&&qa->exp>=qb->exp){

temp2->next=(Polyn)malloc(sizeof(struct Polynomial));

temp2->next->coef=(qa->coef)/(qb->coef);

temp2->next->exp=(qa->exp)-(qb->exp);

Insert(temp2->next,hf);

pa=SubtractPolyn(pa,MultiplyPolyn(pb,temp2));

qa=pa->next;

temp2->next=NULL;

}

pf=SubtractPolyn(temp1,MultiplyPolyn(hf,pb));

pb=temp1;

printf("the quotient is :");

PrintPolyn(hf);

printf("the remainder is :");

PrintPolyn(pf);

}//DevicePolyn

int main()

{

int m,n,flag=0;

float x;

Polyn pa=0,pb=0,pc,pd,pe,pf;//定义各式的头指针,pa与pb在使用前付初值NULL printf("please input A number:");

scanf("%d",&m);

pa=CreatePolyn(pa,m);//建立多项式A

printf("please input B number:");

scanf("%d",&n);

pb=CreatePolyn(pb,n);//建立多项式B

//输出菜单

printf("**********************************************\n");

printf("choise:\n\t1.Output A and B\n\t2.CreatePolyn A+B\n");

printf("\t3.CreatePolyn A-B\n\t4.CreatePolyn A*B\n");

printf("\t5.CreatePolyn

A/B\n\t6.Return\n**********************************************\n");

for(;;flag=0)

{printf("choise");

scanf("%d",&flag);

if(flag==1)

{printf("多项式A:");PrintPolyn(pa);

printf("多项式B:");PrintPolyn(pb);continue; }

if(flag==2){

pc=AddPolyn(pa,pb);

printf("多项式A+B:");PrintPolyn(pc);

DestroyPolyn(pc);continue;

}

if(flag==3){

pd=SubtractPolyn(pa,pb);

printf("多项式A-B:");PrintPolyn(pd);

DestroyPolyn(pd);continue;

}

if(flag==4){

pf=MultiplyPolyn(pa,pb);

printf("多项式a*b:");PrintPolyn(pf);

DestroyPolyn(pf);continue;

}

if(flag==5){

DevicePolyn(pa,pb);

continue;

}

if(flag==6) break;

if(flag<1||flag>6) printf("Error!!!\n");continue; }//for

DestroyPolyn(pa);

DestroyPolyn(pb);

return 0;

}

五、调试过程

一次调试

二次调试

六、实验结果

测试数据(1)多项式A:3x^4+11x^3+21x^2

多项式B:2x^5+11x^4+12x^3+7x

实验结果(1)多项式A+B=2x^5+14x^4+23x^3+21x^2+7x

多项式A-B=-2x^5-8^4-x^3+21x^2-7x

多项式A*B=6x^9+55x^8+199x^7+363x^6+273x^5+77x^4+147x^3

多项式A/B=0

实验截图(1)

测试数据(2):多项式A:2x^3+5x^-3

多项式B:9x^2+6x^-2+11x^-3

实验结果(2):多项式A+B=2x^3+9x^2+6x^-2+16x^-3

多项式A-B=2x^3-9x^2-6x^(-2)=16x^(-3)

多项式A*B=18x^5+12x+22+45x^(-1)+30x^(-5)+55x^(-6)

多项式A/B=0.222222x

实验截图(2):

测试数据(3)多项式A:-x^7+3x^5

多项式B:x^7-4x6%+7x^3

实验结果(3)多项式A+B=-x^5+7x^3

多项式A-B=-2x^7+7x^5-7x^3

多项式A*B=-x^14+7x^12-19x^10+21x^8

多项式A/B=-1

实验截图(3):

七、总结

1.在熟悉VC6.0环境的同时,对单链表的存储格式有了深刻的理解;

2.复习C++语法的同时,对刚学的线性表进行综合性理解和表达,与之前所学融合。附录:

[1]宇正元王秀丽。算法与数据结构。北京:清华大学出版社,2006

[2]谭浩强。C程序设计(第三版)。北京:清华大学出版社,2005w

数据结构实验多项式加法

数据结构实验报告 实验名称:多项式加减法 学号:1200310419 姓名:林强 实验日期:2015.5.05 一、实验目的 通过实现多项式的加减法,对链表有更深入的了解 二、实验具体内容 1、实验题目1: (1)题目设计一个一元稀疏多项式简单的加减法计算器 实现要求: 一元稀疏多项式简单计算器的基本功能是: (1)输入并建立多项式: 85 17 A+ x + x =; + 3 9 x 7 ) (x 79 8 x B- + = x 22 8 x ) (x (2)输出多项式 (3)多项式A和B相加,建立多项式C=A+B,并输出相加的结果多项式C (4)选作:多项式A和B相减,建立多项式C=A-B,并输出相加的结果多项式D (2)分析 1:本程序的任务是实现两个多项式的加法其中多项式的系数为浮点型, 指数为整数,输出的结果也为系数和指数。 (1)输入的形式和输入值的范围: 输入多项式的系数a和未知数X的指数b,当a和b都为零时,输入结束。输入值的范围:a为实数,b为整数。 (2)输出形式:输出多项式的系数和多项式未知数X的指数即(a,b)形式。 (3)程序所能达到的功能,实现两个多项式的加法,并输出最后的结果 2: 整个程序运行期间实行动态创建节点,一边输入数据, 一边创建节点当将全部数据输入到单链表中后再调用多项式加法这 个函数,并一边实现多项式的相加,一边释放节点,有效防止了 在程序反复运行过程中可能出现系统空间不够分配的现象 (3)实验代码 typedef int Status; #define OVERFLOW -1 #define null 0 typedef struct Lnode{

一元稀疏多项式计算器实验(报告+程序)

一元稀疏多项式计数器预习报告 :刘茂学号0062 一、实验要求 (1)输入并建立多项式; (2)输出多项式,输出形式为整数序列:n,c1,e1,c2,e2……cn,en,其中n是多项式的项数,ci,ei分别为第i项的系数和指数。序列按指数降序排列; (3)多项式a和b相加,建立多项式a+b; (4)多项式a和b相减,建立多项式a-b。 (5)多项式求值; (6)多项式求导; (7)求多项式的乘积。 二、测试数据: 1、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7); 2、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15 )=(-7.8x^15-1.2x^9+12x^-3-x); 3、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); 4、(x+x^3)+(-x-x^3)=0; 5、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); 6、(x+x^2+x^3)+0=x+x^2+x^3. 7、互换上述测试数据中的前后两个多项式。

三、思路分析 用带表头结点的单链表存储多项式。 本程序要求输入并建立多项式,能够降幂显示出多项式,实现多项式相加相减的计算问题,输出结果。 采用链表的方式存储链表,定义结点结构体。运用尾差法建立两条单链表,以单链表polyn p和polyn h分别表示两个一元多项式a和b。 为实现处理,设p、q分别指向单链表polya和polyb的当前项,比较p、q 结点的指数项。 ①若p->expnexpn,则结点p所指的结点应是“和多项式”中的一项,令指针p后移。 ②若p->expn=q->expn,则将两个结点中的系数相加,当和不为0时修改结点p的系数。 ③若p->expn>q->expn,则结点q所指的结点应是“和多项式”中的一项,将结点q插入在结点p之前,且令指针q在原来的链表上后移。 四、实验程序 //头文件 #include #include #include //定义多项式的项 typedef struct Polynomial{ float coef; int expn; struct Polynomial *next; }*Polyn,Polynomial;

数据结构-多项式相加

数据结构课程设计 2012年12月 班级:XXX 学号:XXX 姓名: XXX 指导教师:XXX

一元稀疏多项式计算器 【问题描述】 设计一个一元稀疏多项式简单计算器 【基本要求】 一元多项式简单计算器的基本功能是: 1,输入并建立多项式; 2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 3,多项式a和b相加,建立多项式a+b; 4,多项式a和b相减,建立多项式a-b. 【算法设计思想】 ①一般情况下的一元n次多项式可写成pn(x)=p1xe1+p2xe2+……+pmxem 其中,p1是指数为ei的项的非零系数,且满足0≦e1

【实现提示】 用带表头结点的单链表存储多项式。 【程序代码】 #include #include typedef struct node { float coef; int expn; struct node *next; }Lnode, *polynmial; void create(polynmial &L); //输入并建立多项式L void display(polynmial L); //显示,输出多项式L void sort(polynmial &L); //多项式L按指数排序 void reverse(polynmial &L); //逆置 void select(); //用户选择加减操作 void add(polynmial La, polynmial Lb, polynmial &Lc); //多项式La,Lb相加void subtract(polynmial La, polynmial Lb, polynmial &Ld); //多项式La减去Lb,结果给Ld void create(polynmial &L) //输入并建立多项式L { int i, n; static struct node *p; scanf("%d", &n); L = (struct node *)malloc (sizeof(struct node)); L->next = NULL; for(i = 0; i < n; i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%f %d", &p->coef, &p->expn); p->next = L->next; L->next = p; } } void display(polynmial L)//显示,输出多项式L { struct node *p, *q; int flag = 0; int k = 0; q = L->next; while(q)

数据结构中实现一元多项式简单计算

数据结构中实现一元多项式简单计算: 设计一个一元多项式简单的计算器。 基本要求: 一元多项式简单计算器的基本功能为: (1)输入并建立多项式; (2)输出多项式; (3)两个多项式相加,建立并输出和多项式; (4)两个多项式相减,建立并输出差多项式; #include #include #define MAX 20 //多项式最多项数 typedef struct//定义存放多项式的数组类型 { float coef; //系数 int exp; //指数 } PolyArray[MAX]; typedef struct pnode//定义单链表结点类型 { float coef; //系数 int exp; //指数 struct pnode *next; } PolyNode; void DispPoly(PolyNode *L) //输出多项式 { PolyNode *p=L->next; while (p!=NULL) { printf("%gX^%d ",p->coef,p->exp); p=p->next; } printf("\n"); } void CreateListR(PolyNode *&L,PolyArray a,int n) //尾插法建表 { PolyNode *s,*r;int i; L=(PolyNode *)malloc(sizeof(PolyNode)); //创建头结点 L->next=NULL; r=L; //r始终指向终端结点,开始时指向头结点for (i=0;i

多项式加法(C语言实现)

多项式加法 #include #include #define Max_Size 100 typedef struct node { float coef; int expn; struct node *next; }PolyNode; int CreCoeStr(float C[]) { char flag; int i=0; do { scanf("%f",&C[i++]); scanf("%c",&flag); } while (flag!='#'); return(i); } void CreExpStr(int E[]) { int i=0; char flag; do { scanf("%d",&E[i++]); scanf("%c",&flag); } while (flag!='#'); } void InitPolyList(PolyNode **sq) { if((*sq=(PolyNode *)malloc(sizeof(PolyNode)))==NULL) exit(1); (*sq)->next=NULL; }

void CreatPolyList(PolyNode **sq,float C[],int E[],int num) { int i; PolyNode *s,*r=*sq; for(i=0;icoef=C[i]; s->expn=E[i]; r->next=s; r=s; } r->next=NULL; } void InsertSortPoly(PolyNode **sq) { PolyNode *p,*q,*r,*u; p=(*sq)->next; (*sq)->next=NULL; while (p) { r=*sq; q=(*sq)->next; while (q&&q->expn<=p->expn) { r=q; q=q->next; } u=p->next; p->next=r->next; r->next=p; p=u; } } void DispList(PolyNode *sq) { PolyNode *p=sq->next; while(p) { printf("(%7.2f,%d)",p->coef,p->expn); p=p->next; }

一元多项式求和

一元多项式求和——链表编程 一.实验名称:一元多项式求和——链表编程。 二.实验环境:Windows Xp ,Vc++6.0。 三.实验目的: 1.掌握一元多项式的链表式存储算法; 2.掌握链表的结构定义; 3.采用尾插法生成单链表。 四.实验内容: 1.一元多项式的表示: 一元多项式可按升幂的形式表示为 12012()n e e e n n P x p p x p x p x =++++…… 其中:i e 为第i 项的指数,i p 是指数i e 的项的系数,且 121i n e e e e <=<=<=<=<=<=……。 则多项式()n P x 可以用一个线性表P 来表示:01(,)m P p p p =, ;同理,多项式 ()n Q x 可表示为01(,,)n Q q q q =…(mcodf=c;

链表实现多项式相加实验报告

实验报告 课程名称:数据结构 题目:链表实现多项式相加 班级: 学号: 姓名: 完成时间:2012年10月17日

1、实验目的和要求 1)掌握链表的运用方法; 2)学习链表的初始化并建立一个新的链表; 3)知道如何实现链表的插入结点与删除结点操作; 4)了解链表的基本操作并灵活运用 2、实验内容 1)建立两个链表存储一元多项式; 2)实现两个一元多项式的相加; 3)输出两个多项式相加后得到的一元多项式。 3、算法基本思想 数降序存入两个链表中,将大小较大的链表作为相加后的链表寄存处。定义两个临时链表节点指针p,q,分别指向两个链表头结点。然后将另一个链表中从头结点开始依次与第一个链表比较,如果其指数比第一个小,则p向后移动一个单位,如相等,则将两节点的系数相加作为第一个链表当前节点的系数,如果为0,则将此节点栓掉。若果较大,则在p前插入q,q向后移动一个,直到两个链表做完为止。 4、算法描述 用链表实现多项式相加的程序如下: #include #include #include struct node{ int exp; float coef; struct node*next; };

void add_node(struct node*h1,struct node*h2); void print_node(struct node*h); struct node*init_node() { struct node*h=(struct node*)malloc(sizeof(struct node)),*p,*q; int exp; float coef=1.0; h->next=NULL; printf("请依次输入多项式的系数和指数(如:\"2 3\";输入\"0 0\"时结束):\n"); p=(struct node*)malloc(sizeof(struct node)); q=(struct node*)malloc(sizeof(struct node)); for(;fabs(coef-0.0)>1.0e-6;) { scanf("%f %d",&coef,&exp); if(fabs(coef-0.0)>1.0e-6) { q->next=p; p->coef=coef; p->exp=exp; p->next=NULL; add_node(h,q); } } free(p); free(q); return(h); } void add_node(struct node*h1,struct node*h2) { struct node*y1=h1,*y2=h2; struct node*p,*q; y1=y1->next; y2=y2->next; for(;y1||y2;) if(y1) { if(y2) { if(y1->expexp) y1=y1->next; else if(y1->exp==y2->exp) { y1->coef+=y2->coef; if(y1->coef==0)

多项式求和

数据结构课程设计 题目:多项式运算 学生姓名:熊奉标 学号:10115011046 专业:计算机科学与技术 班级:10级(1)班 指导教师姓名及职称:陈正铭讲师 起止时间:2012 年2 月——2012 年4 月 1 需求分析

1.1 课题背景及意义 本课程设计主要解决一元多项式的运算问题,通过链表的使用,实现对一元多项式的构建、录入、存储、打印、以及之间的运算。在本课程设计中,程序设计语言为C++语言,程序运行平台为Windows/98/2000/XP,程序采用了链表存储方法以及结构化和模块化的设计方法,通过调试运行,可以进行多项式的加、减、乘运算,勉强实现了设计目标,并且经过适当完善后,将可应用到实际中解决某些问题。 一元多项式的运算,虽然无法直接在除数学外的其他领域作出贡献,但是在数学上,它可以为人们解决一些自己动笔动手很难解决的问题,比如说那些很长很长的多项式,用笔算可能要算半天,但是用该程序,只需短短的几秒钟,所以它给人们带来了不少方便,同时相信它也能间接地为其他领域做出贡献。 1.2 课题要求 (1)掌握线性表的创建、插入、删除等基本运算。 (2)掌握线性表的顺序存储结构和链式存储结构 (3)掌握线性表的典型应用—多项式运算(加、减、乘)。 该程序的主要任务是将用户输入的多项式用线性表存储,然后通过对线性表的基本操作,而实现多项式之间的三则运算,把正确结果输出给用户。 1.3 软件格式规定 输入格式:有两类编辑框可供输入,系数编辑框、指数编辑框,在系数编辑框中允许输入浮点型数据,在指数编辑框中只允许输入整型数据。 正确的输入: f(x)=8X^6+4X^5-2X^4-12X^3-1X^1+10X^0 g(x)=2X^3-5X^2+1X^1 正确的输出结果: f(x)+g(x):结果= 8.00X^6 +4.00X^5 -2.00X^4 -121.00X^3 -5.00X^2 +10.00 f(x)-g(x):结果= 8.00X^6 +4.00X^5 -2.00X^4 -125.00X^3 +5.00X^2 -2.00X

一元多项式求和问题的研究与实现

一元多项式求和问题的研究与实现 学生姓名:指导老师: 摘要在数学上,一个一元多项式可按升幂表示为:A(x)=a0+a1x+a2x2+……+anxn,它由n+1个系数唯一确定,一元多项式求和实质上是合并同类项的过程。在实际应用中,多项式的指数可能很高且变化很大,在表示多项式的线性表中就会存在很多零元素。因此,采用单链表来存储一个一元多项式的每一个非零项的系数和指数,即每一个非零项对应单链表中的一个结点,且单链表按指数递增有序排列,就可实现两个一元多项式求和问题。程序通过调试运行,能基本达到设计要求,解决问题。 关键词数据结构;一元多项式;单链表;结点

1 引言 一个一元多项式可按升幂表示为:A(x)=a0+a1x+a2x2+……+a n x n,它由n+1个系数唯一确定。因此,可以用一个线性表(a0,a1,a2,……,an)来表示,每一项的指数i隐含在其系数ai的序号里。若有A(x)= a0+a1x+a2x2+……+a n x n和B(x)=b0+b1x+b2x2+……+b m x m,一元多项式求和也就是求A(x)=A(x)+B(x),这实质上是合并同类项的过程。 1.1 设计目的 设计合理数据结构表示一元多项式,并设计高效算法实现两个一元多项式相加。 1.2 设计要求 本课程设计要求用C++实现两个一元多项式的求和问题,用带头结点的单链表村存储多项式。基本功能要求如下: 1.输入并建立多项式,输入形式为整数序列n,x1,y1,x2,y2,……,x n,y n。其中n是多项式的项数,x i和y i分别是第i项的系数和指数。 2.输出多项式,按指数升序排列。 3.多项式A(x)和B(x)相加,建立多项式A(x)+B(x),输出相加的多项式,形式为类数学表达式。 2 需求分析 2.1 输入形式和输入值的范围 从键盘依次输入两个多项式的项数,系数和指数。系数为任意整数,项数和指数为大于等于0的整数。 2.2 输出形式 从屏幕输出,显示用户输入的多项式,并显示两多项式相加后的多项式和值。2.3 时间性能分析 所谓时间性能是指实现基于某种存储结构的基本操作(即算法)的时间复杂度。

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

数据结构实验报告实验一:一元多项式相加 姓名:周成 学号: 专业:软件工程 任课教师:马慧珠 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 0 typedef struct NODE {

C++一元多项式合并实验报告

实验二一元多项式相加问题本实验的目的是进一步熟练掌握应用链表处理实际问题的能力。 一、问题描述 一元多项式相加是通过键盘输入两个形如P 0+P 1 X1+P 2 X2+···+PnX n的多项式,经过程序运算后在屏幕上输出它 们的相加和。 二、数据结构设计 分析任意一元多项式的描述方法可知,一个一元多项式的每一个子项都由“系数—指数”两部分组成,所以可将它抽象成一个由“系数—指数对”构成线性表,由于对多项式中系数为0的子项可以不记录他的数值,对于这样的情况就不再付出存储空间来存放它了。基于这样的分析,可以采取一个带有头结点的单链表来表示一个一元多项式。具体数据结构定义为: typedef struct node { float ce; //系数域 float ex; //指数域 struct node *next; //指针域 }lnode,*linklist; 三功能(函数)设计 1、输入并建立多项式的功能模块 此模块要求按照指数递增的顺序和一定的输入格式输入各个系数不为0的子项的“系数—指数对”,输入一个子项建立一个相关的节点,当遇到输入结束标志时结束输入,而转去执行程序下面的部分。 屏幕提示: input ce & ex and end with 0: ce=1 ex=2 ce=0 ex=0 //输入结束标志 input ce & ex and end with 0: ce=2 ex=2 ce=0 ex=0 //输入结束标志 输入后程序将分别建立两个链表来描述两个一元多项式: A=X^2 B=2X^2 这两个多项式的相加的结果应该为: C=3X^2 2、多项式相加的功能模块 此模块根据在1中建立的两个多项式进行相加运算,并存放在以C为头指针的一个新建表中。可以采用以下方法进行设计: 开始时a,b分别指向A,B的开头,如果ab不为空,进行判断:如果a所指的结点的指数和b所指的结点的指数相同,将它们的系数相加做成C式中的一项,如果不一样则将小的一项加到C中。 if(a->ex==b->ex) //判断指数是否相等 {s->ce=a->ce+b->ce; if(s->ce!=0) s->ex=a->ex; else delete s; a=a->next; b=b->next; }

一元稀疏多项式计算器(数据结构)

院系:计算机科学学院 专业:软件工程 年级: 2013级 课程名称:数据结构 姓名:韦宜(201321092034)指导教师:宋中山 2015年 12 月 15日

题目:设计一个一元稀疏多项式简单计算器 班级:软件工程1301 姓名:韦宜学号:201321092034 完成日期:12月15日 一、需求分析 问题描述:设计一个一元多项式加法器 基本要求: 输入并建立多项式; (2)两个多项式相加; (3)输出多项式:n, c1, e1, c2, e2, …cn , en, 其中,n是多项式项数,ci和ei分别是第i 项的系数和指数,序列按指数降序排列。 (4)计算多项式在x处的值; (5)求多项式的导函数。 软件环境:Windows,UNIX,Linux等不同平台下的Visual C++ 6.0 硬件环境: 512MB内存,80Gb硬盘,Pentium4 CPU,CRT显示器。

二、概要分析 本程序有五个函数: PolyNode *Input()(输入函数); PolyNode *Deri(PolyNode *head)(求导函数); PolyNode * Plus(PolyNode *A,PolyNode *B)(求和函数); void Output(PolyNode*head)(输出函数); int main()(主函数) 本程序可使用带有附加头结点的单链表来实现多项式的链表表示,每个链表结点表示多项式的一项,命名为node,它包括两个数据成员:系数coef和指数exp,他们都是公共数据成员,*next为指针域,用链表来表示多项式。适用于不定的多项式,特别是对于项数再运算过程中动态增长的多项式,不存在存储溢出的问题。其次,对于某些零系数项,在执行加法运算后不再是零系数项,这就需要在结果多项式中增添新的项;对于某些非零系数项,在执行加法运算后可能是零系数项,这就需要在结果多项式中删去这些项,利用链表操作,可以简单的修改结点的指针以完成这种插入和删除运算(不像在顺序方式中那样,可能移动大量数据项)运行效率高。

一元多项式的运算

数据结构课程设计实验报告 专业班级: 学号: 姓名: 2011年1月1日

题目:一元多项式的运算 1、题目描述 一元多项式的运算在此题中实现加、减法的运算,而多项式的减法可以通过加法来实现(只需在减法运算时系数前加负号)。 在数学上,一个一元n次多项式P n(X)可按降序写成: P n(X)= P n X^n+ P(n-1)X^(n-1)+......+ P1X+P0 它由n+1个系数惟一确定,因此,在计算机里它可以用一个线性表P来表示: P=(P n,P(n-1),......,P1,P0) 每一项的指数i隐含在其系数P i的序号里。 假设Q m(X)是一元m次多项式,同样可以用一个线性表Q来表示: Q=(q m,q(m-1),.....,q1,q0) 不是一般性,假设吗吗m

一元多项式相加完整实验报告

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

一实验内容 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 二需求分析 1掌握线性结构的逻辑特性和物理特性。 2建立一元多项式。 3将一元多项式输入,并存储在内存中,并按照指数降序排列输出多项式。 4能够完成两个多项式的加减运算,并输出结果。 三概要设计 1 本程序所用到的抽象数据类型: typedef OrderedLinkList polynomial; // 用带表头结点的有序链表表示多项式 结点的数据元素类型定义为: typedef struct { // 项的表示 float coef; // 系数 int expn; // 指数 term, ElemType; V oid 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 存储结构

一元多项式的表示在计算机内用链表来实现,同时为了节省存储空间,只存储其中非零的项,链表中的每个节点存放多项式的系数非零项。它包含三个域,分别存放多项式的系数,指数,以及指向下一个项的指针。 创建一元多项式链表,对运算中可能出现的各种情况进行分析,实现一元多项式的相加相减操作。 3 模块划分 a) 主程序;2)初始化单链表;3)建立单链表; 4)相加多项式 4 主程序流程图 四详细设计 根据一元多项式相加的运算规则:对于两个一元多项式中所有指数相同的项,对应系数相加,若其和不为零,则构成“和多项式”中的一项,对

两个一元多项式相加-c++版

《数据结构》实验报告 ——两个一元多项式相加 一、实验题目:两个一元多项式相加 二、实验内容: 根据所学的数据结构中线性结构(线性表)的逻辑特性和物理特性及相关算法,应用于求解一个具体的实际问题----------两个多项式相加 三、设计思想: (1)建立两个顺序列表,分别用来表示两个一元多项式;顺序列表奇数位,存储该多项式的系数;顺序列表的偶数位,存储该相应多项式的指数。 (2)用成员函数merg(qList&l2)实现两多项式的相加。实现的大致方法为:比较第二个多项式列表与第一个多项式列表的偶数位的数值大小(指数),如果 相同,则将他们的前一位数(系数)相加;如果不同,就将他的前一位数(系 数)及它自己(指数)插入第一个多项式列表的后面。 (3)建立函数shu(double a[],int j)实现多项式的输入。 四、源程序代码 #include "stdafx.h" #include using namespace std; template class List { private: Telem * elem; int curlen; int maxlen; public: List(int maxsz=100):maxlen(maxsz) { curlen=0; elem=new Telem{maxlen}; }; List(Telem a[],int n,int maxsz=100):maxlen(maxsz) { curlen=n; elem=new Telem[maxlen]; for(int i=0;i

一元多项式相家问题

一元多项式相加问题 # include typedef struct node{ float coef; int exp; int flg; struct node *next; }PolyNode,*PolyList; PolyNode *head_a,*head_b,*head_c; PolyList A,B,C; PolyNode *Creat_PolyNode() { PolyNode *s,*r; PolyList L; float x;int y; L=new PolyNode; L->next=NULL; r=L; cin>>x>>y; while(x||y) //输0的时候输入【0,另一个链表有的指数】{ s=new PolyNode; s->coef=x; s->exp=y; r->next=s; r=s; cin>>x>>y; } r->next=NULL; return L; } void Out_PolyNode(PolyNode *L,float a[100],int b[100]) { PolyNode *p;int i=0,j=0; p=L->next; if(p==NULL) cout<<"0"; while(p) { a[i]=p->coef; b[i]=p->exp; p=p->next; i++,j++; }

for(i=0;inext,q=B->next; while(p&&q) { if(p->exp==q->exp) { s=new PolyNode; s->coef=p->coef+q->coef; if(s->coef==0) { p=p->next; q->flg=1; } else { s->exp=p->exp; r->next=s; r=s; p->flg=1; q->flg=1; p=p->next; q=B->next; } } else if(p->exp!=q->exp&&q->next==NULL) { s=new PolyNode; s->coef=p->coef; s->exp=p->exp; r->next=s; r=s; p->flg=1; p=p->next; q=B->next; } else

一元稀疏多项式计算器(数据结构)

【问题描述】 设计一个一元稀疏多项式简单计算器 【基本要求】 一元多项式简单计算器的基本功能是: 1,输入并建立多项式; 2,输出多项式,输出形式为整数序列:n,c1,e1,c2,c2,...,cn,en,其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 3,多项式a和b相加,建立多项式a+b; 4,多项式a和b相减,建立多项式a-b. 【测试数据】 1,(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7) 【实现提示】 用带表头结点的单链表存储多项式。 #include #include typedef struct node { float coef; int expn; struct node *next; }Lnode, *polynmial; void create(polynmial &L); //输入并建立多项式L void display(polynmial L); //显示,输出多项式L void sort(polynmial &L); //多项式L按指数排序 void reverse(polynmial &L); //逆置 void select(); //用户选择加减操作 void add(polynmial La, polynmial Lb, polynmial &Lc); //多项式La,Lb相加void subtract(polynmial La, polynmial Lb, polynmial &Ld); //多项式La减去Lb,结果给Ld void create(polynmial &L) //输入并建立多项式L { int i, n; static struct node *p; scanf("%d", &n); L = (struct node *)malloc (sizeof(struct node)); L->next = NULL; for(i = 0; i < n; i++) { p = (struct node *)malloc(sizeof(struct node)); scanf("%f %d", &p->coef, &p->expn); p->next = L->next; L->next = p; } }

二元多项式相加

华北水利水电大学数据结 构试验报告 ------二元多项式相加 2013160班

/*二元多项式的相加*/ #include #include struct node{ int coefficient; int expoentx; int exponety; struct node *next; }; typedef struct node *ptrtonode; ptrtonode bulidnode( void )//建立多项式链表 { int i, j; ptrtonode head, pnew, p; printf("请输入多项式含有的项数\n"); scanf("%d", &i); getchar(); if( (head = (ptrtonode)malloc( sizeof( struct node ))) == NULL ) return NULL; head->expoentx = 0; head->exponety = 0; head->next = NULL; head->coefficient = i;//将多项式的项数存在首节点 p = head; for( j = 0; j < i; j++ ) { if( (pnew = (ptrtonode)malloc( sizeof( struct node ))) == NULL ) return NULL; printf("请输入系数x和y的次幂中间用空格隔开\n"); scanf("%d%d%d", &pnew->coefficient, &pnew->expoentx, &pnew->exponety); fflush(stdin); p->next = pnew; p = pnew; p->next = NULL; } return head;

一元稀疏多项式计算器实习报告

实习报告 题目:设计一个一元稀疏多项式计算器 班级: 姓名学号__________完成日期:__ 一、课程题目 一元稀疏多项式计算器 二、需求分析 1、一元稀疏多项式简单计算器的功能是: 1.1 输入并建立多项式; 1.2 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,………cn,en, 其中n是多项式的项数,ci和ei分别是第i项的系数和指数,序列按指数降序排列; 1.3 求多项式a、b的导函数; 1.4 计算多项式在x处的值; 1.5多项式a和b相加,建立多项式a+b; 1.6 多项式a和b相减,建立多项式a-b。 2、设计思路: 2.1 定义线性表的动态分配顺序存储结构; 2.2 建立多项式存储结构,定义指针*next 2.3利用链表实现队列的构造。每次输入一项的系数和指数,可以输出构 造的一元多项式 3、测试数据: (1)、(2x+5x^8-3.1x^11)+(7-5x^8+11x^9)=(-3.1x^11+11x^9+2x+7); (2)、(6x^-3-x+4.4x^2-1.2x^9+1.2x^9)-(-6x^-3+5.4x^2-x^2+7.8x^15 )=(-7.8x^15-1.2x^9+12x^-3-x); (3)、(1+x+x^2+x^3+x^4+x^5)+(-x^3-x^4)=(1+x+x^2+x^5); (4)、(x+x^3)+(-x-x^3)=0; (5)、(x+x^100)+(x^100+x^200)=(x+2x^100+x^200); (6)、(x+x^2+x^3)+0=x+x^2+x^3. 三、概要设计 1.有序表的抽象数据类型定义为: ADT List{ 数据对象:D={a i| a i∈R,i=1,2,…,n,n≧0}

相关文档
最新文档