链表及其多项式相加
多项式链表加法

多项式链表加法要实现多项式链表的加法,我们可以按照指数的从小到大的顺序对两个多项式链表进行遍历,逐项相加生成新的链表。
具体步骤如下:1. 定义一个多项式链表的节点类,节点类中包含一个系数和指数作为节点的数据成员,并定义一个指向下一个节点的指针。
```pythonclass Node:def __init__(self, coefficient, exponent):self.coefficient = coefficientself.exponent = exponentself.next = None```2. 定义一个多项式链表类,类中包含一个头节点作为链表的起始位置,并定义相应的方法。
```pythonclass PolynomialLinkedList:def __init__(self):self.head = Node(0, 0) # 头节点的指数和系数均为0```3. 定义一个方法来插入节点到多项式链表中。
```pythondef insert(self, coefficient, exponent):new_node = Node(coefficient, exponent)current = self.headwhile current.next and current.next.exponent > exponent:current = current.nextif current.next and current.next.exponent == exponent:current.next.coefficient += coefficientelse:new_node.next = current.nextcurrent.next = new_node```4. 定义一个方法来将多项式链表进行加法运算,并返回一个新的多项式链表。
```pythondef add(self, other):result = PolynomialLinkedList()current1 = self.head.nextcurrent2 = other.head.nextwhile current1 and current2:if current1.exponent > current2.exponent:result.insert(current1.coefficient, current1.exponent)current1 = current1.nextelif current1.exponent < current2.exponent:result.insert(current2.coefficient, current2.exponent)current2 = current2.nextelse:result.insert(current1.coefficient + current2.coefficient, current1.exponent)current1 = current1.nextcurrent2 = current2.nextwhile current1:result.insert(current1.coefficient, current1.exponent) current1 = current1.nextwhile current2:result.insert(current2.coefficient, current2.exponent) current2 = current2.nextreturn result```以下是一个完整的示例代码:```pythonclass Node:def __init__(self, coefficient, exponent):self.coefficient = coefficientself.exponent = exponentself.next = Noneclass PolynomialLinkedList:def __init__(self):self.head = Node(0, 0)def insert(self, coefficient, exponent):new_node = Node(coefficient, exponent)current = self.headwhile current.next and current.next.exponent > exponent: current = current.nextif current.next and current.next.exponent == exponent: current.next.coefficient += coefficientelse:new_node.next = current.nextcurrent.next = new_nodedef add(self, other):result = PolynomialLinkedList()current1 = self.head.nextcurrent2 = other.head.nextwhile current1 and current2:if current1.exponent > current2.exponent:result.insert(current1.coefficient, current1.exponent)current1 = current1.nextelif current1.exponent < current2.exponent:result.insert(current2.coefficient, current2.exponent)current2 = current2.nextelse:result.insert(current1.coefficient + current2.coefficient, current1.exponent)current1 = current1.nextcurrent2 = current2.nextwhile current1:result.insert(current1.coefficient, current1.exponent)current1 = current1.nextwhile current2:result.insert(current2.coefficient, current2.exponent)current2 = current2.nextreturn result```通过以上的代码,我们就可以进行多项式链表的加法运算了。
实验三链表及其多项式相加 - 副本

实验三、链表及其多项式相加一、实验目的1.了解线性表的链式存储结构,熟练掌握链表。
2.了解作为链表的多项式存贮方式。
3.熟悉掌握多项式加法的算法。
二、实验原理顺序存储的线性表有一些弱点,其一,插入与删除元素需要大量移动元素;其二,预先分配存储空间时必须按最大的空间来分配。
其三,表长难以扩充。
所以,必须引入链式存储结构。
链式存储结构的特点是用一组任意的存储单元存储线性链表的数据元素,与顺序表的区别在于链式存储的存储单元可以是连续的,也可以是不连续的。
为了实现这种结构,链表采取由两部分信息组成数据元素a i的存储映像,称为结点。
结点包括两个域,其中存储数据信息的域称为数据域,存储直接后继信息的称为指针域。
指针域中存储的信息叫做指针或链。
这样,n个结点链接成一个链表,即为线性表(a1,a2,a3,···,a n)。
1.符号多项式的操作,已经成为表处理的典型用例,在数学上,一个一元多项式pn(x)可以按升幂写成:pn(x)=p0+p1·x+p2·(x的2次幂)+···+p n·(x的n次幂)。
它由n+1个系数唯一确定。
因此,在计算机里,它可用一个线性表P来表示:P=(p0,p1,p2,···,p n), 显然,此种表示仅适于顺序存储结构,在通常的应用中,多项式的次数变化很高且很大,将造成内存的很大浪费。
2.实现单链表就地逆置。
三、实验要求1.参照书上的原理说明分析程序,深入理解链表的物理存储模式和逻辑模式。
2.看懂书上算法,参考实验程序编出程序上机调试。
3.参考书上的程序,编写建立链表存储多项式,并实现两多项式相加。
四、代码实现:1.# include<stdio.h># include<stdlib.h>typedef struct Polynode{int coef;int exp;Polynode *next;}Polynode,* Polylist;Polylist polycreate(){Polynode * head,*rear,*s;int c,e;head=(Polynode *)malloc(sizeof(Polynode)); rear=head;scanf("%d,%d",&c,&e);while(c!=0){s=(Polynode *)malloc(sizeof(Polynode));s->coef=c;s->exp=e;rear->next=s;rear=s;scanf("%d,%d",&c,&e);}rear->next=NULL;return (head);}void polyadd(Polylist polya,Polylist polyb) {Polynode *p,*q,*tail,*temp;int sum;p=polya->next;q=polyb->next;tail=polya;while(p!=NULL && q!=NULL){if (p->exp<q->exp){tail->next=p;tail=p;p=p->next;}else if (p->exp==q->exp){sum=p->coef+q->coef;if (sum!=0){p->coef=sum;tail->next=p;tail=p;p=p->next;temp=q;q=q->next;free(temp);}else{temp=p;p=p->next;free(temp);temp=q;q=q->next;free(temp);}}else{tail->next=q;tail=q;q=q->next;}}if(p==NULL)tail->next=p;elsetail->next=q;}void main(){Polynode *p;printf("请输入第一个多项式,次数从低到高:\n"); Polylist A=polycreate();printf("\n多项式创建完成!\n");printf("\n请输入第二个多项式,次数从低到高:\n"); Polylist B=polycreate();printf("\n多项式创建完成!\n\n");polyadd(A,B);p=A->next;while(p!=NULL){printf("[%d %d] ",p->coef,p->exp);p=p->next;}printf("\n\n");}2.# include<stdio.h># include<stdlib.h>typedef struct Node{char data;struct Node * next;}Node,* Linklist;void Initlist(Linklist *L){*L=(Linklist)malloc(sizeof(Node));(*L)->next=NULL;}void CreateFromHead(Linklist L){Node *s;char c;int flag=1;while(flag){c=getchar();if (c!='$'){s=(Node *)malloc(sizeof(Node));s->data=c;s->next=L->next;L->next=s;}else flag=0;}}void Reverselist(Linklist L){Linklist p,q;p=L->next;L->next=NULL;while(p!=NULL){q=p->next;p->next=L->next;L->next=p;p=q;}}void main (){Linklist p;Linklist L;Initlist(&L);printf("Please input datas:\n");CreateFromHead(L);p=L;while (p->next!=NULL){p=p->next;printf("%c ",p->data);}Reverselist(L);printf("\n\n");}五:结果验证:1.2。
多项式相加数据结构

多项式相加数据结构多项式相加是一种常见的数学操作,它在数据结构中也有广泛的应用。
本文将介绍多项式相加的概念、实现方法以及应用场景。
## 一、多项式相加的概念多项式是由常数项和一系列幂次项组成的代数表达式,形如:P(x) = a0 + a1x + a2x^2 + ... + anx^n其中,ai为系数,x为变量,n为最高次数。
多项式相加即将两个或多个多项式相加得到一个新的多项式。
## 二、多项式相加的实现方法多项式相加的实现方法有多种,常见的有数组表示法、链表表示法和稀疏矩阵表示法。
1. 数组表示法:将多项式的系数存储在一个数组中,数组下标表示幂次,数组元素表示系数。
2. 链表表示法:将多项式的每一项用链表的形式连接起来,每个节点包含系数和幂次信息。
3. 稀疏矩阵表示法:对于稀疏的多项式,只存储非零项的信息,可以用矩阵的形式表示。
不同的表示方法适用于不同的场景,选择合适的实现方法可以提高多项式相加的效率和灵活性。
## 三、多项式相加的应用场景多项式相加在实际应用中有很多场景,以下列举几个常见的应用场景:1. 数据压缩:在某些情况下,数据具有稀疏性,多项式相加可以将稀疏数据压缩为较小的存储空间,减少数据传输和存储成本。
2. 图像处理:图像的滤波操作可以看作是将图像的像素值与一个多项式进行相加的过程,通过调整多项式的系数可以实现不同的滤波效果。
3. 信号处理:信号可以表示为一个多项式的形式,多项式相加可以实现信号的叠加和混合,用于音频合成、语音识别等应用。
4. 机器学习:在机器学习算法中,多项式相加可以用于特征工程,通过将不同特征的多项式进行相加,得到新的特征表示,提高模型的拟合能力。
## 四、总结多项式相加是一种常见的数学操作,在数据结构中有广泛的应用。
本文介绍了多项式相加的概念、实现方法和应用场景,并提到了多项式相加在数据压缩、图像处理、信号处理和机器学习等领域的重要性。
选择合适的实现方法和应用场景可以提高多项式相加的效率和灵活性,进而推动相关领域的发展和应用。
c++一元多项式相加减 链表

C++一元多项式相加减链表一、介绍1. 什么是一元多项式一元多项式是指只含有一个变量的多项式,例如3x^3 + 2x^2 - 5x + 7。
2. 链表的概念链表是一种数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
3. 本文内容本文将介绍如何使用C++实现一元多项式的相加和相减运算,同时利用链表来存储和操作多项式的数据。
二、实现思路1. 链表的设计我们可以设计一个节点类来表示多项式的每一项,节点包括系数和指数两个成员变量,同时包括一个指针指向下一个节点。
2. 多项式的输入和输出用户可以逐项输入多项式的系数和指数,也可以将多项式输出至屏幕或文件。
3. 多项式的相加和相减我们需要同时遍历两个多项式的链表,根据指数的大小进行相应的相加或相减操作,并将结果存储到一个新的链表中。
三、代码实现1. 定义节点类```class Node {public:int coefficient; // 系数int exponent; // 指数Node* next; // 指向下一个节点的指针};```2. 多项式的输入```void inputPolynomial(Node* &head) {// 逐项输入多项式的系数和指数,并将其存储为一个链表 }```3. 多项式的输出```void outputPolynomial(Node* head) {// 遍历链表,并将多项式的每一项输出至屏幕或文件}```4. 多项式的相加```Node* addPolynomial(Node* head1, Node* head2) {// 遍历两个链表,根据指数的大小进行相应的相加操作,并将结果存储到一个新的链表中}```5. 多项式的相减```Node* subtractPolynomial(Node* head1, Node* head2) {// 遍历两个链表,根据指数的大小进行相应的相减操作,并将结果存储到一个新的链表中}```四、示例代码1. 主函数```int main() {Node* head1 = nullptr;Node* head2 = nullptr;Node* result = nullptr;// 输入第一个多项式inputPolynomial(head1);// 输入第二个多项式inputPolynomial(head2);// 输出两个多项式cout << "First polynomial: ";outputPolynomial(head1);cout << "Second polynomial: ";outputPolynomial(head2);// 计算两个多项式的和result = addPolynomial(head1, head2);cout << "Sum of two polynomials: ";outputPolynomial(result);// 计算两个多项式的差result = subtractPolynomial(head1, head2); cout << "Difference of two polynomials: "; outputPolynomial(result);return 0;}```五、总结本文介绍了如何使用C++实现一元多项式的相加和相减运算,并利用链表来存储和操作多项式的数据。
链表线性结构(多项式的加减乘除)

哈尔滨工业大学计算机科学与技术学院实验报告课程名称:数据结构与算法课程类型:必修实验项目:线性结构及其应用实验题目:多项式的加减乘除和特定值带入实验日期:2017/11/5班级:1603001学号:**********姓名:***一、实验目的设计线性表的链式存储结构,并实现一元多项式的代数运算。
二、实验要求及实验环境(1)实验要求:以链表存储一元多项式,在此基础上完成对多项式的代数操作。
1.能够输入多项式(可以按各项的任意输入顺序,建立按指数降幂排列的多项式)和输出多项式(按指数降幂排列),以文件形式输入和输出,并显示。
2.能够计算多项式在某一点 x=x0 的值,其中 x0 是一个浮点型常量,返回结果为浮点数。
3.能够给出计算两个多项式加法、减法、乘法和除法运算的结果多项式,除法运算的结果包括商多项式和余数多项式。
4.要求尽量减少乘法和除法运算中间结果的空间占用和结点频繁的分配与回收操作。
(提示:利用循环链表结构和可用空间表的思想,把循环链表表示的多项式返还给可用空间表,从而解决上述问题)。
(2)实验环境:windows下的CB;三、设计思想(本程序中的用到的所有数据类型的定义,主程序的流程图及各程序模块之间的调用关系)1.逻辑设计:struct polynode{int coef;int exp;struct polynode * link;};//建立链表typedef struct polynode poly;poly* Attch(int c,int e,poly *d);//多项式插入poly *newPoly();//新链表poly *padd(poly *p1,poly *p2);//多项式加法poly *pmul(poly *p1,poly *p2);//乘法poly *inputPoly();//输入多项式poly *psub(poly *p1,poly *p2);//减poly *pdiv(poly *p1,poly *p2);//除poly *inputPoly1();double caculate(double x,poly *p);//计算多项式void sortPoly(poly *p);//多项式排序void outputPoly(poly*p);//输出多项式void delPoly(poly*p);//清空多项式2.物理设计:四、测试结果五、经验体会与不足不能连续输入多个多项式函数设计不够简洁算法过于直接简单加注释后修改代码方便六、附录:源代码(带注释)#include <stdio.h>#include <stdlib.h>struct polynode{int coef;int exp;struct polynode * link;};//建立新链表typedef struct polynode poly;poly* Attch(int c,int e,poly *d);//插入链表poly *newPoly();//建立新链表poly *padd(poly *p1,poly *p2);//加法poly *pmul(poly *p1,poly *p2);//乘法poly *inputPoly();//输入多项式poly *psub(poly *p1,poly *p2);//减法poly *pdiv(poly *p1,poly *p2);//除法poly *inputPoly1();//输入double caculate(double x,poly *p);//计算void sortPoly(poly *p);//排序void outputPoly(poly*p);//输出多项式void delPoly(poly*p);//除法void Insert(poly *p,poly *h){if(p->coef==0)free(p);else{poly *q1,*q2;q1=h;q2=h->link;while(q2&&p->exp<q2->exp){q1=q2;q2=q2->link;}/*判断两个指数是否相等*/if(q2&&p->exp==q2->exp){q2->coef+=p->coef;free(p);if(!q2->coef){q1->link=q2->link;free(q2);}}/*相等就加系数*/else{p->link=q2;q1->link=p;}}/*不等就插在后面*/}int main(){poly *p1,*p2,*padd1,*psub1,*pmul1; p1=newPoly();printf("第一个多项式\n");p1->link=inputPoly();outputPoly(p1);p2=newPoly();printf("第二个多项式\n");p2->link=inputPoly1();outputPoly(p2);padd1=newPoly();pmul1=newPoly();psub1=newPoly();padd1->link=padd(p1,p2);printf("padd\n");outputPoly(padd1);psub1->link=psub(p1,p2);printf("psub\n");outputPoly(psub1);pmul1->link=pmul(p1,p2);printf("pmul\n");outputPoly(pmul1);printf("输入x的值!");int x;scanf("%d",&x);x=caculate(x,p1);printf("%d\n",x);pdiv(p1,p2);return 0;}poly *newPoly(){poly *x;x=(poly*)malloc(sizeof(poly)); x->link=NULL;x->coef=0;x->exp=0;return x;}poly* Attch(int c,int e,poly *d) {poly *x;x=newPoly();x->coef=c;x->exp=e;d->link=x;return x;}poly *padd(poly *p1,poly *p2){poly *a, *b,*c,*d,*p;c=newPoly();d=c;p=c;a=p1->link;b=p2->link;while(a!=NULL&&b!=NULL){if(a->exp>b->exp)//如果a的系数大于b把a先输入 {c=Attch(a->coef,a->exp,c);a=a->link;}else if(a->exp<b->exp)//小于相反{c=Attch(b->coef,b->exp,c);b=b->link;}else//相等{c=Attch(b->coef+a->coef,a->exp,c);a=a->link;b=b->link;}}/*a b比较完成开始遍历剩下的未插入的*/while(a!=NULL){c=Attch(a->coef,a->exp,c);a=a->link;}while(b!=NULL){c=Attch(b->coef,b->exp,c);b=b->link;}c->link=NULL;d=d->link;p->link=NULL;delPoly(p);return d;}poly *psub(poly*p1,poly*p2)//加和减思路相同,b的系数得输入相反值{poly *a, *b,*c,*d,*p;c=newPoly();d=c;p=c;a=p1->link;b=p2->link;while(a!=NULL&&b!=NULL){if(a->exp>b->exp){c=Attch(a->coef,a->exp,c);a=a->link;}else if(a->exp<b->exp){c=Attch(b->coef*(-1),b->exp,c);b=b->link;}else{if((a->coef-b->coef)>0){c=Attch(a->coef-b->coef,a->exp,c); a=a->link;b=b->link;}else{a=a->link;b=b->link;}}}while(a!=NULL){c=Attch(a->coef,a->exp,c);a=a->link;}while(b!=NULL){c=Attch(b->coef*(-1),b->exp,c);b=b->link;}c->link=NULL;d=d->link;p->link=NULL;delPoly(p);return d;}/*乘法,先用第一个链表的第一个数据乘以第二个链表里的所有值,储存在新的链表中,之后遍历一中所有的值,最后把这些多项式加在一起。
用链表实现多项式及其操作

通信韩若冰222010315220106实验项目:线性表及其应用实验内容:用单链表存储多项式;实现多项式的输出显示、相加、相乘、求导、求值运算。
算法设计与程序实现:由于存储多项式需要存储系数和指数,且其指数变化范围可能很大如果用顺序表就会浪费很大的空间,用单链表存取指针域,和数据域(系数和指数)就会节省很大空间。
要想实现多项式的显示,相加,相乘,求导,求值运算,首先得创建函数以实现上述功能,然后再在主函数中调用上述函数以得到运行结果。
算法描述:(实验内容的核心算法)创建链表:首先创建空表,然后将每个结点用尾插法依次插入。
每一项多项式的组成部分(系数和指数)输出程序:此程序需要遍历整个链表,通过判断p->next的系数的正负来确定输出“+”还是“-”很容易出现错误。
多项式相加:这个程序需要按照幂的排列顺序依次遍历寻找一个多项式与另一个多项式指数相同的,将其系数相加比较简单。
该程序写成升幂比较,其中可能出现如A多项式的前几项都比B中的指数小,那么以一个pre为头结点的链表先将其穿起来,找到相等的进行运算再串起来,最后可能会有链表剩余的指数更大的项不能和另一个相加再将剩余的串起来。
(第一项要先串起来,因为第一项之前没有多项式不用判断+ —号)多项式相乘:此程序需要循环语句,即将一个多项式的每一项分别和另一个多项式相乘,依次调用多项式相加的程序叠加起来。
多项式求导:需要依次将多项式的每一项的系数和指数相乘,指数减1,形成一个链表多项式求值:需要有x的幂次的表示,C语言不能识别“^”,所以需要用一个循环实现x^exp相乘的结果,容易出错核心程序:运行结果:实验总结:本次试验做了很长时间,也出现了很多错误。
总起来说有以下几种错误:1.输入错误:中英文状态下输入错误,其中还有运行时在中文状态下输入数据回车后就不能输了,应在英文状态下输入data , data↙2.多项式表示需要判断下一个多项式系数是正还是负然后分别写+, —(fabs),但是第一项必须先输出,因为第一项不需要写+ —号3.多项式相加,要注意写的程序是怎么比较的,升幂的话则p->exp < q->exp 则把p结点指数小的先穿起来。
一元多项式的单链表表示及其运算

一元多项式的单链表表示及其运算
一元多项式的单链表表示是将多项式的每一项以节点的形式存储在链表中,链表的每个节点包含两个数据域,一个表示系数,一个表示指数。
链表中的节点按照指数从大到小的顺序排列,这样可以方便进行多项式的运算。
例如,多项式2x^3 + 3x^2 + 4x + 5可以表示为如下的单链表:
5 -> 4 -> 3 -> 2 -> NULL
其中,每个节点的第一个数据域表示系数,第二个数据域表示指数。
针对这个单链表表示的多项式,可以进行多项式的加法、减法、乘法等运算。
多项式的加法运算可以通过遍历两个链表,按照指数的大小逐个比较,并将相同指数的项系数相加,将不同指数的项加入到结果链表中。
多项式的减法运算可以通过将减数链表中的每个项的系数取相反数,然后调用加法运算。
多项式的乘法运算可以通过遍历两个链表,计算每一项的系数和指数的乘积,将结果项按照指数从大到小的顺序加入到结果链表中。
除了基本的加法、减法和乘法运算外,还可以对多项式进行求导、求积分等运算。
数据结构:链表的应用-求两个一元多项式之和

!= NULL && p2 == NULL) || (p1 == NULL && p2 != NULL)) || p1 != NULL || p2 != NULL) { if(p1 == NULL && p2 != NULL) {
Pnode pnew = (Pnode)malloc(sizeof(Pnode)); if(NULL == pnew) { exit(-1); }
printf("\n"); }
int main(void) {
Pnode p1,p2; int a,b; char x;
printf("输入未知字母(如 x,y,z 等):"); scanf("%c",&x);
精美文档
5
printf("输入第一个多项式的项数:"); scanf("%d",&a); p1 = init(a);
printf("输入幂数:"); scanf("%d",&b); pnew->mi = b;
精美文档
2
ptail->next = pnew; pnew->next = NULL;
ptail = pnew; }
return phead; }
Pnode jia(Pnode p1,Pnode p2) {
构建中止 未命名 2: 15 个错误, 1 个警告
2.最后一次调试
--------------------配置: mingw5 - CUI Debug, 编译器类型: MinGW--------------------
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
链表及其多项式相加一、实验目的1.了解线性表的链式存储结构,熟练掌握链表。
2.了解作为链表的多项式存贮方式。
3.熟悉掌握多项式加法的算法。
#include<stdio.h>#include <malloc.h>typedef struct linkline{int coef;int exp;struct linkline *next;}line;line *creat(){ /*建立多项式列表*/int n;line *head;line *p1,*p2;n=0;printf("(输入的数必须是整数,指数须从小到大依次输入,系数为零表示多项式结束)\n");p1=p2=(line *)malloc(sizeof(line)); /*开辟一个新单元*/scanf("%d%d",&p1->coef,&p1->exp); /*录入多项式*/if (p1->coef==0) head=0;else{while(p1->coef!=0){n++;if (n==1) head=p1;else p2->next=p1;p2=p1;p1=(line *)malloc(sizeof(line));scanf("%d%d",&p1->coef,&p1->exp);}p2->next=0;}return(head);}/* 以下是输出多项式的函数*/void print(line *p){line *p0;p0=p;printf(" ");do{printf("%dx的%d次幂",p0->coef,p0->exp);p0=p0->next;if(p0!=0) printf("+");}while(p0!=0);else printf(" 空多项式!!");printf("\n");}int compare(int m,int n) /*比较两个整数的大小的函数*/ {int j;if (m<n) j=-1;if (m==n) j=0;if (m>n) j=1;return(j);}void freeNode(line *w1) /* 释放一个表中的所有结点*/ {line *w2;w2=w1->next;while(w1){free(w1);w1=w2;w2=w2->next;}}line *AddLine(line *ha,line *hb) /*两个非空多项式相加*/ {line *la,*lb,*lc;int a,b,sum;lc=ha;la=ha;lb=hb;if ((ha==0)&&(hb!=0)) return(hb);while ((la!=0)&&(lb!=0)){a=la->exp; b=lb->exp;switch( compare(a,b) ) /*比较当前结点指数的大小*/ {{ ha=la; /*只修改la的指针*/la=la->next;break;}case 0:{ sum=la->coef+lb->coef;if(sum!=0){ /* 将其不为零的系数和保存*/la->coef=sum;ha=la; la=la->next;} /* end if*/else{ /* 分别删除系数和为零的对应的两个结点*/if (lc==la) {lc=lc->next;ha=lc;la=ha;} /* 刚开始时特殊处理头结点*/ else{ha->next=la->next;la=ha->next;}} /*end else*/hb=lb;lb=lb->next;break;}case 1:{ /* 将指数小的项插入到la的前部*/hb=lb->next;if(ha==la) {lc=lb;lb->next=ha;la=la->next; }else{ha->next=lb;lb->next=la;ha=la;la=la->next;}lb=hb->next;break;}} /*end swtich*/} /*end while*/if (lb!=0) ha->next=lb;return(lc);} /*end AddLine *//*************以下为主程序**************/main(){line *la,*lb,*lc;printf("请输入多项式La: ");la=creat();printf("请输入多项式Lb: ");lb=creat();printf("多项式La:\n");print(la);printf("多项式Lb:\n");print(lb);printf("多项式La与Lb的和是: \n");lc=AddLine(la,lb);print(lc);freeNode(lb);}二、实验原理顺序存储的线性表有一些弱点,其一,插入与删除元素需要大量移动元素;其二,预先分配存储空间时必须按最大的空间来分配。
其三,表长难以扩充。
所以,必须引入链式存储结构。
链式存储结构的特点是用一组任意的存储单元存储线性链表的数据元素,与顺序表的区别在于链式存储的存储单元可以是连续的,也可以是不连续的。
为了实现这种结构,链表采取由两部分信息组成数据元素ai的存储映像,称为结点。
结点包括两个域,其中存储数据信息的域称为数据域,存储直接后继信息的称为指针域。
指针域中存储的信息叫做指针或链。
这样,n个结点链接成一个链表,即为线性表(a1,a2,a3,···,an)。
符号多项式的操作,已经成为表处理的典型用例,在数学上,一个一元多项式pn(x)可以按升幂写成:pn(x)=p0+p1·x+p2·(x的2次幂)+···+pn·(x的n次幂)。
它由n+1个系数唯一确定。
因此,在计算机里,它可用一个线性表P来表示:P=(p0,p1,p2,···,pn), 显然,此种表示仅适于顺序存储结构,在通常的应用中,多项式的次数变化很高且很大,将造成内存的很大浪费。
三、实验要求1.参照书上的原理说明分析程序,深入理解链表的物理存储模式和逻辑模式。
2.看懂书上算法,参考实验程序编出程序上机调试。
3.参考书上的程序,编写出链表的主程序。
//顺序表的建立及插入#include <stdio.h>#include <malloc.h>#include <stdlib.h>#define ListSize 100 //表最大长度//结构定义typedef struct{int node[ListSize]; //存放表结点int length; //当前表长度}List;//插入元素insertList(List *list, int e){int i=list->length-1; //先将i指定为最后一项if(i>=ListSize-1) //表已经达到最大长度ListSize {printf("表已满,不能增加新的项!\n");exit(0);}else{while(i>=0 && list->node[i]>e) //初始状态指向最后一项,当指向的元素大于所需查询的元素时,往前继续搜索{list->node[i+1]=list->node[i]; /*后移*/i--;}list->node[i+1]=e; //插入元素list->length++; //记录表长度的项加一}}//创建初始顺序表List *createList(int size){int i,data;List *list;list=(List *)malloc(sizeof(List)); //分配空间printf("请输入顺序表中的整数(可以不是从小到大排列),元素个数为%d\n",size);//为了确保排列顺序,采用一个一个插入顺序表的方法scanf("%d",&data); //输入第一个元素list->length=1;list->node[0]=data; //插入第一个数据i=1;while(i<size){scanf("%d",&data);insertList(list,data); //采用插入元素的方式输入后续元素,这样做是为了确保元素按顺序排列i++;}return list;}//打印顺序表中的现有元素printList(List *list){int i=0;printf("目前顺序表中有%d个元素\n",list->length);while(i<list->length){printf("%4d",list->node[i]);i++;}printf("\n");}void main(){int num,e;List *list;printf("请输入初始顺序表的元素个数:(小于%d)\n",ListSize);scanf("%d",&num);list=createList(num);printList(list);printf("插入元素,请输入需要插入的数:\n");scanf("%d",&e);insertList(list,e);printList(list);}数组的逆序#include<stdio.h>int main(){int *p,i;int data[10],data2[10];printf("please input ten number in the array:\n"); for(i=0; i<10; i++){scanf("%d",&data[i]);}p = &data[0];for (i=9; i>=0; i--){data2[i] = *(p + i);printf("%d ",data2[i]);}printf("\n");return 0;}//利用栈来实现单链表的逆序#include <stdio.h># include<stdlib.h>#define stacksize 100typedef int datatype;typedef struct{datatype data[stacksize];int top;}seqstack;typedef struct node{datatype data;struct node *next;}listnode;typedef listnode *linklist;linklist head;linklist p;int count;linklist creatlist(int n){linklist head;listnode *p1,*p2;int i;head=(linklist)malloc(sizeof(listnode));head->next=NULL;p2=head;printf("Please input the records of the chain!\n"); for(i=0;i<n;i++){p1=(linklist)malloc(sizeof(listnode));scanf("%d",&p1->data);p1->next=p2->next;p2->next=p1;p2=p1;}return (head);}void print(linklist head,int n){if(head==NULL)printf("list null!\n");printf("Now these %d records are:\n",n);p=head->next;printf("%4d",p->data);count=1;while(p->next!=NULL){count++;p=p->next;printf("%4d",p->data);if(!(count%10))printf("\n");}}datatype push(seqstack *s,int x){if(s->top==stacksize-1)printf("The stack is overflow!\n");elses->data[++s->top]=x;}datatype pop(seqstack *s){if(s->top==-1)printf("the stack is empty!\n");elsereturn (s->data[s->top--]);}datatype deleted(linklist head){datatype temp;linklist p;p=head->next;temp=(p->data);head->next=p->next;free(p);return (temp);}void invertedlist(linklist head,int n){seqstack s;int i,j,temp;s.top=-1;for(i=0;i<n;i++){temp=deleted(head);push(&s,temp);}for(i=0;i<n;i++){temp=pop(&s);printf("%5d",temp);if(!((i+1)%10))printf("\n");}printf("\n");}main(){linklist head;int n;printf("Please input the value of n:\n");scanf("%d",&n);head=creatlist(n);print(head,n);printf("\n");printf("After inverting,the records of the chain are:\n");invertedlist(head,n);system("pause");return 0;}栈满的时候。