/*一元多项式的基本操作*/
//定义一个结构体作为链表节点,以存储多项式中的第一项并建立相应的链表
typedef struct node
{
float coef;//系数
int exp;//指数
struct node *next;//指向下一个结点
} LinkNode, *Link;
/*
/*初始条件:一元多项式P已存在
/* 操作结果:将新的节点s插入到现有链表的后面,并确保是降序
*/
void insert(Link head,Link s, boolean check)
{
Link pre=NULL,p=NULL;
pre=head;
p=pre->next;
while(p!=NULL) {
if(check && (p->exp > s->exp)) break;//如果新节点的幂大于
pre=p;
p=p->next;
}
s->next=p;
pre->next=s;
}
/*
* 操作结果:创建新的多项式链表
*/
Link createPolynomial()
{
Link head=NULL, s=NULL;
float co;
int last=-1, ex,flag=0;
head=(Link)malloc(sizeof(LinkNode));
head->next=NULL;
do {
printf("\n系数a(输入0退出程序)# ");
scanf("%f",&co);
if (co==0) flag=1;
if (flag==0) {
printf("指数e(必须大于 %d)# ", last);
scanf("%d",&ex);
if(ex <= last) continue; // 如果新输入的指数小于最后输入的,则不作任何操作,进入下一轮循环
last=ex;
s=(Link)malloc(sizeof(LinkNode));
s->coef = co;
s->exp=ex;
//insert(head,s);
insert(head, s, TRUE);
}
} while(flag==0);
return(head);
}
/*
/*初始条件:一元多项式P已存在
*操作结果:从一个给定链表中删除指定节点
*主要用于辅助destroy() 函数
*/
void _del(Link *p,Link pa)
{
(*p)->next = pa->next;
free(pa);
}
/*
/*
/*初始条件:一元多项式P已存在
* 操作结果:销毁链表,以及时释放被占用的内存
*原理:将链表中的节点依次删除
*/
void destroy(Link *p)
{
while((*p)->next != NULL)
_del(p,(*p)->next);
free(*p);
}
/*
/*初始条件:一元多项式P已存在
/* 操作结果:确定一个链表是否为空
* 原理:如果头节点指向一个空值,即NULL,则表示该链表为空
* @return boolean, 如果为空则返回TRUE, 否则返回FALSE
*/
boolean isBlank(Link p) {
if(p->next == NULL) {
return OK;
}
return FALSE;
}
/*
/*初始条件:一元多项式P已存在
* 操作结果:复制一个链表,将返回该新链表的头指针,以免对在运行的时候改变原链表
* 从而影响继计算
* 原理:获取原结点中每个结点的值,并插入到新的链表中
* 返回:一个按升幂排列的多项式
*/
Link copyList(Link head) {
Link node = NULL, newHead = NULL;
newHead = (Link) malloc(sizeof(LinkNode));
newHead->next = NULL;
head = head->next;
while (head != NULL) {
node = (Link) malloc(sizeof(LinkNode));
node->coef = head->coef;
node->exp = head->exp;
//insert(newHead, node);
insert(newHead, node, TRUE);
head = head->next;
}
return newHead;
}
/*
/*初始条件:一元多项式P已存在
* 操作结果:将指定链表逆序
* 主要用于辅助乘除运算
*/
Link reverse(Link head)
{
LinkNode *p,*q,*t;
p=NULL;
q=head->next;
while( q!=NULL ) {
t=q->next;
q->next =p;
p=q;
q=t;
}
head->next =p;
return head;
}
/*
/*初始条件:一元多项式P已存在
* 操作结果:实现两个多项式想加,并将计算结果存储于pa中
*原理:将指数相同的项的系数加
* pa, 与pb的幂次序都要求是升序,否则可能得到错误的结果
*/
void addPoly(Link pa,Link pb)
{
Link pc,pre,u;
float sum;
pc=pa;
pre=pa;
pa=pa->next;
u=pb;
pb=pb->next;
free(u);
while(pa && pb) {
if (pa->exp < pb->exp) {//如果当前pa的幂小于pb则指向pa中的下一个节点
pre=pa;
pa=pa->next;
} else if (pa->exp > pb->exp) {
u=pb->next;
pb->next=pa;
pre->next=pb;
pre=pb;
pb=u;
} else {
sum = pa->coef + pb->coef;//指数相加
if(sum!=0.0) {
pa->coef = sum;
pre=pa;
} else {
pre->next = pa->next;
free(pa);
}
pa=pre->next;
u=pb;
pb=pb->next;
free(u);
}
}
if(pb) pre->next = pb;
}//End addPoly
/*
/*初始条件:一元多项式P已存在
*操作结果:实现两个多项式相减
* 原理:与加法类似,将指数相同的指数相减
*/
Link subtractPoly(Link pa,Link pb)
{
Link pc,pre,u, newNode = NULL, newHead = NULL;
float minus;
pc = pa;
pre = pa;
pa = pa->next;
u = pb;
pb = pb->next;
free(u);
//创建一个新的链表以存储新相减的结果
newHead = (Link) malloc(sizeof(LinkNode));
newHead->next = NULL;
while(pa && pb) {
if (pa->exp < pb->exp) {//如果当前pa的指数小于pb的指数,则将该pa节点存储于将的链表中
newNode = (Link) malloc (sizeof(LinkNode));
newNode->coef = pa->coef;
newNode->exp = pa->exp;
//insert(newHead, newNode);
insert(newHead, newNode, TRUE);
pre = pa;
pa = pa->next;
} else if (pa->exp > pb->exp) {//如果当前pa的指数大于pb的指数,则将该pb节点存储于将的链表中
minus = -pb->coef;
newNode = (Link) malloc (sizeof(LinkNode));
newNode->coef = minus;
newNode->exp = pb->exp;
//insert(newHead, newNode);
insert(newHead, newNode, TRUE);
u = pb->next;
pb->next = pa;
pre->next = pb;
pre = pb;
pb = u;
} else {//如果相等,则将系数相减
minus = pa->coef - pb->coef;
if(minus!=0.0) {//判断相减的结果是否为0
newNode = (Link) malloc (sizeof(LinkNode));
newNode->coef = minus;
newNode->exp = pa->exp;
//insert(newHead, newNode);
insert(newHead, newNode, TRUE);
pre=pa;
} else {//如果为0则不作任何操作
pre->next = pa->next;
free(pa);
}
pa = pre->next;
u = pb;
pb = pb->next;
free(u);
}
}
pre = pb ? pb : (pa ? pa : NULL);//判断pa或pb是否完成
if(pre) {
while(pre) {
newNode = (Link) malloc (sizeof(LinkNode));
newNode->coef = pb ? -pre->coef : pre->coef;
newNode->exp = pre->exp;
//insert(newHead, newNode);
insert(newHead, newNode, TRUE);
pre = pre->next;
}
}
return newHead;
}
/*
/*初始条件:一元多项式P已存在
* 操作结果:实现两个多项式相乘,A(X) * B(x)
*/
Link multiplyPolynomial(Link A,Link B)
{
LinkNode *pa, *pb, *pc, *u, *head;
int k , maxExp;
float coef;
//The head node of the multiply
head = (Link) malloc( sizeof (LinkNode) );
if(head==NULL) {
printf("Allocable memory fail!\n");
return NULL;
}
head->coef=0.0;
head->exp =0;
head->next =NULL;
//将多项式链表按降序排列,如4X^3 + 3X^2 + 2X^1 + 19
reverse(A);
reverse(B);
if(A && B) { //获得两个多项式相乘后的度
maxExp=(A->next)->exp + (B->next)->exp;
} else {
return head;
}
pc=head;
B=reverse (B);
for(k=maxExp; k>=0; k--) {
pa = A->next ;
while(pa != NULL && pa->exp > k) {
pa=pa->next ;
}
pb = B->next ;
while( pb != NULL && pa != NULL && (pa->exp + pb->exp) < k ) {
pb=pb->next;
}
coef=0.0;
while(pa != NULL && pb != NULL ) {
if( (pa->exp +pb->exp )==k ) {
coef+=pa->coef * pb->coef;
pa=pa->next;
pb=pb->next;
} else {
if(( pa->exp + pb->exp ) > k ) {
pa=pa->next;
} else {
hctcyl
- 粉丝: 0
- 资源: 19
最新资源
- 基于MATLAB的500kV LCC-HVDC 输电仿真 两侧交流系统电压为345kV,交流侧分别设计了相应的滤波器,直流电压等级为500kV,直流电流为2KA,直流功率为1000MVA,下面依次为整
- matlab simulink车辆防抱死制动系统ABS建模仿真 单轮 双轮
- 基于hadoop的新闻推荐系统 用户协同过滤推荐 基于大数据的新闻推荐系统 推荐原理:以用户对新闻的喜欢和收藏行为作为基础数据集,应用hadoop通过mapreduce程序进行协同过滤计算,得出用户对
- C#上位机模板程序,使用的是台达AS228主机PLC,功能齐全,自动运行页面、切页面、手动调试、参数设置页面都有
- TCR+fc型svc无功补偿仿真模型有详细资料
- 基于光风储能vsg无缝切(预同步)控制策略 前0.3秒风光储+直流负载独立运行 0.3s时,断开直流负载和直流源,风光储+VSG+交流负载合并运行 0.6s时,VSG预同步模块并网 1.3s时,改变t
- 自动驾驶图像全景分隔,基于HRnetSegmentation从训练工程到tensorRT工程部署Demo闭环一套,包含训练工程及部署工程,和环境的配置说明,已在实际项目中使用 大厂自动驾驶工程师沉淀
- MATLAB代码 风光场景生成 场景削减 概率距离削减法 蒙特卡洛法 MATLAB:基于概率距离快速削减法的风光场景生成与削减方法 参考文档:《含风光水的电厂与配电公司协调调度模型》完全复现场景削减
- 基于mppt的光伏svpwm逆变并网 通过分析光伏电池的输出特性与外部环境的关系搭建出仿真模型,引入了变步长扰动观察法实现的最大功率追踪 MPPT 控制算法 并设计三相逆变器SVPWM双闭环控制策略
- 伺服电机代码 直线电机代码 FPGA架构伺服代码 软件硬件方案, 一个fpga控制多个电机,目前一个fpga最多控制6伺服驱动,所有内容均有fpga完成,控制曲线(T曲线),位置环,速度环,电流环,低
- 三相逆变器重复控制 在simlink中搭建了逆变器的重复控制模型,滤波器环节采用了陷波器与二阶低通滤波器 逆变器输出电压的THD仅仅只有0.52% 整个仿真全部离散化,采用离散解析器,控制与采样
- 锁相环 采用simlink仿真嵌C语言实现锁相环,整个仿真没有一个模块,只有C需要写的锁相环函数 仿真结果如图所示,基于双二阶广义积分器的锁相环成功锁得电网相位 对C语言写的代码做了详尽的注释
- PWM整流器仿真 在simulink中搭建了PWM整流器,采用电压电流双闭环控制,实现了网侧电压与电流同相位,单位功率因数运行 采用基于双二阶广义积分器的锁相环,锁得电网相位 整个仿真全部离散化
- matlab代码:计及条件风险价值的电-气综合能源系统能量-备用分布鲁棒优化 关键词:wasserstein距离 CVAR条件风险价值 分布鲁棒优化 电-气综合能源 能量-备用调度 参考文档Ene
- 基于DSTATCOM无功补偿的风电并网模型 Matlab simulink 质量过硬 仿真简介: 1、2个风电:一个基于双馈风机DFIG、一个基于感应风机 2、仿真总时长30s,10s时,感应风机
- 考虑储能削峰填谷的含DG配电网可靠性评估 1、基于序贯蒙特卡洛的配电网可靠性评估; 2、基于序贯蒙特卡洛的含DG配电网可靠性评估; 3、基于区间迭代法优化储能出力进行削峰填谷; 4、基于上述内容进一
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈