一元多项式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 链表 四.程序框架搭建 五.如何读入多项式 六.如何将两个多项式相加 七.如何将两个多项式相乘 八.如何将多项式输出 一.题意 ...
随机推荐
- BZOJ 1023 [SCOI2009]生日快乐
1024: [SCOI2009]生日快乐 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 1729 Solved: 1219[Submit][Statu ...
- COJ 0538 购物问题
购物问题 难度级别:C: 运行时间限制:1000ms: 运行空间限制:51200KB: 代码长度限制:2000000B 试题描述 由于换季,ACM商场推出优惠活动,以超低价格出售若干种商品.但是,商场 ...
- 信用卡/借记卡充值p2p平台
第一部分信用卡/借记卡充值 首先信用卡尽量不要用于网贷,因为这样会有风险,对投资人和借款人都不利,况且银行的钱也不是那么好用的,对吧?但是也有很多朋友问我信用卡相关事宜,我在这里专门做个解答,信用卡用 ...
- <转>libjpeg解码内存中的jpeg数据
转自http://my.unix-center.net/~Simon_fu/?p=565 熟悉libjpeg的朋友都知道libjpeg是一个开源的库.Linux和Android都是用libjpeg来 ...
- 酷派D530刷机指引之民间ROM
为什么要刷民间ROM? 下图左边是官方ROM,右边是民间ROM,单单看"程序内存"这一项,这个问题的答案应该无需多言: 选择民间ROM就跟找对象一样,没有最好的,只有最适合自己的, ...
- 032数值的整数次方(keep it up)
剑指offer中题目:http://ac.jobdu.com/problem.php? pid=1514 题目描写叙述: 给定一个double类型的浮点数base和int类型的整数exponent. ...
- juce: 跨平台的C++用户界面库
如果你用过QT和MFC,那你必然知道QT是基于C++的跨平台库,而MFC是微软针对widows平台推出来基础类库.且不论MFC的设计如何,从我个人和身边朋友的经历来看,MFC是一些非常难以理解的类的组 ...
- Android应用程序之间共享文字和图片(一)
以下为TestReceiveShare1工程 MainActivity如下: package cn.testreceiveshare1; import java.util.ArrayList; imp ...
- Event Delivery: The Responder Chain(事件传递,响应链)
当我们设计app的时候,我们很可能想动态的响应事件.例如,触摸一个拥有许多不同对象的屏幕,你要决定给哪个对象一个响应事件,怎么样对象接收到事件. 当一个用户产生事件发生时(如 点击),UIKit产生一 ...
- ifconfig命令详解
linux下网上命名规律:eth0,eth1.第一块以太网卡,第二块.lo为环回接口,它的IP地址固定为127.0.0.1,掩码8位.它代表你的机器本身. 1.ifconfig是查看网卡的信息 eth ...