#include<stdio.h>

#include<malloc.h>

//定义结点的结构体

typedef struct

{

float x;//系数

int z;//指数

}polynomial;

typedef struct Node

{

polynomial data;

struct Node *next;

}SLNode;

//初始化

void Initial(SLNode **head)

{

*head=(SLNode *)malloc(sizeof(SLNode));

(*head)->next=NULL;

}

//求当前链表数据元素的个数

int Length(SLNode *head)

{

SLNode *p;//辅助指针

int size=0;

p=head;

while(p!=NULL)

{

size++;

p=p->next;

}

return size;

}

//插入多个元素

void  Insert(SLNode *head)

{

SLNode *p,*s;//辅助指针

int m;

float n;

p=head;

printf("输入系数x:");

scanf("%f",&n);

printf("输入指数z:");

scanf("%d",&m);

while(m!=0)

{

s=(SLNode *)malloc(sizeof(SLNode));

s->data.x=n;//系数赋值

s->data.z=m;//指数赋值

p->next=s->next;

p->next=s;

printf("输入系数x:");

scanf("%f",&n);

printf("输入指数z:");

scanf("%d",&m);

}

}

/*删除当前指针所指向的元素

void Delete(SLNode *curr)

{

SLNode *p;//辅助指针

p=curr;

curr=curr->next;//指针后移

free(p);

}

*/

///一元多项式及其操作的实现

#include<stdio.h>

#include<malloc.h>

#include"queue.h"

//建立多项式

SLNode *Creat()

{

SLNode *head,*p,*q;

int i,j;

printf("请输入多项式的项数:");

scanf("%d",&j);

Initial(&head);

for(i=0;i<j;i++)

{   q=head;

p=(SLNode*) malloc(sizeof(SLNode));

printf("请输入第%i项的系数和指数:\n\n",i);

printf("请输入第%i项的系数:",i);

scanf("%f",&p->data.x);

if(p->data.x==0)

{

printf("您输入的系数有误,请重新输入!\n");

printf("请输入第%i项的系数:",i);

scanf("%f",&p->data.x);

}

printf("请输入第%i项的指数:",i);

scanf("%d",&p->data.z);

if(q->next==NULL)

{

p->next=q->next;

q->next=p;

}

else

{//printf("hO\n");

while(q->next!=NULL)

{

if(p->data.z==q->next->data.z)   {q->next->data.x+=p->data.x;break;}

else if(p->data.z>q->next->data.z) q=q->next;

else if(p->data.z<q->next->data.z) {p->next=q->next;q->next=p;break;}

}

if(q->next==NULL)

{

p->next=q->next;

q->next=p;

}

}

}

while(q->next!=NULL)

{q=q->next;}

q->next=NULL;

// printf("hO\n");

return head;

}

//输出多项式

void printPolyn(SLNode *head)

{

SLNode *p;

int temp=1;

p=head->next;

while(p!=NULL)

{

if(temp==1)

{

if(p->data.z==0) printf("%.2f",p->data.x);

else

{

if(p->data.x==1) printf("x^%d",p->data.z);

else if(p->data.x==-1) printf("-x^%d",p->data.z);

else printf("%.2fx^%d",p->data.x,p->data.z);

}

temp=0;

}

else if(temp==0)

{

if(p->data.x==1) printf("+x^%d",p->data.z);

else if(p->data.x==-1) printf("-x^%d",p->data.z);

else if(p->data.x>0) printf("+%.2fx^%d",p->data.x,p->data.z);

else if(p->data.x<0) printf("%.2fx^%d",p->data.x,p->data.z);

}

p=p->next;

}

printf("\n");

}

//多项式求值

double Polynzhi(SLNode *L,float t)

{

SLNode *p;

int i;

float v;

double m=0;

p=L->next;

while(p!=NULL)

{

if(p->data.z>0)

{

v=1;

for(i=1;i<=p->data.z;i++) v=v*t;

}

else if(p->data.z<=0)

{

v=1;

for(i=p->data.z;i<0;i++) v=v/t;

}

m+=p->data.x*v;

p=p->next;

}

return m;

}

int Polynadd(SLNode *pa,SLNode *pb,SLNode **pc)

{

void Initial(SLNode **head);

float x;

SLNode *p,*q,*r;

Initial(pc);

p=pa->next;

q=pb->next;

r=*pc;

while(p!=NULL&&q!=NULL)

{

if(p->data.z<q->data.z)

{

r->next=(SLNode *)malloc(sizeof(SLNode));

r=r->next;

r->data.z=p->data.z;

r->data.x=p->data.x;

p=p->next;

}

else if(p->data.z==q->data.z)

{

x=p->data.x+q->data.x;

if(x)

{

r->next=(SLNode *)malloc(sizeof (SLNode));

r=r->next;

r->data.z=p->data.z;

r->data.x=x;

p=p->next;

q=q->next;

}

else if(x==0)

{

p=p->next;

q=q->next;

}

}

else if(p->data.z>q->data.z)

{

r->next=(SLNode *)malloc(sizeof(SLNode));

r=r->next;

r->data.z=q->data.z;

r->data.x=q->data.x;

q=q->next;

}

}

while(p!=NULL&&q==NULL)

{

r->next=(SLNode *)malloc(sizeof(SLNode));

r=r->next;

r->data.z=p->data.z;

r->data.x=p->data.x;

p=p->next;

}

while(p==NULL&&q!=NULL)

{

r->next=(SLNode *)malloc(sizeof(SLNode));

r=r->next;

r->data.z=q->data.z;

r->data.x=q->data.x;

q=q->next;

}

r->next=NULL;

return 1;

}

//多项式乘法

int Polynmul(SLNode *pa,SLNode *pb,SLNode **pd)

{

void Initial(SLNode **head);

float x,y;

int i=1,z;

SLNode *p,*q,*r;

Initial(pd);

// p=pa->next;

p=pa;

q=pb;

r=*pd;

while(p->next!=NULL)

{

p=p->next;

q=pb->next;

while(q!=NULL)

{

// r->next=(SLNode *)malloc(sizeof(SLNode));

// r=r->next;

if(i==1)                                ///第一项

{

x=p->data.x*q->data.x;

if(x==0)

{

q=q->next;

i=1;

}

else if(x!=0)

{

r->next=(SLNode *)malloc(sizeof(SLNode));

r=r->next;

r->data.z=p->data.z+q->data.z;

r->data.x=x;

q=q->next;

i=0;

}

} ///第一项

else if(i==0)

{

z=p->data.z+q->data.z;

x=p->data.x*q->data.x;

if(x==0) q=q->next;

else if(x!=0)

{

if(r->data.z<z)

{

r->next=(SLNode *)malloc(sizeof(SLNode));

r=r->next;

r->data.x=x;

r->data.z=z;

q=q->next;

p=p;

}

else if(r->data.z==z)

{

y=x+r->data.x;

if(y==0)

{

q=q->next;

p=p;

}

else if(y!=0)

{

r->data.x=y;

r->data.z=z;

q=q->next;

p=p;

}

}

else if(r->data.z>z)

{

r->next=(SLNode *)malloc(sizeof(SLNode));

r->next->data.x=r->data.x;

r->next->data.z=r->data.z;

r->data.x=x;

r->data.z=z;

r=r->next;

q=q->next;

p=p;

}

}

}

}

//p=p->next;

}

r->next=NULL;

return 1;

}

//测试程序

#include<stdio.h>

#include<malloc.h>

#include"queue1.h"

#include<windows.h>

int main()

{

//实现多项式a和b

SLNode *a,*b,*c,*d;

int i;

float t;

double z;

printf("请输入未知数t的值:");

scanf("%f",&t);

a=Creat();

printf("多项式a为:");

printPolyn(a);

b=Creat();

printf("多项式b为:");

printPolyn(b);

printf("*******************************************\n");

printf("******1.多项式求值*********2.多项式加法****\n");

printf("*******************************************\n");

printf("******3.多项式乘法*********4.退出系统******\n");

printf("*******************************************\n");

printf("请输入您的选择:\n");

while(1)

{

scanf("%d",&i);

switch(i)

{

case 1:{

z=Polynzhi(a,t);

printf("多项式a的值为:%lf",z);

printf("\n");

z=Polynzhi(b,t);

printf("多项式b的值为:%lf",z);

printf("\n");

continue;

}

case 2:{

printf("多项式a与多项式b的和为:");

Polynadd(a,b,&c);

printPolyn(c);

printf("\n");

z=Polynzhi(c,t);

printf("多项式a与b的和c多项式的值为:%lf",z);

printf("\n");

continue;

}

case 3:{

printf("多项式a与多项式b的积为:");

Polynmul(a,b,&d);

printPolyn(d);

printf("\n");

z=Polynzhi(d,t);

printf("多项式a与b的积d多项式的值为:%lf",z);

printf("\n");

continue;

}

case 4:

{

printf("正在退出系统,请稍等......\n");

exit(0);

}

}

}

return 0;

}

基于c数据结构——实现多项式合并同类项,加法和乘法相关推荐

  1. 高阶多项式合并同类项程序c语言,多项式合并同类项问题

    多项式合并同类项问题 这个函数编译通过 就是运行不了  我看不出是哪里有问题啊 pn * tongleixiang(pn * head)       //pn 是多项式的节点类型 { pn *p,*t ...

  2. 多项式合并同类项c语言链表,链表透过文件读写计算两个多项式之积

    当前位置:我的异常网» C语言 » 链表透过文件读写计算两个多项式之积 链表透过文件读写计算两个多项式之积 www.myexceptions.net  网友分享于:2014-03-24  浏览:10次 ...

  3. 高阶多项式合并同类项程序c语言,c语言实现两多项式相乘并排序合并同类项.doc...

    #includetypedef struct Node { int coef;//系数 int exp;//指数 struct Node *next; }PolyNode; PolyNode *Cre ...

  4. 高阶多项式合并同类项程序c语言,c语言实现两多项式相乘,并排序,合并同类项.doc...

    #include typedef struct Node { int coef;//系数 int exp;//指数 struct Node *next; }PolyNode; PolyNode *Cr ...

  5. 数据结构与算法-实验1-多项式的计算:合并同类项、升幂排序、多项式加法、减法、乘法

    #include<stdio.h> #include<stdlib.h> #include<malloc.h> using namespace std; //多项式 ...

  6. 数据结构——多项式的加减乘法以及合并同类项的算法

    测试数据(这里只测试了一组数据,小伙伴们可以自行测试其他数据喔) 2 2 3 3 4 4 0 0 1 2 2 2 0 0 1 2 1 1 0 0  1 2 1 3 0 0 -1 2 -5 3 -4 2 ...

  7. 一元多项式 java_java链表实现一元多项式的合并同类项以及加法

    上课的作业:利用java数据结构的知识表示一元多项式,以及实现一元多项式的加法运算以及合并同类项 链表节点类: package PloyItem; public class Lnode impleme ...

  8. java链表实现一元多项式的合并同类项以及加法

    上课的作业:利用java数据结构的知识表示一元多项式,以及实现一元多项式的加法运算以及合并同类项 链表节点类: package PloyItem;public class Lnode implemen ...

  9. matlab按照z合并同类项,matlab合并同类项

    (表达式) 9 合并同类项 syms 表达式中包含的变量 collect(表达式... ('nthnumer','cfe',8),x); % 分子多项式合并同类项 d=collect(maple('n ...

最新文章

  1. NOIP2018 退役记
  2. 计算机视觉与深度学习 | 使用K均值聚类实现基于颜色的分割(matlab版)
  3. Python爬取网站用户手机号_利用python爬取慕课网站上面课程
  4. ListElement QML类型
  5. 高可用的eureka
  6. 汇编学习笔记(二)--数据处理的两个基本问题
  7. Conway#39;s law(康威定律)
  8. 【Python开发】Python 适合大数据量的处理吗?
  9. C10K 非阻塞 Web 服务器
  10. css布局方式_收藏!40 个 CSS 布局技巧
  11. nio和bio的原理_Java的BIO,NIO和AIO的区别于演进
  12. 机器人局部避障的动态窗口法(dynamic window approach)
  13. linux 修改ip地址 和关闭防火墙设置
  14. 一键获取阿里巴巴主图视频细节图评论图的步骤
  15. 常见的分布期望及其方差
  16. 【优化布局】基于粒子群算法求解带出入点的车间布局优化问题附matlab代码
  17. linux运行酷q,Linux通过docker安装运行酷Q--用QQ骰子君进行跑团
  18. 药明康德2020年营业收入165.35亿元,同比增长28.5%
  19. 交互设计师成长指引-从平凡到卓越
  20. BZOJ 1911 (APIO 2010) 特别行动队

热门文章

  1. 微信网页发红包服务器卡住,「」实用技巧:微信红包“发放失败,此请求可能存在风险,已被微信拦截”的解决办法...
  2. PanDownload 一款好用的百度网盘下载工具 突破下载网速限制
  3. 瑞芯微RV1126平台----yolov5输出后处理C++实现
  4. 过夫妻生活:50岁男人比30岁时更有魅力
  5. lodash-difference理解
  6. 微信开发之扫码开票解决方案
  7. GSM/CDMA/固定电话,呼叫等待,呼叫转移
  8. 虚拟机ping不通网关之大坑
  9. 利用turtle绘制五角星
  10. 【模拟电子技术Analog Electronics Technology 4】——晶体三极管工作原理及放大作用详解