数据结构一元多项式的相加

合集下载

一元多项式的加法数据结构

一元多项式的加法数据结构

一元多项式的加法数据结构一元多项式是数学中常见的一种代数表达式形式,由多个单项式按照一定的规则相加而成。

在计算机科学中,为了方便对一元多项式进行处理,需要定义一种合适的数据结构来表示和操作一元多项式的加法运算。

一元多项式的加法数据结构可以使用链表来实现。

每个节点表示一个单项式,包含两个成员变量:系数和指数。

系数表示单项式的系数,指数表示单项式的指数。

通过将多个单项式的系数和指数组织成一个链表,即可表示一个一元多项式。

在链表中,每个节点按照指数从小到大的顺序排列。

这样可以方便进行多项式的加法运算。

当两个一元多项式相加时,只需按照指数的大小依次比较两个链表中的节点,并根据指数的大小关系进行相应的操作。

具体的加法算法如下:1. 创建一个新的链表作为结果链表。

2. 初始化两个指针分别指向两个原始链表的头节点。

3. 循环比较两个链表中的节点,直到其中一个链表遍历完为止。

4. 比较当前节点的指数大小关系:- 如果两个节点的指数相等,将它们的系数相加,并将结果添加到结果链表中。

- 如果第一个链表中的节点指数较小,将第一个链表的节点添加到结果链表中,并将指针指向下一个节点。

- 如果第二个链表中的节点指数较小,将第二个链表的节点添加到结果链表中,并将指针指向下一个节点。

5. 当其中一个链表遍历完后,将另一个链表中剩余的节点依次添加到结果链表中。

6. 返回结果链表作为两个一元多项式相加的结果。

通过上述算法,可以实现对一元多项式的加法运算。

这种链表结构的一元多项式加法数据结构具有以下优点:- 灵活性:可以表示任意长度的一元多项式,不受固定数组长度的限制。

- 高效性:在添加节点和遍历节点时,时间复杂度为O(n),其中n 为一元多项式的项数。

- 可扩展性:可以方便地扩展其他操作,如乘法、求导等。

除了链表结构,还可以使用数组等数据结构来表示一元多项式的加法。

不同的数据结构适用于不同的应用场景。

链表结构适合于插入和删除操作较多的情况,而数组结构适合于随机访问和内存占用较小的情况。

数据结构.第2章.线性表.2.一元多项式的表示及相加

数据结构.第2章.线性表.2.一元多项式的表示及相加
Pc
Pa Pb
Pc 10 6
1 0 /\
§2.4 一元多项式的表示及相加 ❖例2:设两个一元多项式为
A(x)= 4 + 6x4 + 5x8 + 4x12 B(x)= 2x3 - 5x8 + 3x12 + 7x15
求此两一元多项式之和: C(x)=A(x)+B(x)
§2.4 一元多项式的表示及相加
} ADT Polynomial
§2.4 一元多项式的表示及相加
❖实现思路
▪ 依次比较Pa和Pb所指结点中的指数项,依
Pa―>expn =、<、> Pb―>expn等情况,再决定
是将两系数域的数值相加(并判其和是否为0), 还是将较高指数项的结点插入到新表C中。
§2.4 一元多项式的表示及相加 ❖例1:设两个一元多项式为
习题与练习
2. 在一个单链表HL中,若要在指针q指向的结点的后 面插入一个由指针P指向的结点,则执行( )。 A) q -> next = p -> next ; p = q; B) p -> next = q -> next ; q = p; C) q -> next = p -> next ; p -> next = q ; D) p -> next = q -> next ; q -> next = p ;
ha=GetHead(pa); hb=GetHead(pb) ; // ha和hb分别指向Pa和Pb的头结点
int cmp (term a,term b) ;
qa=NextPos(pa, ha); qb=NextPos(pb, hb) ; //qa和qb分别指向Pa和Pb中当前结点

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

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

一元多项式相加问题实验报告一元多项式相加问题一、问题描述通过键盘输入两个形如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 为头指针的一个新链表中。

数据结构——一元多项式的建立与相加

数据结构——一元多项式的建立与相加
#include<iostream>
#include <cmath>
using namespace std;
typedef struct PolyNode
{
int coef; //系数
int expn; //指数
struct PolyNode *next;
} *PNode; //多项式结点的指针
void InitPoly(PNode &head,PNode &p)
{
int n;
PNode s,p;
pa=pa->next;
pb=pb->next;
p=pc;
while (pa!=NULL && pb!=NULL)
{
if (pa->expn>pb->expn)
{
s=(PNode)malloc(sizeof(struct PolyNode));
s->coef=pa->coef;
{
if(i) //显示第一对的时候是不需要显示加号的
{
if (p->expn==1) cout<<p->coef<<"x";
else if (p->expn==0) cout<<p->coef<<endl;
else cout<<p->coef<<"x^"<<p->expn;
i=0;
}
else
{
if (p->expn==1) cout<<p->coef<<"+x";

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

数据结构 线性结  一元多项式的加法乘法实现
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

一元多项式的加法数据结构

一元多项式的加法数据结构

一元多项式的加法数据结构一元多项式是数学中常见的一种表达形式,它可以表示为各个项的和,每个项由一个系数和一个幂次组成。

在实际应用中,一元多项式的加法操作非常常见,因此设计一个高效的数据结构来表示和计算一元多项式的加法是非常重要的。

在一元多项式的加法操作中,我们需要考虑的主要问题有两个:一是如何存储一元多项式的各个项,二是如何进行多项式的加法运算。

对于第一个问题,我们可以使用链表来存储一元多项式的各个项。

链表的每个节点可以表示一个多项式的项,其中包含两个数据成员:一个表示系数的值,一个表示幂次的值。

通过链表的链接关系,可以按照幂次的从小到大的顺序存储一元多项式的各个项,从而方便后续的加法运算。

对于第二个问题,我们可以设计一个函数来实现一元多项式的加法运算。

该函数接受两个参数,分别是待相加的两个一元多项式。

在函数内部,我们需要遍历两个链表,按照幂次的大小比较来确定相应的操作。

具体的步骤如下:1. 创建一个新的链表,用于存储相加后的结果。

2. 初始化两个指针,分别指向两个待相加的链表的头节点。

3. 进行循环遍历,直到两个链表均为空。

4. 比较两个链表当前节点的幂次大小。

- 若幂次相等,则将两个节点的系数相加,并将结果插入到新链表中。

- 若幂次不等,则将系数较小的节点插入到新链表中,并将指针指向下一个节点。

5. 遍历完其中一个链表后,将另一个链表剩余的节点依次插入到新链表中。

6. 返回新链表作为相加后的结果。

通过上述的设计,我们可以实现一元多项式的加法操作。

这种数据结构的好处是可以有效地存储一元多项式的各个项,并且在进行加法运算时可以按照幂次的大小进行有序操作,从而提高了计算效率。

除了加法操作,一元多项式的数据结构还可以支持其他常见的操作,例如减法、乘法、求导等。

这些操作可以通过类似的方式进行设计和实现,只需根据具体的需求进行相应的调整即可。

一元多项式的加法是数学中常见的操作,设计一个高效的数据结构来表示和计算一元多项式的加法对于数学计算和实际应用都具有重要意义。

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

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

实验一一元多项式的表示与相加实验目的: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语言有些生疏和遗忘,在编程过程中出现很多错误。

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

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

数据结构实验报告实验一:一元多项式相加姓名:周成学号: 13083511专业:软件工程任课教师:马慧珠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.实验总结本来我对编程很没有信心,做这样一个课程设计感觉有点吃力,虽然有些人觉得很简单,但是我还是坚持做下来了,我不断的看书,翻阅资料,询问同学,上网搜索,总算有模有样地把这个程序编的能运行了。

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

•重点:线性表的顺序存储; 线性表的链式存储; 顺序表的插入、删除 单链表的插入、删除
•难点:双向链表的系列操作 线性表的应用。
• 2.4 线性表的应用举例
一元多项式的表示及相加 – 一元多项式的表示:
Pn (x) P0 P1 x P2 x 2 Pn x n
可用线性表P表示 P (P0 , P1 , P2 ,, Pn ) 但对S(x)这样的多项式浪费空间
S (x) 1 3x1000 2x 20000
一般Pn (x) P1 x e1 P2 x e2 Pm x em 其中0 e1 e2 em(Pi为非零系数)
中的一 项,p后移,q不动
比较 p->exp与
q->exp
p->exp > q->exp: q结点是结果多项式中
的一 项,将q插在p之前,q后移,p不动
p->exp = q->exp:
系数相加
0:从A表中删去p所指 结点 释放p,q,p,q后移
0:修改p系数域, 释放q,p,q后移
若q==NULL,结束 直到p或q为NULL 若p==NULL,将B中剩余部分连到A上即可
算法描述
pre
p pre
p pre
pp
p
ppaa
--11
77 00
31111 111
99 88
55 1177 ^^
ppbb
--11
88 11
2222 77
--99 88 ^^ q=NULL
q
prqe
q
pa
-1
70
11 1
22 7
5 17 ^
Ch2_7.c
void add_poly(JD *pa,JD *pb) { JD *p,*q,*u,*pre;
用数据域含两个数据项的线性表表示
P1,e1,P2,e2,Pm,em
其存储结构可以用顺序存储结构,也可以用单链表

–单链表的结点定义
typedef struct node { int coef,exp;
coef exp next
struct node *next;
}JD; 一元多项式相加
A(x) 7 3x 9x8 5x17
int x; p=pa->next; q=pb->next; pre=pa; while((p!=NULL) && ((q!=NULL)) { if(p->exp<q->exp)
{ pre=p; p=p->next;} else if(p->exp==q->exp) { x=p->coef+q->coef;
if(x!=0){ p->coef=x; pre=p;} else { pre->next=p->next; free(p);}
p=pre->next; u=q; q=q->next; free(u); } else { u=q->next;q->next=p;pre->next=q;
pre=q; q=u; } } if(q!=NULL) pre->next=q; free(pb); }
B(x) 8x 22x7 9x8
C(x) A(x) B(x) 7 11x 22x7 5x17
A
-1
70
31
98
5 17 ^
B
-1
81
22 7 -9 8 ^
C
-1
70
11 1 22 7
5 17 ^
运算规则
设p,q分别指向A,B中某一结点,p,q初值是第一结点
p->exp < q->exp: p结点是结果多项式
相关文档
最新文档