一元多项式Polynomial的C语言实现
/*
编译器: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语言实现的更多相关文章
- 数据结构算法C语言实现(六)---2.4一元多项式的表示及相加
一.简述 利用链表表示稀疏多项式,并基于之前的一些操作(编程实现上还是有所不同的)组合新的操作实现一元多项式的表示及相加. 二.ADT 抽象数据类型一元多项式的定义 ADT Polyomail{ 数据 ...
- 一元多项式的表示及相加(抽象数据类型Polynomial的实现)
// c2-6.h 抽象数据类型Polynomial的实现(见图2.45) typedef struct // 项的表示,多项式的项作为LinkList的数据元素 { float coef; // 系 ...
- 链表一元多项式计算器的实现(Java语言描述)
链表的经典应用,程序在多项式相加同类项合并还有小的瑕疵,有待改进. 代码如下: package 一元多项式计算器; public class PolyNode { private double a; ...
- 1010 一元多项式求导 (25 分) C语言
设计函数求一元多项式的导数.(注:xn(n为整数)的一阶导数为nxn−1.) 输入格式: 以指数递降方式输入多项式非零项系数和指数(绝对值均为不超过 1000 的整数).数字间以空格分隔. ...
- 一元多项式的乘法与加法运算(C语言)
输入格式: 输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数).数字间以空格分隔. 输出格式: 输出分2行,分别以指数递降方 ...
- C语言实现一元多项式求积
#include <stdio.h>#include <stdlib.h>#include <math.h>typedef struct Node{ int ...
- 一道 google曾出过的笔试题:编程实现对数学一元多项式的相加和相乘操作(1)
数学中一元n次多项式可表示成如下的形式: Pn(x)=p0+p1x+p2x^2+…+pnx^n (最多有 n+1 项,n +1 个系数唯一确定她) (1)请设计一套接口用以表示和操 ...
- 数据结构(c语言版)代码
第1章 绪论 文档中源码及测试数据存放目录:数据结构\▲课本算法实现\▲01 绪论 概述 第一章作为绪论,主要介绍了数据结构与算法中的一些基本概念和术语.对于这些概念术语 ...
- 小白专场-多项式乘法与加法运算-c语言实现
目录 一.题意理解 二.求解思路 三.多项式的表示 3.1 数组 3.2 链表 四.程序框架搭建 五.如何读入多项式 六.如何将两个多项式相加 七.如何将两个多项式相乘 八.如何将多项式输出 一.题意 ...
随机推荐
- POJ3436 ACM Computer Factory(最大流)
题目链接. 分析: 题意很难懂. 大体是这样的:给每个点的具体情况,1.容量 2.进入状态 3.出去状态.求最大流. 因为有很多点,所以如果一个点的出去状态满足另一个点的进入状态,则这两个点可以连一条 ...
- 【转】Android手机客户端关于二维码扫描的源码--不错
原文网址:https://github.com/SkillCollege/QrCodeScan QrCodeScan 这是Android手机客户端关于二维码扫描的源码,使用了高效的ZBar解码库,并修 ...
- House Robber——LeetCode
You are a professional robber planning to rob houses along a street. Each house has a certain amount ...
- AOP Concepts
As with most technologies, AOP comes with its own specific set of concepts and terms. It is importan ...
- 【2013杭州区域赛】部分题解 hdu4770—4780
1008: 题意: 有20W个数,每个数都在20W以内,现在有20W个询问,每次询问L,R区间内不会打架的数有多少个 定义两个数不互质 就会打架 解法: 脑洞很大的一道题,先要进行预处理,对每一个数预 ...
- Java中对象的上转型对象
1. 定义 如果B类是A类的子类或间接子类,当用B类创建对象b并将这个对象b的引用赋给A类对象a时,如: A a;a = new B();ORA a;B b = new B();a = b; 则称A类 ...
- web前端面试试题总结---css篇
CSS 介绍一下标准的CSS的盒子模型?低版本IE的盒子模型有什么不同的? (1)有两种, IE 盒子模型.W3C 盒子模型: (2)盒模型: 内容(content).填充(padding).边界(m ...
- ActionScript通用开发框架
ActionScript 3(简称as)自2006年诞生以来,出现了一大批很优秀框架.就我的知识领域,运用包括pureMVC.pushButton Engine(组件框架).Robotlegs.Ash ...
- 转 [教程] Unity3D中角色的动画脚本的编写(二)
在上一篇,我们介绍了有关Animation这个类中的部分方法,我后来想了想,这么介绍也不是个办法(其实有些方法我自己也没用过),该介绍点实际的东西了,毕竟我们是要做东西出来的.那好 ...
- UI开发--响应者链条
一.触摸事件处理的详细过程 用户点击屏幕后产生的一个触摸事件,经过一些列的传递过程后,会找到最合适的视图控件来处理这个事件 找到最合适的视图控件后,就会调用控件的touches方法来作具体的事件处理 ...