多项式求和和求值
来源:互联网 发布:中央空调控制系统软件 编辑:程序博客网 时间:2024/05/21 17:55
//多项式操作//作者:nuaazdh//时间:2011年12月1日 12:52:00#include <stdio.h>#define OK 1#define ERROR 0typedef int Status;//函数状态代码typedef struct{ //项的表示 float coeff;//系数 int expn; //指数}term,ElemType;typedef struct LNode{//结点类型 ElemType data; struct LNode *next;}LNode,*Link;typedef struct{//链表类型 Link head,tail;//分别指向链表的头结点和尾结点 int len;//链表的长度}LinkList;typedef LinkList polynomial;//创建多项式,m为多项式中x的最高次幂void CreatePolyn(polynomial *P,int m){ int i=0;//循环变量 float input;//用户输入 for(i=0;i<=m;i++) { printf("请输入x^%d项的系数:",i); scanf("%f",&input); if(input!=0) { Link newnode=(Link)malloc(sizeof(LNode)); if(newnode==NULL) { printf("申请内存失败.\n"); exit(0); } newnode->data.coeff=input;//系数赋值 newnode->data.expn=i;//幂赋值 if(i==0)//第一项 P->tail=newnode; newnode->next=P->head;//插入链表头部 P->head=newnode;//修改头指针 if(i==0) //第一个结点 P->tail=newnode; P->len++;//长度加1 } }}//销毁多项式void DestroyPolyn(polynomial *P){ Link ptr=P->head;//指向首结点 while(ptr!=NULL) { P->head=ptr->next; free(ptr);//释放结点空间 ptr=P->head; P->len--;//链表长度减1 } P->tail=NULL; P->len=0;}//输出多项式Pvoid PrintPolyn(const polynomial *P){ Link ptr=P->head; if(!(P->len||P->head||P->tail))//链表为空 { printf("多项式没有任何项.\n"); return; } printf("表达式为:\n"); //输出多项式各项 while(ptr!=NULL) { if((ptr->data.coeff>0)&&(ptr!=P->head))//系数为正,且不是首项 printf("+");//输出前置+号 printf("%g",ptr->data.coeff);//输出系数 if(ptr->data.expn) printf("x"); if(ptr->data.expn>1) printf("^%d",ptr->data.expn);//输出x幂项 ptr=ptr->next; } printf("\n");//输出回车}//返回多项式P的项数int PolynLength(const polynomial *P){ return P->len;//返回链表长度}//计算base的expn次幂值float power(float base,int expn){ if(expn==0) return 1.0; else return base*power(base,expn-1);}//计算多项式P在变量值为x时的值float ComputeValue(const polynomial *P,float x){ float sum=0.0; Link ptr; if(P->head==NULL) { printf("多项式为空.\n"); } ptr=P->head; while(ptr!=NULL) { sum+=ptr->data.coeff*power(x,ptr->data.expn); ptr=ptr->next; } return sum;}//多项式相加运算,Pa=Pa+Pb,并销毁多项式Pbvoid AddPolyn(polynomial *Pa,polynomial *Pb){ Link ptr_a,ptr_b,ta,tb,ha; ta=NULL;//Pa链表中的临时指针 tb=NULL;//Pb链表中的临时指针 ha=NULL;//ha为当前已经合并的链表最后一个结点 ptr_a=Pa->head;//指向多项式Pa ptr_b=Pb->head;//指向多项式Pb while(ptr_a&&ptr_b) { if(ptr_a->data.expn==ptr_b->data.expn)//幂相等,合并同类项 { ptr_a->data.coeff+=ptr_b->data.coeff;//系数相加 if(ptr_a->data.coeff==0.0)//系数为0 { if(ha==NULL)//Pa的首相相消 Pa->head=ptr_a->next; free(ptr_a);//删除ptr_a指向结点 ptr_a=Pa->head; }else{ //系数不为0 if(ha!=NULL)//和多项式项数不为0 ha->next=ptr_a; ha=ptr_a; ptr_a=ptr_a->next; } tb=ptr_b->next; free(ptr_b); ptr_b=tb; } else if(ptr_a->data.expn<ptr_b->data.expn)//Pb当前项幂较高 { if(ha==NULL) { Pa->head=ha=ptr_b; }else{ ha->next=ptr_b; ha=ptr_b; } ptr_b=ptr_b->next; } else//Pa当前项幂较高 { if(ha==NULL) ha=ptr_a; else ha->next=ptr_a; ptr_a=ptr_a->next; }//if }//while //链接剩余结点 if(ha!=NULL)//所有处理过的项均相消 { ha->next=(ptr_a==NULL)?(ptr_b):(ptr_a); } else { Pa->head=(ptr_a==NULL)?(ptr_b):(ptr_a); } Pb->head=Pb->tail=NULL;//修改多项式Pb指针 Pb->len=0; //修正多项式Pa的尾指针和长度 Pa->len=0; Pa->tail=Pa->head; if(Pa->tail!=NULL) while(Pa->tail->next) { Pa->tail=Pa->tail->next; Pa->len++; } Pa->len++; DestroyPolyn(Pb);//销毁Pb}//主函数int main(){ int m; float x; polynomial p1,p2;//建立新链表 p1.head=NULL;p1.tail=NULL;p1.len=0; p2.head=NULL;p2.tail=NULL;p2.len=0; printf("请输入关于x的多项式1中x的最高次幂:"); scanf("%d",&m); if(m<0) { printf("输入值非法!\n"); } CreatePolyn(&p1,m);//创建多项式 printf("多项式1"); PrintPolyn(&p1);//显示多项式1 printf("请输入关于x的多项式2中x的最高次幂:"); scanf("%d",&m); if(m<0) { printf("输入值非法!\n"); } CreatePolyn(&p2,m);//创建多项式 printf("多项式2"); PrintPolyn(&p2);//显示多项式 AddPolyn(&p1,&p2); printf("和多项式"); PrintPolyn(&p1);//输出和多项式 printf("输入x的值:"); scanf("%f",&x); printf("多项式在x=%g时,值为%g",x,ComputeValue(&p1,x));//输出多项式求值 DestroyPolyn(&p1);//销毁多项式 return 0;}
运行结果:
- 多项式求和和求值
- 多项式求值
- 多项式求值
- 多项式求值
- 多项式求值
- 多项式求值
- 多项式求值
- 多项式求值
- 多项式求值
- 多项式求和
- 多项式求和
- 多项式求和
- 多项式求和
- 多项式求和
- 多项式求和
- 多项式求和
- 多项式求和
- 多项式求和
- 如何在storyboard中使用navigationcontrol
- Ubuntu下搭建Ruby On Rails
- Android下ContentProvider的实例
- 音视频文件码率与大小计算
- 输入一颗二元查找树,将该树转换为它的镜像,
- 多项式求和和求值
- ceshi
- Android的MediaPlayer架构介绍
- WindowXP下PHP5开发环境配置 (转载)
- 从初学者自学的角度来看栈的四则运算
- SQLServer 2005 和自增长主键identity说再见——NEWSEQUENTIALID()
- 整理CVPR2012感兴趣的文章
- 支付宝及时到帐接口使用详解
- 多媒体基础知识--编解码学习