问答文章1 问答文章501 问答文章1001 问答文章1501 问答文章2001 问答文章2501 问答文章3001 问答文章3501 问答文章4001 问答文章4501 问答文章5001 问答文章5501 问答文章6001 问答文章6501 问答文章7001 问答文章7501 问答文章8001 问答文章8501 问答文章9001 问答文章9501

简单的整系数一元多项式计算系统(绝对高分)

发布网友 发布时间:2022-05-22 05:47

我来回答

2个回答

热心网友 时间:2024-03-06 20:35

#include<stdio.h>
#include<stdlib.h>
typedef struct
{ float coef; //系数
int expn; //指数
}term;
typedef struct LNode
{ term data; //term多项式值
struct LNode *next;
}LNode,*LinkList;
typedef LinkList polynomail;
/*比较指数*/
int cmp(term a,term b)
{ if(a.expn>b.expn) return 1;
if(a.expn==b.expn) return 0;
if(a.expn<b.expn) return -1;
else exit(-2);
}
/*又小到大排列*/
void arrange1(polynomail pa)
{ polynomail h=pa,p,q,r;
if(pa==NULL) exit(-2);
for(p=pa;p->next!=NULL;p=p->next); r=p;
for(h=pa;h->next!=r;)//大的沉底
{ for(p=h;p->next!=r&&p!=r;p=p->next)
if(cmp(p->next->data,p->next->next->data)==1)
{ q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;//r指向参与比较的最后一个,不断向前移动
} }
/*由大到小排序*/
void arrange2(polynomail pa)
{ polynomail h=pa,p,q,r;
if(pa==NULL) exit(-2);
for(p=pa;p->next!=NULL;p=p->next); r=p;
for(h=pa;h->next!=r;)//小的沉底
{ for(p=h;p->next!=r&&p!=r;p=p->next)
if(cmp(p->next->next->data,p->next->data)==1)
{ q=p->next->next;
p->next->next=q->next;
q->next=p->next;
p->next=q;
}
r=p;//r指向参与比较的最后一个,不断向前移动
} }
/*打印多项式,求项数*/
int printpolyn(polynomail P)
{ int i;
polynomail q;
if(P==NULL) printf("无项!\n");
else if(P->next==NULL) printf("Y=0\n");
else
{ printf("该多项式为Y=");q=P->next;i=1;
if(q->data.coef!=0&&q->data.expn!=0)
{ printf("%.2fX^%d",q->data.coef,q->data.expn); i++; }
if(q->data.expn==0&&q->data.coef!=0)
printf("%.2f",q->data.coef);//打印第一项
q=q->next;
if(q==NULL)
{printf("\n");return 1;}
while(1)//while中,打印剩下项中系数非零的项,
{ if(q->data.coef!=0&&q->data.expn!=0)
{ if(q->data.coef>0) printf("+");
printf("%.2fX^%d",q->data.coef,q->data.expn); i++;
}
if(q->data.expn==0&&q->data.coef!=0)
{ if(q->data.coef>0) printf("+");
printf("%f",q->data.coef);
}
q=q->next;
if(q==NULL)
{ printf("\n"); break; }
}
}
return 1;
}
/*1、创建并初始化多项式链表*/
polynomail creatpolyn(polynomail P,int m)
{ polynomail r,q,p,s,Q;
int i;
P=(LNode*)malloc(sizeof(LNode));
r=P;
for(i=0;i<m;i++)
{ s=(LNode*)malloc(sizeof(LNode));
printf("请输入第%d项的系数和指数:",i+1);
scanf("%f%d",&s->data.coef,&s->data.expn);
r->next=s; r=s;
}
r->next=NULL;
if(P->next->next!=NULL)
{ for(q=P->next;q!=NULL/*&&q->next!=NULL*/;q=q->next)//合并同类项
for(p=q->next,r=q;p!=NULL;)
if(q->data.expn==p->data.expn)
{ q->data.coef=q->data.coef+p->data.coef;
r->next=p->next;
Q=p;p=p->next;
free(Q);
}
else
{ r=r->next;
p=p->next;
}
}
return P;
}
/*2、两多项式相加*/
polynomail addpolyn(polynomail pa,polynomail pb)
{ polynomail s,newp,q,p,r;int j;
p=pa->next;q=pb->next;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&&q)
{ s=(LNode*)malloc(sizeof(LNode));
switch(cmp(p->data,q->data))
{case -1: s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s; r=s;
p=p->next;
break;
case 0: s->data.coef=p->data.coef+q->data.coef;
if(s->data.coef!=0.0)
{ s->data.expn=p->data.expn;
r->next=s;
r=s;
}
p=p->next;
q=q->next;
break;
case 1: s->data.coef=q->data.coef;
s->data.expn=q->data.expn;
r->next=s; r=s;
q=q->next;
break;
}//switch
}//while
while(p)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s; r=s;
p=p->next;
}
while(q)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=q->data.coef;
s->data.expn=q->data.expn;
r->next=s; r=s;
q=q->next;
}
r->next=NULL;
for(q=newp->next;q->next!=NULL;q=q->next)//合并同类项
for(p=q;p!=NULL&&p->next!=NULL;p=p->next)
if(q->data.expn==p->next->data.expn)
{ q->data.coef=q->data.coef+p->next->data.coef;
r=p->next;
p->next=p->next->next;
free(r);
}
printf("升序 1 , 降序 2\n");
printf("选择:");
scanf("%d",&j);
if(j==1) arrange1(newp);
else arrange2(newp);
return newp;
}
/*3、两多项式相减*/
polynomail subpolyn(polynomail pa,polynomail pb)
{ polynomail s,newp,q,p,r,Q; int j;
p=pa->next;q=pb->next;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
while(p&&q)
{ s=(LNode*)malloc(sizeof(LNode));
switch(cmp(p->data,q->data))
{case -1: s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s; r=s;
p=p->next;
break;
case 0: s->data.coef=p->data.coef-q->data.coef;
if(s->data.coef!=0.0)
{ s->data.expn=p->data.expn;
r->next=s;
r=s;
}
p=p->next;
q=q->next;
break;
case 1: s->data.coef=-q->data.coef;
s->data.expn=q->data.expn;
r->next=s; r=s;
q=q->next;
break;
}//switch
}//while
while(p)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef;
s->data.expn=p->data.expn;
r->next=s; r=s;
p=p->next;
}
while(q)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=-q->data.coef;
s->data.expn=q->data.expn;
r->next=s; r=s;
q=q->next;
}
r->next=NULL;
if(newp->next!=NULL&&newp->next->next!=NULL)//合并同类项
{ for(q=newp->next;q!=NULL;q=q->next)
for(p=q->next,r=q;p!=NULL;)
if(q->data.expn==p->data.expn)
{ q->data.coef=q->data.coef+p->data.coef;
r->next=p->next;
Q=p;p=p->next;
free(Q); }
else
{ r=r->next;
p=p->next; }
} printf("升序 1 , 降序 2\n");
printf("选择:");
scanf("%d",&j);
if(j==1) arrange1(newp);
else arrange2(newp);
return newp;}
/*4两多项式相乘*/
polynomail mulpolyn(polynomail pa,polynomail pb)
{ polynomail s,newp,q,p,r;
int i=20,j;
newp=(LNode*)malloc(sizeof(LNode));
r=newp;
for(p=pa->next;p!=NULL;p=p->next)
for(q=pb->next;q!=NULL;q=q->next)
{ s=(LNode*)malloc(sizeof(LNode));
s->data.coef=p->data.coef*q->data.coef;
s->data.expn=p->data.expn+q->data.expn;
r->next=s;
r=s;}
r->next=NULL;
printf("升序 1 , 降序 2\n");
printf("选择:");
scanf("%d",&j);
if(j==1) arrange1(newp);
else arrange2(newp);
for(;i!=0;i--)
{for(q=newp->next;q->next!=NULL;q=q->next)//合并同类项
for(p=q;p!=NULL&&p->next!=NULL;p=p->next)
if(q->data.expn==p->next->data.expn)
{ q->data.coef=q->data.coef+p->next->data.coef;
r=p->next;
p->next=p->next->next; free(r);
}
}
return newp;
}
/*5、销毁已建立的两个多项式*/
void delpolyn(polynomail pa,polynomail pb)
{ polynomail p,q;
p=pa;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
p=pb;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
printf("两个多项式已经销毁\n");
}
void main()
{ polynomail pa=NULL,pb=NULL;
polynomail p,q;
polynomail addp=NULL,subp=NULL,mulp=NULL;
int n,m;
int sign='y';
printf("1、创建两个一元多项式\n");
printf("2、两多项式相加得一新多项式\n");
printf("3、两多项式相减得一新多项式\n");
printf("4、两多项式相乘得一新多项式\n");
printf("5、销毁已建立的两个多项式\n");
printf("6、退出\n");
printf("\n");
while(sign!='n')
{ printf("请选择:");
scanf("%d",&n);
switch(n)
{case 1:
if(pa!=NULL)
{ printf("已建立两个一元多项式,请选择其他操作!");
break;
}
printf("请输入第一个多项式:\n");
printf("要输入几项:");
scanf("%d",&m);
while(m==0)
{ printf("m不能为0,请重新输入m:");
scanf("%d",&m);
}
pa=creatpolyn(pa,m);
printpolyn(pa);
printf("请输入第二个多项式:\n");
printf("要输入几项:");
scanf("%d",&m);
pb=creatpolyn(pb,m);
printpolyn(pb);
break;
case 2:
if(pa==NULL)
{ printf("请先创建两个一元多项式!\n");
break;
}
addp=addpolyn(pa,pb);
printpolyn(addp);
break;
case 3:
if(pa==NULL)
{ printf("请先创建两个一元多项式!\n");
break;
}
subp=subpolyn(pa,pb);
printpolyn(subp);
break;
case 4:
if(pa==NULL)
{ printf("请先创建两个一元多项式!\n");
break;
}
mulp=mulpolyn(pa,pb);
printpolyn(mulp);
break;
case 5:
if(pa==NULL)
{ printf("请先创建两个一元多项式!\n");
break;
}
delpolyn(pa,pb);
pa=pb=NULL;
break;
case 6:
if(addp!=NULL)
{ p=addp;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
}
if(subp!=NULL)
{ p=subp;
while(p!=NULL)
{ q=p;
p=p->next;
free(q);
}
}
exit(-2);
}//switch
}//while
}

热心网友 时间:2024-03-06 20:35

“数据结构”上机实习项目(2)
注意事项:
1,课程项目要求每个同学独立完成,写出“实习报告”。
2,为了环保,程序和实习报告都采用电子文档形式(通过email附件)交辅导老师。(不要打印稿)
3,如果采用多个源文件的形式开发,发给老师前请把文件打包(用zip或者rar)。
4,注意:只上交所有源程序文件(不要交可执行程序),应保证程序能编译和执行。
5,注明所用的程序开发环境,以便老师检查。
6,请注意保证自己上交的文档中没有病毒。

序号 布置日期 截止日期 作业内容
项目2 11月30日 12月28日 设计和实现一个简单的整系数一元多项式计算系统。要求:
1,系统能交互式地接受一系列多项式输入、计算和输出命令,完成相应的处理。
2,系统提供变量和赋值功能。变量名是一个字母(可用任何大写或小写字母),变量以多项式为值。
3,你实现的系统应提供下述命令(每个命令以一个字符作为标识,你可以假定每个命令的长度都不超过一行):
把输入的多项式赋给变量作为值:
  = [变量名] [多项式];
其中 [变量名] 是任一变量名(一个字母),[多项式] 是按下面说明的多项式输入形式给出的一个多项式。
对表达式(可以选用后缀或者中缀形式)计算,把结果赋给变量:
  ? [变量名] [表达式];
输出变量的值(输出多项式):
  ! [变量名];
结束:
  ^;
4,多项式运算包括加法、乘法、求负(一元运算)和求导。下面是一个计算示例(采用的是后缀形式):
  ? d a ' b + c - *;
表示对a(a的值是个多项式)求导,求导结果加上多项式b,再乘以多项式c求负的结果(a、b、c都应已有值),计算结果得到的多项式赋给变量d。
5,输出多项式时请采用如下易读形式(一元多项式,总变元为x):
  x^4 + -3 x^2 + 5
(如果能输出 x^4 - 3 x^2 + 5 当然更好)。
6,多项式的系数和指数直接用int类型,不考虑数值超范围的问题。
7,注意:计算表达式里的基本计算对象是变量代表的多项式。
下面工作步骤的说明供参考(这些建议有益于你顺利完成工作):
1,考虑下面多项式示例,实现输入函数,它读入并构造多项式的内部表示:

3 x^5 + 2 x^2 + 4
100 x^20000 + 1
10 x^6 - 100 x^20 + 1
你也可以自己设计某种更简单的多项式输入方式。如果采用自己的设计,请在报告中特别说明所用的形式,并给出至少6个你的系统能接受的实例(按你的多项式输入形式)。
2,为一元多项式设计一种内部表示方式(建议采用链接表)。
3,实现一元多项式的输出函数,从内部表示生成易读的输出。
4,实现所需的几个计算函数。
5,考虑计算中变量的处理,设计并实现一种保存变量名字与值的关联关系的结构。
6,实现一个简单的交互处理界面。计算表达式可以采用后缀或中缀形式。
请在实习报告中特别说明(除了教科书示例报告中考虑的问题外):
1,说明你实现的系统中使用的主要数据结构。
2,说明如何使用你的系统。
3,论述并分析所用数据结构的优点和缺点,说明为什么采用这种设计。
4,写“评价和进一步工作”一节,讨论系统改进和扩充的可能性。
声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com
长春小飞没有车没有房 碳钢的多久生锈 碳钢多久会生锈 碳钢多长时间会开始生锈 碳钢和铝哪个容易生锈 梦见天宫图是什么意思 光遇2023好友树解锁图鉴 光遇二级节点多少个 ...火柴小女孩》《词语手册》里有很多词语的意思的,求告知 暖融融解释 领淘通淘客助手这个软件怎么样? excel表格中如何计算单元格之间的匹配 应用简单的匹配算法对主串s=&#39;&#39;BDBABDBABDBA&#39;&#39;与子串t=&#39;&#39;DBA&#39;&#39;进行模式匹配,在匹配成功时,进行的字符比 求个excel匹配公式 EXCEL中字段匹配加上简单计算的问题 农业水土匹配系数怎么算 简单匹配系数和jaccard系数是一样的吗 系数匹配法怎么用 尼康D610,入个挂机头大家推荐下?旅游风景人像用 尼康D610+三阳15/2.8+腾龙720(A001)还是先买一个24-70? 尼康D610搭配什么镜头比较好? 怎样增加自己的酒量? 关于单反镜头的问题:尼康D610,新买了个头,适马24-70 2.8 hsm,出的片子怎么感觉没有 我为什么不用银行卡密码就能转账给支付宝? 为什么支付宝转账没有密码提醒 java中如何使用StringBuffer? 我现在知道,StringBuffer比String对象有效率,请问:什么情况下需要使用String对象呢? 老式爆米花机! ...到底有什么本质的区别呢,什么时候用StringBuffer呢。。 java中的StringBulid和StringBuffer用法,StringBuffer是线程安全的,什么情况下必须用StringBuffer? java中的StringBuilder有什么用?什么时候用StringBuilder? 实现串的简单模式匹配算法。要求:输入主串S和子串T,若在主串S中存在和T相等的子串,则返回在S中出现的 EXCEL如图:目前只知道比较简单的公式,只能单次匹配 用简单的模式匹配算法需要多少次比较能 线性代数组合系数怎么计算 孩子烫伤了怎么办。。 关于儿童烫伤的! 孩子被开水烫伤了 小孩子被烫伤,求助 华为荣耀手表按键哪里可以组装 天猫精灵可以上作业帮直播课吗 电脑超频怎么解决? 电脑出现超频怎么解决? 我的电脑超频如何解决? 如何接收钉钉考勤记录 每天坚持慢跑40分钟能减肥嘛?,我怎么感觉慢跑40分钟不是很累? 娱乐圈撞脸明星:张一山夏雨不算啥,王俊凯如同复制粘贴,你还知道哪些? 有哪些艺人让你觉得长得很相像?你知道有哪几对? 网友指出宋威龙甘望星长得很像,你觉得娱乐圈中还有哪些明星长得比较像? 您认为哪对明星脸长得最像 你长得最像哪个明星?