/*
编译器:Dev-c++ 5.4.0
文件名:Polynomial.cpp
代码版本号:1.0
时间:2015年10月9日21:53:26
*/ /*
总结:
1.结构体指针指向的区域要手动分配内存
2.反复使用的代码封装成函数
*/
#include <stdio.h>
#include <stdlib.h> #define ERROR 0
#define OK 1
#define TRUE 1
#define FALSE 0
#define OVERFLOW -2 typedef int Status;
typedef struct
{
float coef;
int expn;
}term, ElemType; typedef struct LNode
{
ElemType *data;
struct LNode *next;
}LNode,*Link,*Position; typedef struct _LinkList
{
Link head,tail;
int len;
}LinkList; /*多项式的初始化,建立头结点*/
Status initPolynomial(LinkList *l){
Link p;
p=(Link)malloc(sizeof(LNode));
if(!p)
exit(OVERFLOW); p->next=NULL;
(*l).head=(*l).tail=p;
(*l).len=;
printf("多项式初始化成功\n");
return OK;
} /*判断多项式是否为空表*/
bool listEmpty(LinkList *l){
return !l->len;
} /*整数比较函数*/
int comp(int a1,int a2)
{
if(a1>a2)
return ;
else
if(a1==a2)
return ;
else
return -;
} /*判断新节点的指数,定位节点在多项式中是否已经存在*/
int locateLNode(LinkList *l,LNode *p){ LNode *q=((*l).head)->next;
// if(q) printf("q->data->expn为%d,p->data->expn为%d",q->data->expn,p->data->expn);
while(q&&(q->data->expn!=p->data->expn))
{
q=q->next; }
// printf("地址%p\n",q);
if(!q)
return ;
else
{
return ;
}; }
/*销毁多项式*/
Status destroyPoly(LinkList *l){
LNode *p;
LNode *q=l->head;
while(q)
{
p=q->next;
free(p);
q=q->next;
}
free(l->head); return OK;
}
/*创建一个结点*/
LNode *createLNode(){
LNode *q=(LNode*)malloc(sizeof(LNode));
q->data=(ElemType*)malloc(sizeof(ElemType));
return q;
} /*case 新节点的指数相等时只需系数相加*/
Status lNodePlus(LinkList *l,LNode *p){ LNode *q=((*l).head)->next;
while(q && q->data->expn!=p->data->expn)
{
q=q->next; }
if(!q)
return OK;
else
{ q->data->coef+=p->data->coef;
return OK;
}
}
/*case 插入新节点*/
Status insertLNode(LinkList *l,LNode *p){ LNode *q=((*l).head)->next; LNode *qian=(*l).head;//q的前一个节点
while(q&&q->data->expn < p->data->expn){ qian=q;
q=q->next;
}
p->next=q;
qian->next=p;
l->len++;
return OK;
}
/*all 插入节点*/
Status LNodePlus(LinkList *l,LNode *p){
if(locateLNode(l,p)){
lNodePlus(l,p);//指数相等时只需要系数相加
}
else{
insertLNode(l,p);
}
return OK;
} /*创建多项式m项的系数和指数*/
Status createPolynomial(LinkList *l,int m){ float coef; //系数coefficient
int expn;//指数exponent
for(int i=;i<=m;i++){
printf("\n请输入第%d个系数和指数",i);
LNode *p=createLNode();
scanf("%f",&(p->data->coef));
scanf("%d",&(p->data->expn));
LNodePlus(l,p);
}
printf("多项式创建完毕\n");
} /*循环输出多项式的系数和指数*/
Status polyTraverse(LinkList *l)
{
LNode *q=((*l).head)->next;
printf("\n该多项式有%d个项\n",l->len);
while(q)
{
printf("%fx^%d+",q->data->coef,q->data->expn);
q=q->next;
}
return OK;
} /*多项式的加法*/
LinkList addPoly(LinkList *l1,LinkList *l2){ LNode *q1=((*l1).head)->next;
LNode *q2=((*l2).head)->next;
LinkList l;
initPolynomial(&l);
LNode* p=l.head;//p指向多项式最后一项
while(q1 && q2){ switch(comp(q1->data->expn,q2->data->expn))
{
case :{
LNode *q=createLNode(); q->data->coef=q2->data->coef;
q->data->expn=q2->data->expn; q->next=NULL;
p->next=q;
p=p->next; q2=q2->next;
l.len++;
break;
}
case :{
LNode *q=createLNode(); q->data->coef=q1->data->coef+q2->data->coef;
q->data->expn=q1->data->expn; q->next=NULL;
p->next=q;
p=p->next; q1=q1->next;
q2=q2->next;
l.len++;
break;
}
case -:{
LNode *q=createLNode(); q->data->coef=q1->data->coef;
q->data->expn=q1->data->expn; q->next=NULL;
p->next=q;
p=p->next; q1=q1->next;
l.len++;
break;
}
}
} while(q1){
LNode *q=createLNode();
q->data->coef=q1->data->coef;
q->data->expn=q1->data->expn;
q->next=NULL;
p->next=q;
p=p->next;
q1=q1->next;
l.len++;
} while(q2){
LNode *q=createLNode();
q->data->coef=q2->data->coef;
q->data->expn=q2->data->expn;
q->next=NULL;
p->next=q;
p=p->next;
q2=q2->next;
l.len++;
} return l;
} /*多项式系数取反*/
Status getOpposite(LinkList *l){
LNode *q=l->head->next;
while(q)
{
q->data->coef=(-(q->data->coef));
q=q->next;
}
return OK;
}
/*多项式的减法*/
LinkList subtractPoly(LinkList *l1,LinkList *l2){
getOpposite(l2);
LinkList l=addPoly(l1,l2);
getOpposite(l2);
return l;
} /*多项式的乘法*/
LinkList multiplyPoly(LinkList *l1,LinkList *l2){ LinkList l;
initPolynomial(&l);
LNode *q1=l1->head->next;
LNode *q2=l2->head->next;
while(q1){
q2=l2->head->next;
while(q2){
LNode *q=createLNode();
q->data->coef=q1->data->coef*q2->data->coef;
q->data->expn=q1->data->expn+q2->data->expn;
printf("q2->data->coef为%f\n",q2->data->coef);
LNodePlus(&l,q);
q2=q2->next;
}
q1=q1->next;
}
return l;
} int main(){
LinkList l1,l2; /*int n;
LinkList l3;
initPolynomial(&l3);
printf("请输入多项式的term个数:\n");
scanf("%d",&n);
createPolynomial(&l3,n);
polyTraverse(&l3);
destroyPoly(&l3);
printf("删除后遍历:\n");
polyTraverse(&l3);*/ int m;
initPolynomial(&l1);
initPolynomial(&l2);
printf("请输入多项式的term个数:\n");
scanf("%d",&m);
createPolynomial(&l1,m);
createPolynomial(&l2,m);
polyTraverse(&l1);
polyTraverse(&l2);
LinkList L3=addPoly(&l1,&l2);
printf("多项式相加后\n");
polyTraverse(&L3);
LinkList L4=subtractPoly(&l1,&l2);
printf("多项式相减后\n");
polyTraverse(&L4);
LinkList L5=multiplyPoly(&l1,&l2);
printf("多项式相乘后\n");
polyTraverse(&L5);
system("pause");
return ;
}

一元多项式Polynomial的C语言实现的更多相关文章

  1. 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加

    一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...

  2. 一元多项式的表示及相加(抽象数据类型Polynomial的实现)

    // c2-6.h 抽象数据类型Polynomial的实现(见图2.45) typedef struct // 项的表示,多项式的项作为LinkList的数据元素 { float coef; // 系 ...

  3. 链表一元多项式计算器的实现(Java语言描述)

    链表的经典应用,程序在多项式相加同类项合并还有小的瑕疵,有待改进. 代码如下: package 一元多项式计算器; public class PolyNode { private double a; ...

  4. 1010 一元多项式求导 (25 分) C语言

    设计函数求一元多项式的导数.(注:x​n​​(n为整数)的一阶导数为nx​n−1​​.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数).数字间以空格分隔. ...

  5. 一元多项式的乘法与加法运算(C语言)

    输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方 ...

  6. C语言实现一元多项式求积

    #include <stdio.h>#include <stdlib.h>#include <math.h>typedef struct Node{    int ...

  7. 一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作(1)

    数学中一元n次多项式可表示成如下的形式:  Pn(x)=p0+p1x+p2x^2+…+pnx^n     (最多有 n+1 项,n +1 个系数唯一确定她)      (1)请设计一套接口用以表示和操 ...

  8. 数据结构(c语言版)代码

    第1章  绪论       文档中源码及测试数据存放目录:数据结构\▲课本算法实现\▲01 绪论  概述        第一章作为绪论,主要介绍了数据结构与算法中的一些基本概念和术语.对于这些概念术语 ...

  9. 小白专场-多项式乘法与加法运算-c语言实现

    目录 一.题意理解 二.求解思路 三.多项式的表示 3.1 数组 3.2 链表 四.程序框架搭建 五.如何读入多项式 六.如何将两个多项式相加 七.如何将两个多项式相乘 八.如何将多项式输出 一.题意 ...

随机推荐

  1. at命令

    在windows系统中,windows提供了计划任务这一功能,在控制面板 -> 性能与维护 -> 任务计划, 它的功能就是安排自动运行的任务. 通过'添加任务计划'的一步步引导,则可建立一 ...

  2. 安装SQL SERVER2005时,需要win7下安装IIS,记录下

    安装SQL server2005 时,需要先安装IIS,这里描述win7系统下配置IIS的方法. 虽然很多文章都有写过,这里只是重复一下 关键是IIS组件全都勾选上,如果没有全部勾选上,IIS组件没有 ...

  3. 谈谈托管代码、IL、CLR、ISAPI?

    什么是托管代码?       托管代码是可以使用20多种支持Microsoft .NET Framework的高级语言编写的代码,这些语言包括:C#, J#, Microsoft Visual Bas ...

  4. CentOS安装搜狗词库

    中文输入使用ibus-pinyin. 在ibus-pinyin里使用搜狗词库 # wget http://hslinuxextra.googlecode.com/files/sougou-phrase ...

  5. HDU_2147——组合博弈,转换为P/N图,然后找规律

    Problem Description Recently kiki has nothing to do. While she is bored, an idea appears in his mind ...

  6. C++ STL之pair常用指令

    只记载本人在ACM中常用的函数. pair<first, second>,将两个数据组合成一个数据.在其他stl(如map),函数需要传回两个值时可能会用到. 1.初始化 #include ...

  7. 12、ERP设计之 系统基础管理(BS)- 模块与菜单的关联

    ShareERP2013-10-03 模块:具有功能设计.权限绑定,链接用户菜单与系统的重要桥梁. 菜单:是用于显示与用户交互的重要入口,更是导航系统的舵手,所以它的设计直接影响到用户体验. 菜单可能 ...

  8. UVALive 4959 Jumping monkey

    题意就是: 一个猎人在森林里捕猎. 然后有只猴子,喜欢躲树的后边,猎人看不见它 然后给出了一张图,表示有哪些树是相邻的. 数据保证任意图中两个树都可以直接或间接的到达 猎人有一个枪,每次他可以选择一颗 ...

  9. java笔记13之成员变量与局部变量

    成员变量和局部变量的区别 1在类中的位置不同 局部变量:类的方法体内 成员变量:类的方法之外 2内存的不同位置 局部变量:在栈内存中 成员位置:在堆内存 3生命周期不同 局部变量:随着方法的调用而存在 ...

  10. SKTransition类

    继承自 NSObject 符合 NSObject(NSObject) 框架  /System/Library/Frameworks/SpriteKit.framework 可用性 可用于iOS 7.0 ...