📄 一元稀疏多项式计数器.cpp
字号:
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <conio.h>
#define MAX_LOADSTRING 100
#define TRUE 1
#define FALSE 0
#define OK 1
#define ERROR 0
#define INFEASIBLE -1
#define Null 0
typedef int ElemType;
typedef int Status;
typedef struct LNode{
float coef;
int expn;
struct LNode *next;
}*polynomial;
polynomial CreatPolyn(char i);
void DestroyPolyn(polynomial L);
double vaulePolyn(polynomial s);
polynomial SortPolyn(polynomial k);
void PrintPolyn(polynomial s,char i);
void dPolyn(polynomial s);
polynomial AddPolyn(polynomial s,polynomial t);
polynomial Opposite(polynomial s);
polynomial SubtractPolyn(polynomial s,polynomial t);
polynomial MultiplyPolyn1(polynomial s,polynomial t);
void display1(polynomial s,polynomial t);
void display(polynomial &s,polynomial &t);
polynomial MultiplyPolyn1(polynomial s,polynomial t);
polynomial CreatPolyn(char i)
{
float pcoef=0;
int pexpn=0,m,j=0;
polynomial p,q,t,head;
printf("\t请输入多项式%c的项数:",i);
scanf("%d",&m);
if(m<0)
{
printf("\t多项式的项数不可为负数,请重新输入多项式%c的项数:",i);
scanf("%d",&m);
}
head=new LNode;
head->next=Null;
t=q=head;
t=t->next;
printf("\t请根据提示依次输入%c的系数和指数:\n\n",i);
for(j=1;j<=m;j++)
{
printf("\t请输入第%d项的系数:",j);
scanf("%f",&pcoef);
while(pcoef==0){
printf("\t稀疏多项式的系数不可为零,请重新输入第%d项的系数:",j);
scanf("%f",&pcoef);
}
printf("\t请输入第%d项的指数:",j);
scanf("%d",&pexpn);
printf("\n");
while(t!=Null)
{
if(t->expn==pexpn){
t->coef+=pcoef;
break;
}
else {q=t;t=t->next;}
}
if(t==Null){
p=new LNode;
p->coef=pcoef;
p->expn=pexpn;
q->next=p;
p->next=Null;
}
t=head;
t=t->next;
q=p;
}
system("cls");
return head;
}
void DestroyPolyn(polynomial L)
{ /* 销毁线性链表L,L不再存在 */
polynomial p,q,head;
head=L;
p=q=L;
p=p->next;
if(p!=Null)/* 不是空表 */
{
q=p;
while(p!=Null)
{
p=q->next;
delete(q);
q=p;
}
delete(head);
}
head=Null;
}
polynomial SortPolyn(polynomial k)
{
polynomial head,ha,qa;
float pcoef=0;
int pexpn=0;
head=ha=k;
while(ha->next!=Null)
{
ha=ha->next;
qa=ha->next;
while(qa!=Null)
{
pcoef=ha->coef;pexpn=ha->expn;
if(ha->expn<qa->expn){
ha->expn=qa->expn;ha->coef=qa->coef;
qa->expn=pexpn;qa->coef=pcoef;
qa=qa->next;
}
}
}
return head;
}
void PrintPolyn(polynomial s,char i)
{
polynomial q;
q=s;
q=q->next;
printf("\t%c=",i);
if(q==Null) printf("0\n");
while(q!=Null)
{
if(q->next==Null){
if(q->expn!=1&&q->expn!=0){
if(q->coef<0)printf("(%f)x^%d\n",q->coef,q->expn);
else if(q->coef==1)printf("x^%d\n",q->expn);
else printf("%fx^%d\n",q->coef,q->expn);
}
if(q->expn==1){
if(q->coef<0)printf("(%f)x\n",q->coef);
else if(q->coef==1)printf("x\n");
else printf("%fx\n",q->coef);
}
if(q->expn==0.0){
if(q->coef<0)printf("(%f)\n",q->coef);
else if(q->coef==1)printf("1\n");
else printf("%f\n",q->coef);
}
break;
}
if(q->next!=Null&&q->coef!=0){
if(q->expn!=1&&q->expn!=0){
if(q->coef<0)printf("(%f)x^%d+",q->coef,q->expn);
else if(q->coef==1.0)printf("x^%d+",q->expn);
else printf("%fx^%d+",q->coef,q->expn);
}
if(q->expn==0){
if(q->coef<0)printf("(%f)+",q->coef);
else if(q->coef==1.0)printf("1+");
else printf("%f",q->coef);
}
if(q->expn==1){
if(q->coef<0)printf("(%f)x+",q->coef);
else if(q->coef==1.0)printf("x+");
else printf("%fx+",q->coef);
}
q=q->next;
}
}
getch();
}
polynomial AddPolyn(polynomial s,polynomial t)
{
polynomial ha,hb,qa,qb,pp,head,p;
int c;
head=ha=s;
pp=ha;
hb=t;
qa=head->next;
qb=hb->next;
if(hb->next==Null) return(head);
else
{
while(qb!=Null&&qa!=Null)
{
if(qa->expn>qb->expn)c=1;
else if(qa->expn<qb->expn)c=-1;
else c=0;
switch(c)
{
case 1:ha->next=qa; /*如果qa的指数大于qb,qa指向a的下一节点*/
ha=qa;
pp=qa;
qa=qa->next;
break;
case 0:qa->coef+=qb->coef; /*指数相等时*/
if(qa->coef==0)
{
pp->next=qa->next;
delete qa;
qa=pp->next;
hb->next=qb->next;
delete qb;
qb=hb->next;
}
else /*当qa与qb的系数和不为零时*/
{
ha->next=qa;
ha=qa;
pp=qa;
qa=qa->next;
hb->next=qb->next;
delete qb;
qb=hb->next;
}
break;
case -1:p=new LNode; /*如果qb的指数大于qa,pb插入到a中的合适位置*/
p->coef=qb->coef;
p->expn=qb->expn;
ha->next=p;
ha=p;
hb->next=qb->next;
delete qb;
qb=hb->next;
break;
}
}
if(qa!=Null)
{ while(qa!=Null)
{
ha->next=qa;
ha=qa;
qa=qa->next;
}
}
if(qb!=Null)
{
while(qb!=Null)
{ p=new LNode;
p->coef=qb->coef;
p->expn=qb->expn;
ha->next=p;
ha=p;
hb->next=qb->next;
delete qb;
qb=hb->next;
}
}
ha->next=Null;
DestroyPolyn(hb);
return head;
}
}
polynomial Opposite(polynomial s)
{
polynomial p,head;
p=head=s;
p=p->next;
while(p!=Null)
{
p->coef*=(-1);
p=p->next;
}
return head;
}
polynomial SubtractPolyn(polynomial s,polynomial t)
{
Opposite(t);
AddPolyn(s,t);
return s;
}
polynomial MultiplyPolyn(polynomial s,polynomial t)
{
polynomial p,pc,pq,ahead,bhead,pp,head;
float pcoef;
int pexpn;
ahead=s;bhead=t;
pp=ahead->next;
pq=bhead->next;
head=new LNode;// 生成头结点
pc=head;
head->next=NULL;
if(pq==Null||pp==Null)head->next=Null;
else{
while(pp!=Null)
{
pq=bhead->next;
while(pq!=Null)
{
pcoef=pp->coef*pq->coef;
pexpn=pp->expn+pq->expn;
while(pc->next!=NULL)
{
if(pexpn<pc->next->expn) pc=pc->next;
else
{
if(pexpn>pc->next->expn)
{
p=new LNode;
p->expn=pexpn;p->coef=pcoef;
p->next=pc->next;
pc->next=p;
break;
}
else
{
pc->next->coef+=pcoef;
if(pc->next->coef==0) /*当pc的系数和不为零时*/
{
p=pc->next;
pc->next=pc->next->next;
delete p;
}
break;
}
}
}//while
if(pc->next==Null)
{
p=new LNode;
p->expn=pexpn;p->coef=pcoef;
pc->next=p;
pc=p;
pc->next=Null;
}
pq=pq->next;
pc=head;
}//while
pp=pp->next;
}//while
}//else
return head;
}
polynomial MultiplyPolyn1(polynomial s,polynomial t)
{
polynomial head,ha,pa,pb;
head=s;
ha=head->next;
pa=MultiplyPolyn1(head,t);
while(ha!=NULL)
{
head->next=ha->next;
delete ha;
ha=head->next;
pb=MultiplyPolyn1(head,t);
pa=AddPolyn(pa,pb);
}
return pa;
}
double vaulePolyn(polynomial s)
{
double sum1=0,sum2=0;
int i, pexpn;
float pcoef;
polynomial ha;
printf("\t请输入x的值:");
scanf("%d",&i);
ha=s;
ha=ha->next;
while(ha!=Null){
pcoef=ha->coef;
pexpn=ha->expn;
sum1=pcoef*pow(i,pexpn);
sum2+=sum1;
ha=ha->next;
}
printf("\t多项式在x处的值为:%lf",sum2);
getch();
return sum2;
}
void dPolyn(polynomial s)
{
polynomial ha,q;
int pexpn;
float pcoef;
ha=s;
q=ha;
ha=ha->next;
while(ha!=Null)
{
pcoef=ha->coef;
pexpn=ha->expn;
if(ha->expn!=0)
{
ha->coef=pcoef*pexpn;
ha->expn=pexpn-1;
q=ha;ha=ha->next;
}
else
{
q->next=ha->next;
delete(ha);
ha=q->next;
}
}
ha->next;
}
void display(polynomial &s,polynomial &t)
{
char y,c1='A',c2='B';
polynomial pa,pb;
system("cls");
printf(" 欢迎使用一元稀疏多项式计算器 \n");
printf("-------------------------------------------------------------------------------\n");
printf(" 软件4班 3104007083 陈景林 \n");
printf("-------------------------------------------------------------------------------\n");
printf(" [i]-->输入多项式 [q]-->退出系统 \n");
printf("-------------------------------------------------------------------------------\n");
printf("\n\t请选择您需要的功能:");
scanf("%c",&y);
switch(y)
{
case 'i':system("cls");
pa=CreatPolyn(c1);
pb=CreatPolyn(c2);
SortPolyn(pa);
SortPolyn(pb);
display1(pa,pb);
break;
case 'q':system("cls");
exit(0);
break;
default:
{
system("cls");
display(s,t);
}
break;
}
}
void display1(polynomial s,polynomial t)
{
char y,c1='A',c2='B';
system("cls");
printf("\n\n\n\n\n\n");
printf("\t 欢迎使用一元稀疏多项式计算器 \n");
printf("\t==============================================================\n");
printf("\t| * 一元稀疏多项式计算器 * |\n");
printf("\t|============================================================|\n");
printf("\t| |\n");
printf("\t|============================================================|\n");
printf("\t| [1]-->多项式相加 [2]-->多项式相减 |\n");
printf("\t| [3]-->多项式相乘 [4]-->多项式求值 |\n");
printf("\t| [5]-->多项式求导 [6]-->显示多项式 |\n");
printf("\t| [7]-->返回菜单 [8]-->退出系统 |\n");
printf("\t~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n");
printf("\n");
printf("\t请选择您需要的功能:");
scanf("%c",&y);
switch(y)
{
case '1':system("cls");
printf("\t现在执行多项式的加法运算:\n");
AddPolyn(s,t);
printf("\tA+B得到的多项式A为:\n");
PrintPolyn(s,c1);
display1(s,t);
break;
case '2':system("cls");
printf("\t现在执行多项式的减法运算:\n");
SubtractPolyn(s,t);
printf("\tA-B得到的多项式为:\n");
PrintPolyn(s,c1);
display1(s,t);
break;
case '3':system("cls");
printf("\t现在执行多项式的乘法运算:\n");
s=MultiplyPolyn(s,t);
printf("\tA*B得到的多项式为:\n");
PrintPolyn(s,c1);
display1(s,t);
break;
case '4':system("cls");
printf("\t现在执行多项式的求值运算:\n");
PrintPolyn(s,c1);
vaulePolyn(s);
display1(s,t);
break;
case '5':system("cls");
printf("\t现在执行多项式的求导运算:\n");
PrintPolyn(s,c1);
PrintPolyn(t,c2);
dPolyn(s);
dPolyn(t);
printf("\tA的导数A为:\n");
PrintPolyn(s,c1);
printf("\tA的导数B为:\n");
PrintPolyn(t,c2);
display1(s,t);
break;
case '8':system("cls");
exit(0);
case '7':system("cls");
display(s,t);
break;
case'6':system("cls");
PrintPolyn(s,c1);
PrintPolyn(t,c2);
display1(s,t);
break;
default:
{
system("cls");
display1(s,t);
}
break;
}
}
main()
{
polynomial pa,pb;
display(pa,pb);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -