多项式的规范化,采用单链表,使用C语言实现,gcc调试通过。
//该程序是为了将无序的、不规范的多项式进行规范化而写的。
#include<stdio.h>
#include<stdlib.h>
#define N 8 //指明多项式数据项的数目
int GetLength(); //获得单链表的长度
void Print(); //打印出单链表的节点数据
typedef struct multinomialnode //定义存储多项式数据项的节点的结构体
{
int coefficient,power; //定义系数和幂
struct multinomialnode *next;
}node;
node *Create(int num) //创建存储多项式的链表
{
int i;
node *head,*pointer,*tmp;
head=(node*)malloc(sizeof(node));
if(head!=NULL) pointer=head;
printf("请依次输入要处理的多项式元素的系数和幂:\n");
for(i=0;i<num;i++)
{
printf("请输入第 %d 个元素的系数和幂:\n",i+1);
tmp=(node*)malloc(sizeof(node));
if(tmp!=NULL)
{
scanf("%d%d",&tmp->coefficient,&tmp->power);
tmp->next=NULL;
pointer->next=tmp;
pointer=tmp;
}
}
return(head);
}
node *Standard(node *head) //对多项式进行规范化的过程
{
int i;
node *pointer,*pre,*cur,*tmp,*q;
pointer=head->next; //代表用于比较及合并相同幂的节点,也用于条件判断,控制循环
pre=pointer; //代表被比较的节点的上一个节点的指针,用于链接节点的操作,从而构造新的链表
cur=pointer->next; //代表被比较的节点,也用于条件判断,控制循环
while(pointer->next!=NULL) //合并无序多项式中具有相同幂的节点,并将被合并后的节点删除
{
while(cur!=NULL)
{
if(pointer->power==cur->power) //相等则合并,同时删除被合并过的节点
{
pointer->coefficient+=cur->coefficient; //合并具有相同幂的项的系数
q=cur;
cur=cur->next;
pre->next=cur;
free(q); //释放内存
}
else //不等则指向被比较的节点及其上一节点的指针均后移
{
cur=cur->next;
pre=pre->next;
}
}
pointer=pointer->next; //后移
pre=pointer; //重新初始化
cur=pointer->next; //重新初始化
}
Print(head); //打印出上面while以后构造成的多项式
for(i=0;i<GetLength(head);i++) //将上一步while完成以后得到多项式进一步规范化,使之按数据项的幂由大到小依次排列
{
pre=head; //代表指向当前节点的指针的上一指针,用于交换节点的操作
cur=head->next; //代表指向当前节点的指针,用于比较
tmp=cur->next; //代表指向当前节点的下一节点的指针,用于比较和条件判断
while(tmp!=NULL)
{
if(cur->power<tmp->power) //如果当前数据项的幂小于其后紧邻的数据项的幂,则交换两个节点在链表中的位置,然后改变指针使重新指向
{
pre->next=tmp;
cur->next=tmp->next;
tmp->next=cur;
pre=tmp;
tmp=cur->next;
}
else //如果条件相反的话,直接后移这三个指针
{
pre=pre->next;
cur=cur->next;
tmp=tmp->next;
}
}
}
return(head);
}
int GetLength(node *head) //获得单链表的长度
{
int i=0;
node *pointer;
pointer=head->next;
while(pointer!=NULL)
{
i++;
pointer=pointer->next;
}
return i;
}
void Print(node *head) //打印出单链表的节点数据
{
int i=0;
node *pointer;
pointer=head->next;
printf("\n新的多项式系数和幂表示如下:\n");
while(pointer!=NULL)
{
i++;
printf("第 %d 个数据元素的系数为:%d,幂为:%d\n",i,pointer->coefficient,pointer->power);
pointer=pointer->next;
}
}
int main()
{
node *multinomial;
multinomial=Create(N);
Print(multinomial);
multinomial=Standard(multinomial);
Print(multinomial);
return 0;
}
调试环境:Ubuntu Desktop 8.04.4 VI 7.1.138 GCC 4.2.4
QQ:81064483
E-mail:AllenNewOK@126.com
复习之用,不足之处,烦请高手们指点。< ^_^ >
分享到:
相关推荐
请实现求M(x)=Am(x)+Bn(x)、M(x)=Am(x)-Bn(x)、M(x)=Am(x)×Bn(x)以及计算M(x)=0的根,计算多项式在x处的值,求多项式M的导函数M,并将结果保存在文本文件中。 (3)多项式的输出形式为类数学表达式。例如,多项式...
利用c语言的链表结构,实现多项式的加、减、乘、除
C语言计算厄密多项式 例如,H3(2)的值是40。请编写一个递归函数,计算Hn(x)的值。你的函数应该与下面的原型匹配: int hermite( int n, int x); Hermite polynomials用于物理学和统计学。它们也可以作为递归练习在...
c语言链表实现两个一元递增多项式的相加,并输出其结果
数据结构(C语言)用单链表存储一元多项式并实现两个多项式的相加运算.doc
最近在学数据结构,讲完单链表后老师就布置了一个这样的答辩作业。代码附上啦,大多地方都添加了注释,要交作业的同学可以看一看。 实现要求: 1)两个一元稀疏多项式进行存储,并实现加法运算。 2)使用单链表的...
单链表的接本操作,有在单链表中插入,删除数据的功能,以及...1.单链表的数据结构的建立实现。 2.单链表元素结点插入操作实现。 3.单链表元素结点删除操作实现。 4.实现单链表的合并。 5.实现一元多项式的相加。
一元稀疏多项式简单计算器设计 数据结构
数据结构 C语言实现 多项式的相加
用C语言编写的多项式运算代码 满足数据结构课程要求
数据结构 C语言 动态链表 议员多项式的加减法 数据结构C语言 一元多项式的加减法算法实现 代码,用vs运行,已测试成功运行,
多项式拟合基线
语言:c++功能:数据结构以及多项式的计算优化数据结构,有用户体验的界面
此程序可以用链表实现多项式的加减乘除运算。
采用matlab多项式拟合数据,可以方便的设置拟合阶数,方便的的获得多项的系数
提供多项式的加减乘操作,数据存放在TXT文件中。
《数据结构》一书中单元课后实验题:用c语言实现多项式乘法
Matlab多项式实现区域高程拟合,需要自己输数据
利用C语言中的链表实现一元多项式算法,十分实用,便于c爱好者学习链表结构。
严蔚敏 《数据结构》C语言版本第二章链表应用中有多项式加法的应用。本程序能对两个输入的多项式相加,并输出相加的结果。多项式可以一次性输入完成,并用(0,0)表示结束。