线性表实现多项式相加c语言,用线性表实现多个多项式相加
今天开始想复习一下数据结构,就从线性表开始吧。
今天是用线性表实现多个多项式相加这个题目,自变量是x。
题目描述如下:
在数学上,一个一元多项式Pn(x)可按降幂写成:Pn(x) = pn x^n + p(n-1) x^n + ……. + p2x^2 + p1x^1 + p0,它由n+1个系数唯一确定。同样的Qn(x)也可以写成如P多项式一样。当两个多项式的某一项指数相同时,可将这项的底数相加,这称为多项式相加。
如:多项式P: 5x^4 + 3x^2 + 4 多项式Q:3x^3 + 2x^2 + 2 。 则P+Q:5x^4 + 3x^3 + 5x^2 + 6
代码如下:
1.头文件 link_list.h
//head file
//History Xinspace 27 Feb First release
#ifndef _xinspace
#define _xinspace 1
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#define error_show(function) \
do \
{ \
fprintf(stderr, “in file:%s, in function:%s, at line %d, %s : %s\n”, __FILE__, __FUNCTION__, __LINE__, function, strerror(errno)); \
exit(-1); \
}while(0)
#define LEN 3 //定义多项式表头数组的最大个数,即最多一次性处理几个多项式
/*定义多项式每一项的节点结构体*/
typedef struct linklist
{
float ds; //每一项的底数
int zs; //每一项的指数
struct linklist *next;
}Polyn;
Polyn *createPolyn(); //创建一个多项式
Polyn *createNode(float _ds, int _zs); //创建一个节点
void display(Polyn *Head); //显示一个多项式
void init(Polyn **Head_array); //初始化多项式表头数组
void sort(Polyn *Head); //对给定的多项式进行排序,并把具有相同指数的项相加
void add(Polyn **Head_array); //将两个多项式相加
#endif
2.代码文件link_list.c
/*自变量是x*/
#include “link_list.h”
int main(void)
{
Polyn *Head_array[LEN]; //定义多项式的表头数组
init(&Head_array[0]); //初始化该数组
add(&Head_array[0]); //将表头数组中的多项式都加起来
return 0;
}
/*input the Polyns and be ready to process*/
void init(Polyn **Head_array)
{
int num;
printf(“how many polyns do you want to process(less than %d)?\t”, LEN);
scanf(“%d”, &num);
int count;
if(num > LEN)
{
fprintf(stderr, “number too much!\n”);
exit(1);
}
for(count = 0; count < num; count++)
{
Head_array[count] = createPolyn();
// sort(Head_array[count]);
}
// for(count = 0; count < num; count++)
// display(Head_array[count]);
// printf(“init done!\n”);
}
/*sort the Polyn gived and add the ds which the nodes have the same zs*/
void sort(Polyn *Head)
{
if(!Head)
{
fprintf(stderr, “Head is NULL!\n”);
exit(1);
}
Polyn *fh, *sh, *f, *s;
fh = Head;
sh = f = fh->next;
s = sh->next;
while(s)
{
while(s)
{
if(f->zs < s->zs)
{
fh->next = s;
sh->next = s->next;
s->next = f;
f = fh->next;
s = sh->next;
}
else if(f->zs > s->zs)
{
sh = s;
s = sh->next;
}
else
{
f->ds += s->ds;
sh->next = s->next;
free(s);
s = sh->next;
}
}
fh = f;
f = fh->next;
sh = f;
s = sh ? sh->next : sh;
}
// printf(“Sort Done!\n”);
}
/*add Polyns*/
void add(Polyn **Head_array)
{
int count;
Polyn *temp;
for(count = 1; Head_array[count]->next && count < LEN; count++)
{
printf(“Head_array[%d]\n”, count);
for(temp = *Head_array; temp->next; temp = temp->next);
temp->next = Head_array[count]->next;
sort(*Head_array);
display(Head_array[0]);
}
}
/*create the Polyn using the function createNode()*/
Polyn *createPolyn()
{
Polyn *head = createNode(-1, -1);
Polyn *temp = head;
float ds;
int zs;
printf(“input ‘-100′ means quit!\n”);
while(1)
{
printf(“input ds(float):\t”);
scanf(“%f”, &ds);
if(ds == -100)
{
printf(“you quit!\n”);
break;
}
else if(ds == 0)
{
fprintf(stderr, “ds is not allowed to be zero!\n”);
continue;
}
printf(“input zs(int):\t”);
scanf(“%d”, &zs);
Polyn *node = createNode(ds, zs);
temp->next = node;
temp = node;
}
if(!(head->next))
{
fprintf(stderr, “Head is NULL!\n”);
exit(1);
}
// printf(“Create Done!\n”);
return head;
}
/*create the Polyn Node*/
Polyn *createNode(float _ds, int _zs)
{
Polyn *Node = (Polyn *)malloc(sizeof(Polyn));
if(NULL == Node)
error_show(“malloc”);
Node->ds = _ds;
Node->zs = _zs;
Node->next = NULL;
return Node;
}
/*display the Polyn gived*/
void display(Polyn *Head)
{
Polyn *temp = Head->next;
if(temp)
{
printf(“%3.1fx”, temp->ds);
if(temp->zs != 0)
printf(“^%d “, temp->zs);
else
printf(” “);
}
temp = temp->next;
while(temp)
{
if(temp->ds >= 0)
printf(“+ %3.1fx”, temp->ds);
else
printf(“- %3.1fx”, temp->ds);
if(temp->zs != 0)
printf(“^%d “, temp->zs);
else
printf(” “);
temp = temp->next;
}
printf(“\n”);
}
该程序最重要的函数就是sort函数,它即能把给定的多项式进行降幂排序,还能将一个线性表中两个指数相同的底数相加放到第一个底数所在的节点中。
add()函数就是利用了sort函数的这个加法功能实现加法的。
本程序的两个文件都为原创,可下载,文件放在360云盘上:
线性表实现多项式相加c语言,用线性表实现多个多项式相加相关推荐
- c语言线性表库函数大全,数据结构(C语言版)-线性表习题详解
<数据结构(C语言版)-线性表习题详解>由会员分享,可在线阅读,更多相关<数据结构(C语言版)-线性表习题详解(23页珍藏版)>请在人人文库网上搜索. 1.数 据 结 构 ,线 ...
- 力扣 两数相加 C语言 题解
** 力扣 两数相加 C语言 题解 ** 文章目录 力扣 两数相加 C语言 题解 一.完整题目 二.解题思路 二.编写代码 四.测评结果 五.总结评价 一.完整题目 给你两个非空的链表,表示两个非负的 ...
- c语言加法减法乘法,一元多项式的加法减法乘法c语言描述线性表应用
一元多项式的加法减法乘法 --(c语言描述)线性表应用 来源:永远的北邮人 vc6.0下调试通过 #include #include #include #include #include #inclu ...
- 已知稀疏多项式C语言版,一元稀疏多项式计算器C语言课程设计
<一元稀疏多项式计算器C语言课程设计>由会员分享,可在线阅读,更多相关<一元稀疏多项式计算器C语言课程设计(26页珍藏版)>请在人人文库网上搜索. 1.学号2014-2015学 ...
- C语言丨线性表(一):顺序表
线性表是由数据类型相同的个数据元素组成的有限序列,通常记为: 其中n为表长,n=0时称为空表:下标i表示数据元素的位序. 线性表的特点是组成它的数据元素之间是一种线性关系,即数据元素"一个接 ...
- C实现多项式F_2上的阶(线性反馈移位寄存器)
C语言求多项式F_2上的的阶 F_2:{0,1}二元域 求阶的函数 反馈多项式的阶等于线性反馈移位寄存器不同初态输出序列的最大周期(类似最小公倍数). int getlev(const int n){ ...
- R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载、划分数据、并分别构建线性回归模型和广义线性加性模型GAMs、并比较线性模型和GAMs模型的性能
R语言广义加性模型(GAMs:Generalized Additive Model)建模:数据加载.划分数据.并分别构建线性回归模型和广义线性加性模型GAMs.并比较线性模型和GAMs模型的性能 目录
- PTA 基础编程题目集 7-18 二分法求多项式单根 C语言
PTA 基础编程题目集 7-18 二分法求多项式单根 C语言 二分法求函数根的原理为:如果连续函数f(x)在区间[a,b]的两个端点取值异号,即f(a)f(b)<0,则它在这个区间内至少存在1个 ...
- c语言构造插值多项式,拉格朗日多项式插值(C语言).docx
拉格朗日多项式插值(C语言) #include #include #include float lagrange(float *x,float *y,float xx,int n)/*拉¤-格?朗¤¨ ...
最新文章
- 浅谈ASP.net中的DataSet对象
- HDU-3068-最长回文 (Manacher算法)
- Linux下创建用户、切换用户、删除用户
- MongoDB内置文档查看和修改
- redisTemplate进行自增操作例子
- Linux C 指针练习
- strtolower_PHP strtolower()函数与示例
- 江湖不再平静---51CTO学院停服公告
- c ++递归算法数的计数_计数排序算法–在C / C ++中实现的想法
- opencv图片变形 仿射 旋转 透视 弯曲 鱼眼特效
- cif t t操作流程图_操作示例:T/T+CIF+海运
- 深度|常见IT人才外包存在的问题及解决建议
- ubuntu背景色改为淡绿色
- java农夫过河_C语言实现农夫过河代码及解析
- 关于“要不要做调研”
- linux运维实施命令,很实用的Linux运维命令
- 敏捷观点和态度-《敏捷项目管理》读后感
- 优秀IT顾问的七大能力之七--持续战斗能力
- 教学常用计算机软件包括,计算机专业常用工具软件课程的教与学
- 得到app专栏《如何成为有效学习的高手》学习笔记