数据结构-多项式

合集下载

多项式运算(数据结构C++描述)

多项式运算(数据结构C++描述)
else
{
now = pre->next;
while(signal == 0)
{
if(inpt->expn < now->expn)//当新链节小于现在的连接时向后移一个链节
{
if(now->next == NULL)
{
now->next = inpt;
insert(res,inpt);//把当前"g(x)"的链节插入到"y(x)"中
}
return res;
}
node *list::diffnode(node *head) //多项式微分
{
node *pre;
int flag = 0;
pre = head->next;
#include<iostream>
using namespace std;
struct node //定义节点类型
{
float coef;
int expn;
node * next;
};
class list
{
public:
list();
{
node *inpt,*res,*pre;
int flag = 0;
res = new node;//创建链表头
res->next = NULL;
head1 = head1->next;
pre = head2;
while(flag == 0)
{
if(pre->next == NULL)
{

数据结构之多项式创建输出等操作

数据结构之多项式创建输出等操作

#include<stdlib.h>#include<malloc.h>typedef struct polynomial {int coef,ex;struct polynomial *next;}POL Y *create_poly(void);POL Y *mul_poly(POLY *,POL Y *);void print_poly(POLY *);int main(void) {POL Y *heada=NULL,*headb=NULL,*headmul=NULL;printf("create the first multinomial:\n"); heada=create_poly();printf("create the second multinomial:\n"); headb=create_poly();printf("The first multinomial:\n");print_poly(heada);printf("The second multinomial:\n");print_poly(headb);headmul=mul_poly(heada, headb);printf("The mul multinomial:");print_poly(headmul);return 0;}//创建多项式POL Y *create_poly() {int iA=0,iE=0;POL Y *head=NULL,*s=NULL,*r=NULL; head=(POLY *)malloc(sizeof(POLY));r=head;printf("please input coef and exponent:\n"); scanf("%d%d",&iA,&iE);while(iA != 0){s=(POLY *)malloc(sizeof(POLY));s->coef=iA, s->ex=iE;r->next=s;r=s;scanf("%d%d",&iA,&iE);}r->next=NULL;return head;}//相乘POL Y *mul_poly(POLY *p1, POL Y *p2) {POL Y *head;POL Y *t,*q,*s,*r;head=(POLY *)malloc(sizeof(POLY)); head->next=NULL;r=(POLY *)malloc(sizeof(POL Y));r->next=NULL;for(t=p1->next;t;t=t->next){for(q=p2->next;q;q=q->next){s=(POLY *)malloc(sizeof(POLY));r->next=s;s->coef=q->coef * t->coef;s->ex=q->ex + t->ex;s->next=NULL;head=add_poly(r,head);}}return head;}//输出void print_poly(POLY *head) {POL Y *p=NULL;p=head->next;if(p == NULL)printf("The multinomial is NULL.\n"); else {do {if(p->coef>=0)printf("+%dx^%d",p->coef,p->ex);elseprintf("%dx^%d",p->coef,p->ex);p=p->next;}while(p != NULL);printf("\n"); }}。

【数据结构算法】实验1 线性表应用-多项式计算(附源代码)

【数据结构算法】实验1 线性表应用-多项式计算(附源代码)

浙江大学城市学院实验报告课程名称数据结构与算法实验项目名称实验一线性表应用---多项式计算实验成绩指导老师(签名)日期一.实验目的和要求1.进一步掌握线性表的的基本操作。

2.掌握线性表的典型应用----多项式表示与计算。

二. 实验内容1.设用线性表( (a1, e1), (a2, e2), ……, (am, em) ) 表示多项式P(x) = a1*x e1 + a2*x e2+…+ am*x em,其中:a1~am为非零系数,0≤e1<e2<…..<em,请编写用链式存储结构(带表头附加结点的单链表)存储该多项式时,多项式基本操作的实现函数。

多项式基本操作应包括初始化多项式、清除多项式、输出多项式、插入一项、删除一项、多项式求值、多项式相加等。

要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在头文件Linkpoly.h中,主函数存放在主文件test6_1.cpp中,在主函数中通过调用Linkpoly.h中的函数进行测试。

2.选做:编写用顺序存储结构存储多项式时,多项式基本操作的实现函数。

要求:把多项式线性表的结构定义及多项式基本操作实现函数存放在文件Seqpoly.h中,在主文件test6_1.cpp中增加测试语句对Seqpoly.h中的函数进行测试。

3.填写实验报告,实验报告文件取名为report1.doc。

4.上传实验报告文件report1.doc与源程序文件test6_1.cpp及Linkpoly.h、Seqpoly.h(若有)到Ftp服务器上自己的文件夹下。

三. 函数的功能说明及算法思路包括每个函数的功能说明,及一些重要函数的算法实现思路※注1:除了[多项式求值]与[多项式相加]两个函数外,线性表的基本操作函数,大部分沿用上学期[线性表的链式/顺序表示和实现]两个实验中的函数。

※注2:选作部分函数功能与思路与非选作部分基本一致,略去思路描述函数:void InitList(LNode *&H)功能:初始化单链表思路:使用附带头结点的方式初始化单链表函数:int LengthList (LNode *H)功能:求单链表长度思路:遍历整个单链表,设置变量记录并返回它的长度函数:bool EmptyList (LNode *H)功能:判断单链表是否为空表思路:判断头结点的后一结点是否为空,若空则为空表函数:void TraverseList(LNode *H)功能:遍历单链表思路:遍历整个单链表,输出所含所有元素函数:bool InsertList ( LNode *&H, ElemType item, int pos)功能:向单链表插入一个元素思路:创建新结点,根据pos的值来确定位置并向单链表中插入新元素。

数据结构一元多项式的运算

数据结构一元多项式的运算

目录一、问题分析.................................... 错误!未定义书签。

问题描述 ........................................................................ 错误!未定义书签。

问题的数学模型............................................................. 错误!未定义书签。

构造数据结构................................................................. 错误!未定义书签。

二、系统分析 ...................................................................... 错误!未定义书签。

可行性研究..................................................................... 错误!未定义书签。

系统结构与主要功能模块 ............................................. 错误!未定义书签。

三、系统设计 ...................................................................... 错误!未定义书签。

系统设计目的与要求 ....................................................... 错误!未定义书签。

系统设计内容................................................................... 错误!未定义书签。

功能算法描述与数据结构说明........................................ 错误!未定义书签。

数据结构_一元多项式运算器_cpp代码(visual c++)

数据结构_一元多项式运算器_cpp代码(visual c++)
multinomialMultiply(La,L1,L2);
multinomialDestroy(L1); //清空L1,用以作为下一轮的存储
multinomialMultiply(La,L2,L1);
multinomialDestroy(L2);
}
multinomialMultiply(La,L1,L2);
if(p->cof > 0)
printf("%c%.3lf",c,p->cof);
else
printf("%.3lf",p->cof);
}
else{
if(p->cof > 0)
printf("%c%.3lfx^%d",c,p->cof,p->ind);
ElemType cof; //多项式系数
int ind; //多项式次幂
struct LNode* next;
} * LinkList;//LinkList是指向LNode的指针!!!!
//多项式的创建(OK)
void multinomialCreat(LinkList &L){
scanf("%d",&L->ind);//用头结点的ind保存多项式项数
for(int i = 0;i < L->ind;i++){
s = (LNode*)malloc(sizeof(LNode));
printf("Please input the multinomial in descending order, every term\'s coefficent and index in form\"a,b\".\n");

数据结构 多项式乘法

数据结构 多项式乘法

实习报告一、实习题:请写出计算两个以单链接表表示的多项式相乘的程序。

1.需求分析和说明两个多项式相乘,可以利用两个多项式的加法来实现,因为乘法运算可以分解为一系列的加法运算:C(x)=A(x)*B(x)=A(x)*(b1x+b2x2+…+b n x n)=∑=niii xbxA1)(先用其中一个多项式去乘以另一个多项式的每一项,得出的若干个多项式按照一定的顺序相加,即幂不同的按照升幂排列,幂相同的将系数相加。

例如:对于(X->1+2X->2)*(2X->2+4X->3).X->1*(2X->2+4X->3)=2X->3+4X->4;2X->2*(2X->2+4X->3)=4X->4+8X->5;排列结果:2X->3+8X-4+8X->52.设计用两个单链表的存储两个多项式,每个结点包含单项式的系数,幂和指向下一个元素地址的指针。

用其中的一个多项式乘以另一个多项式的每一项,随后将所得结果按照升幂顺序排列,最后得到结果。

存储结构://单项式结构struct Term {float coef; // 系数。

int exp; // 幂指数。

Term( float c, int e) { coef = c; exp = e;}Term( ) { }friend int operator == (const Term & L, const Term & T ) { return L.exp == T.exp; }friend int operator > (const Term & L, const Term & T ) { return L.exp > T.exp; }friend int operator < (const Term & L, const Term & T ) { return L.exp < T.exp; }friend Term & operator += ( Term & L, const Term & T ){ L.coef += T.coef; return L; } //幂指数相同,则系数相加。

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

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

实验一一元多项式的表示与相加实验目的: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:%6fx^%d",p->cof,p->exp);p=p->next;while (p){if(p->cof>0) printf("+");//系数正负号if (fabs(p->cof)<=0.000001); break;//不输出系数为零的项printf("%6fx^%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语言有些生疏和遗忘,在编程过程中出现很多错误。

数据结构课程方案一元稀疏多项式计算

数据结构课程方案一元稀疏多项式计算

#include<stdio.h>#include<malloc.h>#include<stdlib.h>//定义多项式的项typedef struct Polynomial{float coef。

int expn。

struct Polynomial *next。

}*Polyn,Polynomial。

void Insert(Polyn p,Polyn h>{if(p->coef==0> free(p>。

//系数为0的话释放结点else{Polyn q1,q2。

q1=h。

q2=h->next。

while(q2&&p->expn<q2->expn>{//查找插入位置q1=q2。

q2=q2->next。

}if(q2&&p->expn==q2->expn>{//将指数相同相合并q2->coef+=p->coef。

free(p>。

if(!q2->coef>{//系数为0的话释放结点q1->next=q2->next。

free(q2>。

}}else{//指数为新时将结点插入p->next=q2。

q1->next=p。

}}}Polyn CreatePolyn(Polyn head,int m>{//建立一个头指针为head、项数为m的一元多项式Polyn p。

p=head=(Polyn>malloc(sizeof(struct Polynomial>>。

head->next=NULL。

for(i=0。

i<m。

i++>{p=(Polyn>malloc(sizeof(struct Polynomial>>。

//建立新结点以接收数据 printf("请输入第%d项的系数与指数:",i+1>。

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

一.实验目的:
理解线性表的基本逻辑结构,完成链表及循环链表的实现
通过实验进一步理解线性表的逻辑结构和存储结构,提高使用理论知识指导解决实际问题的能力,熟练掌握链表的实际应用。

二.实验内容:
题目:一元多项式运算
问题描述:
设计算法实现一元多项式的简单运算。

基本要求:
(1)输入并建立多项式;
(2)输出多项式;
(3)多项式加法
(4)多项式减法。

测试数据:
(1)(2x+5x8-3.1x11)+(7-5x8+11x9)=(-3.1x11+11x9+2x+7)
(2)(6x-3-x+4.4x2-1.2x9)-(―6x―3-+5.4x2-x2+7.8x15) =(―7.8x15―1.2x9+12x―3―x)
(3)(1+x+x2+x3+x4+x5)+(―x3―x4)=(1+x+x2+x5)
(4)(x+x3)+(―x―x3)=0
(5)(x+x100)+(x100+x200)=(x+2x100+x200)
(6)(x+x2+x3)+0=x+x2+x3
三. 实验方案(程序设计说明)
(一)算法设计思路:
1.将两个多项式的系数和指数分别存放在新建的两个链表中;
2.其中一个链表A的指针不动,遍历另一个链表B,指数相等
时系数相加,删除该数,链表B从头开始,链表A移向下个
数据域;
3.直到链表B为空或者链表A遍历完成结束。

(二)算法流程图:
(三)界面设计说明:
请输入多项式的长度: 开始
输入多项式长
度N 以及系数
m,指数n
A →n=
B →n? Y
N
j++
系数相加存放在A 表
i++ 结束
创建链表A ,B ,链表A 从i=0
开始循环,链表B 从j=0开始
i>N?
N
Y
i>N?
N
Y
请输入第一个多项式的系数、指数:
请输入另一个多项式的系数、指数:
加法按1,减法按2
(四)使用模块及变量的说明
实验:m→系数;n→指数;A、B链表
四. 实验步骤或程序(经调试后正确的源程序)实验二:(多项式)
#include "stdafx.h"
#include <iostream>
#include "conio.h"
using namespace std;
typedef struct lnode
{
int m;//系数
int n;//指数
struct lnode*next;
} LNode, *LinkList;
LinkList Creat(LinkList L, int i)
{
LNode *r = NULL, *s;
int m, n;
for (int j = 0; j<i; j++)
{
scanf_s("%d%d", &m, &n);
s = new LNode;
s->m = m;
s->n = n;
if (L == NULL) L = s;
else r->next = s;
r = s;
}
if (r != NULL)
r->next == NULL;
return L;
}
void Combine(LinkList p, LinkList q, int x, int i, int j) {
LinkList s = p, a = q;
LNode*pre;
pre = s;
int k = 0, r = 0;
for (; r<i; r++)
{
if (s->n == q->n)
{
switch (x)
{
case 1:q->m += s->m; break;
case 2:q->m -= s->m; break;
}
q = q->next;
if (s == p)
{
p = p->next;
free(s);
s = p;
pre = s;
}
else
{
pre->next = s->next;
delete s;
s = p;
pre = s;
}
}
else
{
pre = s;
s = s->next;
}
k++;
if (k >= j)
s = p;
}
/*
if (r >= i&&p != NULL)
{
p->next = q->next;
q->next = p;
free(p);
p = p->next;
}
*/
for (; i > 0; i--)//while (a->next!=NULL) {
cout << a->m << "\t" << a->n << endl;
a = a->next;
}
}
int main()
{
LinkList A = NULL, B = NULL;
int x;
printf("\n请输入多项式的长度:");
scanf_s("%d", &x);
printf("\n请输入第一个多项式系数、指数:\n");
A = Creat(A, x);
printf("\n请输入另一个多项式系数、指数:\n");
B = Creat(B, x);
int ch;
printf("\n加法按1,减法按2\t");
scanf_s("%d", &ch);
Combine(A, B, ch, x, x);
_getch();
}
五.程序运行结果
六.实验总结
通过完成此次实验,我对链表有了进一步的理解。

我体会到编程不仅需要c语言及数据结构知识,还需要对实验目的有清楚的理解、对目的的实现有清晰的思路,只有这样,才有可能更快更好地完成任务。

相关文档
最新文档