一元稀疏多项式计算器的课程设计(数据结构)
我刚做的课程设计,完全符合你的要求,老师给我打了A+,包你满意!!!
//头文件
#include
#include
#include
//定义多项式的项
typedef struct Polynomial{
float coef;
int expn;
struct Polynomial *next;
}*Polyn,Polynomial;
void Insert(Polyn p,Polyn h){
if(p->coef==0) free(p);//系数为0的话释放结点
else
{
Polyn q1,q2;
q1=h;
q2=h->next;
while(q2&&p->expnexpn)
{//查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn)
{//将指数相同相合并
q2->coef+=p->coef;
free(p);
if(!q2->coef)
{//系数为0的话释放结点
q1->next=q2->next;
free(q2);
}
}
else
{//指数为新时将结点插入
p->next=q2;
q1->next=p;
}
}
}
Polyn CreatePolyn(Polyn head,int m){
//建立一个头指针为head、项数为m的一元多项式
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i<m;i++)
{
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:",i+1);
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}
void DestroyPolyn(Polyn p){
//销毁多项式p
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next;
}
}
void PrintPolyn(Polyn P){
Polyn q=P->next;
int flag=1;//项数计数器
if(!q)
{ //若多项式为空,输出0
putchar('0');
printf("
");
return;
}
while(q)
{
if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项
if(q->coef!=1&&q->coef!=-1)
{//系数非1或-1的普通情况
printf("%g",q->coef);
if(q->expn==1) putchar('X');
else if(q->expn) printf("X^%d",q->expn);
}
else
{
if(q->coef==1)
{
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("
");
}
int compare(Polyn a,Polyn b){
if(a&&b)
{
if(!b||a->expn>b->expn) return 1;
else if(!a||a->expnexpn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空
}
Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb)
{
qc=(Polyn)malloc(sizeof(struct Polynomial));
switch(compare(qa,qb)){
case 1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case 0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case -1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}
if(qc->coef!=0)
{
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
else free(qc);//当相加系数为0时,释放该结点
}
return headc;
}
Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a-b,返回其头指针
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
while(p)
{ //将pb的系数取反
p->coef*=-1;
p=p->next;
}
pd=AddPolyn(pa,h);
for(p=h->next;p;p=p->next) //恢复pb的系数
p->coef*=-1;
return pd;
}
int ValuePolyn(Polyn head,int x){
//输入x值,计算并返回多项式的值
Polyn p;
int i;
int sum=0,t;
for(p=head->next;p;p=p->next)
{
t=1;
for(i=p->expn;i!=0;)
{
if(i<0){t/=x;i++;}//指数小于0,进行除法
else{t*=x;i--;}//指数大于0,进行乘法
}
sum+=p->coef*t;
}
return sum;
}
Polyn Derivative(Polyn head){
//求解并建立导函数多项式,并返回其头指针
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hd->next=NULL;
while(q)
{
if(q->expn!=0)
{ //该项不是常数项时
p2=(Polyn)malloc(sizeof(struct Polynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
}
q=q->next;
}
return hd;
}
Polyn MultiplyPolyn(Polyn pa,Polyn pb){
//求解并建立多项式a*b,返回其头指针
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next)
{
for(qb=pb->next;qb;qb=qb->next)
{
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
return hf;
}
void main()
{
int m,n,a,x;
char flag;
Polyn pa=0,pb=0,pc;
printf(" 欢迎使用多项式操作程序
");
printf("请输入a的项数:");
scanf("%d",&m);
pa=CreatePolyn(pa,m);//建立多项式a
printf("请输入b的项数:");
scanf("%d",&n);
pb=CreatePolyn(pb,n);//建立多项式b
//输出菜单
printf(" *******************************************************
");
printf(" * 多项式操作程序 *
");
printf(" * *
");
printf(" * A:输出多项式 B:输出多项式b *
");
printf(" * *
");
printf(" * C:输出a的导数 D:输出b的导数 *
");
printf(" * *
");
printf(" * E:代入x的值计算a F:代入x的值计算b *
");
printf(" * *
");
printf(" * G:输出a+b H:输出a-b *
");
printf(" * *
");
printf(" * I:输出a*b J:退出程序 *
");
printf(" * *
");
printf(" *******************************************************
");
while(a)
{
printf("
请选择操作:");
scanf(" %c",&flag);//空格符号一定要注意
switch(flag)
{
case'A':
case'a':
{
printf("
多项式a=");
PrintPolyn(pa);
break;
}
case'B':
case'b':
{
printf("
多项式b=");
PrintPolyn(pb);
break;
}
case'C':
case'c':
{
pc=Derivative(pa);
printf("
多项式a的导函数为:a'=");
PrintPolyn(pc);
break;
}
case'D':
case'd':
{
pc=Derivative(pb);
printf("
多项式b的导函数为:b'=");
PrintPolyn(pc);
break;
}
case'E':
case'e':
{
printf("输入x的值:x=");
scanf("%d",&x);
printf("
x=%d时,a=%d
",x,ValuePolyn(pa,x));
break;
}
case'F':
case'f':
{
printf("输入x的值:x=");
scanf("%d",&x);
printf("
x=%d时,b=%d
",x,ValuePolyn(pb,x));
break;
}
case'G':
case'g':
{
pc=AddPolyn(pa,pb);
printf("
a+b=");
PrintPolyn(pc);
break;
}
case'H':
case'h':
{
pc=SubtractPolyn(pa,pb);
printf("
a-b=");
PrintPolyn(pc);
break;
}
case'I':
case'i':
{
pc=MultiplyPolyn(pa,pb);
printf("
a*b=");
PrintPolyn(pc);
break;
}
case'J':
case'j':
{
printf("
感谢使用此程序!
");
DestroyPolyn(pa);
DestroyPolyn(pb);
a=0;
break;
}
default:
printf("
您的选择错误,请重新选择!
");
}
}
}
#include
#include
#include
//定义项式项
typedef struct Polynomial
{
float coef;
int expn;
struct Polynomial *next;
}*Polyn,Polynomial;
void Insert(Polyn p,Polyn h)
{
if(p->coef==0) free(p);//系数0释放结点
else
{
Polyn q1,q2;
q1=h;
q2=h->next;
while(q2&&p->expnexpn)
{
//查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn)
{
//指数相同相合并
q2->coef+=p->coef;
free(p);
if(!q2->coef)
{
//系数0释放结点
q1->next=q2->next;
free(q2);
}
}
else
{
//指数新结点插入
p->next=q2;
q1->next=p;
}
}
}
Polyn CreatePolyn(Polyn head,int m)
{
//建立指针head、项数m元项式
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0; i<m; i++)
{
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点接收数据
printf("请输入第%d项系数与指数:",i+1);
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}
void DestroyPolyn(Polyn p)
{
//销毁项式p
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next;
}
}
void PrintPolyn(Polyn P)
{
Polyn q=P->next;
int flag=1;//项数计数器
if(!q)
{
//若项式空输0
putchar('0');
printf("
");
return;
}
while(q)
{
if(q->coef>0&&flag!=1) putchar('+'); //系数于0且第项
if(q->coef!=1&&q->coef!=-1)
{
//系数非1或-1普通情况
printf("%g",q->coef);
if(q->expn==1) putchar('X');
else if(q->expn) printf("X^%d",q->expn);
}
else
{
if(q->coef==1)
{
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("
");
}
int compare(Polyn a,Polyn b)
{
if(a&&b)
{
if(!b||a->expn>b->expn) return 1;
else if(!a||a->expnexpn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a项式已空b项式非空
else return 1;//b项式已空a项式非空
}
Polyn AddPolyn(Polyn pa,Polyn pb) //求解并建立项式a+b返其指针
{
Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立结点
hc->next=NULL;
headc=hc;
while(qa||qb)
{
qc=(Polyn)malloc(sizeof(struct Polynomial));
switch(compare(qa,qb))
{
case 1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case 0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case -1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}
if(qc->coef!=0)
{
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
else free(qc);//相加系数0释放该结点
}
return headc;
}
Polyn SubtractPolyn(Polyn pa,Polyn pb) //求解并建立项式a-b返其指针
{
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
while(p)
{
//pb系数取反
p->coef*=-1;
p=p->next;
}
pd=AddPolyn(pa,h);
for(p=h->next; p; p=p->next) //恢复pb系数
p->coef*=-1;
return pd;
}
int ValuePolyn(Polyn head,int x)
{
//输入x值计算并返项式值
Polyn p;
int i;
int sum=0,t;
for(p=head->next; p; p=p->next)
{
t=1;
for(i=p->expn; i!=0;)
{
if(i<0)
{
t/=x; //指数于0进行除
i++;
}
else
{
t*=x; //指数于0进行乘
i--;
}
}
sum+=p->coef*t;
}
return sum;
}
Polyn Derivative(Polyn head)
{
//求解并建立导函数项式并返其指针
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立结点
hd->next=NULL;
while(q)
{
if(q->expn!=0)
{
//该项数项
p2=(Polyn)malloc(sizeof(struct Polynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
}
q=q->next;
}
return hd;
}
Polyn MultiplyPolyn(Polyn pa,Polyn pb)
{
//求解并建立项式a*b返其指针
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立结点
hf->next=NULL;
for(; qa; qa=qa->next)
{
for(qb=pb->next; qb; qb=qb->next)
{
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数合并指数相同项
}
}
return hf;
}
void main()
{
int m,n,a,x;
char flag;
Polyn pa=0,pb=0,pc;
printf(" 欢迎使用项式操作程序
");
printf("请输入a项数:");
scanf("%d",&m);
pa=CreatePolyn(pa,m);//建立项式a
printf("请输入b项数:");
scanf("%d",&n);
pb=CreatePolyn(pb,n);//建立项式b
//输菜单
printf(" *******************************************************
");
printf(" * 项式操作程序 *
");
printf(" * *
");
printf(" * A:输项式 B:输项式b *
");
printf(" * *
");
printf(" * C:输a导数 D:输b导数 *
");
printf(" * *
");
printf(" * E:代入x值计算a F:代入x值计算b *
");
printf(" * *
");
printf(" * G:输a+b H:输a-b *
");
printf(" * *
");
printf(" * I:输a*b J:退程序 *
");
printf(" * *
");
printf(" *******************************************************
");
while(a)
{
printf("
请选择操作:");
scanf(" %c",&flag);//空格符号定要注意
switch(flag)
{
case'A':
case'a':
{
printf("
项式a=");
PrintPolyn(pa);
break;
}
case'B':
case'b':
{
printf("
项式b=");
PrintPolyn(pb);
break;
}
case'C':
case'c':
{
pc=Derivative(pa);
printf("
项式a导函数:a'=");
PrintPolyn(pc);
break;
}
case'D':
case'd':
{
pc=Derivative(pb);
printf("
项式b导函数:b'=");
PrintPolyn(pc);
break;
}
case'E':
case'e':
{
printf("输入x值:x=");
scanf("%d",&x);
printf("
x=%da=%d
",x,ValuePolyn(pa,x));
break;
}
case'F':
case'f':
{
printf("输入x值:x=");
scanf("%d",&x);
printf("
x=%db=%d
",x,ValuePolyn(pb,x));
break;
}
case'G':
case'g':
{
pc=AddPolyn(pa,pb);
printf("
a+b=");
PrintPolyn(pc);
break;
}
case'H':
case'h':
{
pc=SubtractPolyn(pa,pb);
printf("
a-b=");
PrintPolyn(pc);
break;
}
case'I':
case'i':
{
pc=MultiplyPolyn(pa,pb);
printf("
a*b=");
PrintPolyn(pc);
break;
}
case'J':
case'j':
{
printf("
谢使用程序
");
DestroyPolyn(pa);
DestroyPolyn(pb);
a=0;
break;
}
default:
printf("
您选择错误请重新选择!
");
}
}
}
//头文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//定义多项式的项
typedef struct Polynomial{
float coef;
int expn;
struct Polynomial *next;
}*Polyn,Polynomial;
void Insert(Polyn p,Polyn h){
if(p->coef==0) free(p);//系数为0的话释放结点
else
{
Polyn q1,q2;
q1=h;
q2=h->next;
while(q2&&p->expn<q2->expn)
{//查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn)
{//将指数相同相合并
q2->coef+=p->coef;
free(p);
if(!q2->coef)
{//系数为0的话释放结点
q1->next=q2->next;
free(q2);
}
}
else
{//指数为新时将结点插入
p->next=q2;
q1->next=p;
}
}
}
Polyn CreatePolyn(Polyn head,int m){
//建立一个头指针为head、项数为m的一元多项式
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i<m;i++)
{
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:",i+1);
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}
void DestroyPolyn(Polyn p){
//销毁多项式p
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next;
}
}
void PrintPolyn(Polyn P){
Polyn q=P->next;
int flag=1;//项数计数器
if(!q)
{ //若多项式为空,输出0
putchar('0');
printf("
");
return;
}
while(q)
{
if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项
if(q->coef!=1&&q->coef!=-1)
{//系数非1或-1的普通情况
printf("%g",q->coef);
if(q->expn==1) putchar('X');
else if(q->expn) printf("X^%d",q->expn);
}
else
{
if(q->coef==1)
{
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("
");
}
int compare(Polyn a,Polyn b){
if(a&&b)
{
if(!b||a->expn>b->expn) return 1;
else if(!a||a->expn<b->expn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空
}
Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb)
{
qc=(Polyn)malloc(sizeof(struct Polynomial));
switch(compare(qa,qb)){
case 1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case 0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case -1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}
if(qc->coef!=0)
{
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
else free(qc);//当相加系数为0时,释放该结点
}
return headc;
}
Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a-b,返回其头指针
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
while(p)
{ //将pb的系数取反
p->coef*=-1;
p=p->next;
}
pd=AddPolyn(pa,h);
for(p=h->next;p;p=p->next) //恢复pb的系数
p->coef*=-1;
return pd;
}
int ValuePolyn(Polyn head,int x){
//输入x值,计算并返回多项式的值
Polyn p;
int i;
int sum=0,t;
for(p=head->next;p;p=p->next)
{
t=1;
for(i=p->expn;i!=0;)
{
if(i<0){t/=x;i++;}//指数小于0,进行除法
else{t*=x;i--;}//指数大于0,进行乘法
}
sum+=p->coef*t;
}
return sum;
}
Polyn Derivative(Polyn head){
//求解并建立导函数多项式,并返回其头指针
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hd->next=NULL;
while(q)
{
if(q->expn!=0)
{ //该项不是常数项时
p2=(Polyn)malloc(sizeof(struct Polynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
}
q=q->next;
}
return hd;
}
Polyn MultiplyPolyn(Polyn pa,Polyn pb){
//求解并建立多项式a*b,返回其头指针
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next)
{
for(qb=pb->next;qb;qb=qb->next)
{
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
return hf;
}
void main()
{
int m,n,a,x;
char flag;
Polyn pa=0,pb=0,pc;
printf(" 欢迎使用多项式操作程序
");
printf("请输入a的项数:");
scanf("%d",&m);
pa=CreatePolyn(pa,m);//建立多项式a
printf("请输入b的项数:");
scanf("%d",&n);
pb=CreatePolyn(pb,n);//建立多项式b
//输出菜单
printf(" *******************************************************
");
printf(" * 多项式操作程序 *
");
printf(" * *
");
printf(" * A:输出多项式 B:输出多项式b *
");
printf(" * *
");
printf(" * C:输出a的导数 D:输出b的导数 *
");
printf(" * *
");
printf(" * E:代入x的值计算a F:代入x的值计算b *
");
printf(" * *
");
printf(" * G:输出a+b H:输出a-b *
");
printf(" * *
");
printf(" * I:输出a*b J:退出程序 *
");
printf(" * *
");
printf(" *******************************************************
");
while(a)
{
printf("
请选择操作:");
scanf(" %c",&flag);//空格符号一定要注意
switch(flag)
{
case'A':
case'a':
{
printf("
多项式a=");
PrintPolyn(pa);
break;
}
case'B':
case'b':
{
printf("
多项式b=");
PrintPolyn(pb);
break;
}
case'C':
case'c':
{
pc=Derivative(pa);
printf("
多项式a的导函数为:a'=");
PrintPolyn(pc);
break;
}
case'D':
case'd':
{
pc=Derivative(pb);
printf("
多项式b的导函数为:b'=");
PrintPolyn(pc);
break;
}
case'E':
case'e':
{
printf("输入x的值:x=");
scanf("%d",&x);
printf("
x=%d时,a=%d
",x,ValuePolyn(pa,x));
break;
}
case'F':
case'f':
{
printf("输入x的值:x=");
scanf("%d",&x);
printf("
x=%d时,b=%d
",x,ValuePolyn(pb,x));
break;
}
case'G':
case'g':
{
pc=AddPolyn(pa,pb);
printf("
a+b=");
PrintPolyn(pc);
break;
}
case'H':
case'h':
{
pc=SubtractPolyn(pa,pb);
printf("
a-b=");
PrintPolyn(pc);
break;
}
case'I':
case'i':
{
pc=MultiplyPolyn(pa,pb);
printf("
a*b=");
PrintPolyn(pc);
break;
}
case'J':
case'j':
{
printf("
感谢使用此程序!
");
DestroyPolyn(pa);
DestroyPolyn(pb);
a=0;
break;
}
default:
printf("
您的选择错误,请重新选择!
");
}
}
}
把楼上的回答用代码格式重新排版了一下,方便阅读
我刚做好的课程设计,得了个A+,免费给你了,包你满意,几乎没有漏洞!
//头文件
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
//定义多项式的项
typedef struct Polynomial{
float coef;
int expn;
struct Polynomial *next;
}*Polyn,Polynomial;
void Insert(Polyn p,Polyn h){
if(p->coef==0) free(p);//系数为0的话释放结点
else
{
Polyn q1,q2;
q1=h;
q2=h->next;
while(q2&&p->expn<q2->expn)
{//查找插入位置
q1=q2;
q2=q2->next;
}
if(q2&&p->expn==q2->expn)
{//将指数相同相合并
q2->coef+=p->coef;
free(p);
if(!q2->coef)
{//系数为0的话释放结点
q1->next=q2->next;
free(q2);
}
}
else
{//指数为新时将结点插入
p->next=q2;
q1->next=p;
}
}
}
Polyn CreatePolyn(Polyn head,int m){
//建立一个头指针为head、项数为m的一元多项式
int i;
Polyn p;
p=head=(Polyn)malloc(sizeof(struct Polynomial));
head->next=NULL;
for(i=0;i<m;i++)
{
p=(Polyn)malloc(sizeof(struct Polynomial));//建立新结点以接收数据
printf("请输入第%d项的系数与指数:",i+1);
scanf("%f %d",&p->coef,&p->expn);
Insert(p,head); //调用Insert函数插入结点
}
return head;
}
void DestroyPolyn(Polyn p){
//销毁多项式p
Polyn q1,q2;
q1=p->next;
q2=q1->next;
while(q1->next)
{
free(q1);
q1=q2;
q2=q2->next;
}
}
void PrintPolyn(Polyn P){
Polyn q=P->next;
int flag=1;//项数计数器
if(!q)
{ //若多项式为空,输出0
putchar('0');
printf("\n");
return;
}
while(q)
{
if(q->coef>0&&flag!=1) putchar('+'); //系数大于0且不是第一项
if(q->coef!=1&&q->coef!=-1)
{//系数非1或-1的普通情况
printf("%g",q->coef);
if(q->expn==1) putchar('X');
else if(q->expn) printf("X^%d",q->expn);
}
else
{
if(q->coef==1)
{
if(!q->expn) putchar('1');
else if(q->expn==1) putchar('X');
else printf("X^%d",q->expn);
}
if(q->coef==-1)
{
if(!q->expn) printf("-1");
else if(q->expn==1) printf("-X");
else printf("-X^%d",q->expn);
}
}
q=q->next;
flag++;
}
printf("\n");
}
int compare(Polyn a,Polyn b){
if(a&&b)
{
if(!b||a->expn>b->expn) return 1;
else if(!a||a->expn<b->expn) return -1;
else return 0;
}
else if(!a&&b) return -1;//a多项式已空,但b多项式非空
else return 1;//b多项式已空,但a多项式非空
}
Polyn AddPolyn(Polyn pa,Polyn pb){//求解并建立多项式a+b,返回其头指针
Polyn qa=pa->next;
Polyn qb=pb->next;
Polyn headc,hc,qc;
hc=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hc->next=NULL;
headc=hc;
while(qa||qb)
{
qc=(Polyn)malloc(sizeof(struct Polynomial));
switch(compare(qa,qb)){
case 1:
{
qc->coef=qa->coef;
qc->expn=qa->expn;
qa=qa->next;
break;
}
case 0:
{
qc->coef=qa->coef+qb->coef;
qc->expn=qa->expn;
qa=qa->next;
qb=qb->next;
break;
}
case -1:
{
qc->coef=qb->coef;
qc->expn=qb->expn;
qb=qb->next;
break;
}
}
if(qc->coef!=0)
{
qc->next=hc->next;
hc->next=qc;
hc=qc;
}
else free(qc);//当相加系数为0时,释放该结点
}
return headc;
}
Polyn SubtractPolyn(Polyn pa,Polyn pb){//求解并建立多项式a-b,返回其头指针
Polyn h=pb;
Polyn p=pb->next;
Polyn pd;
while(p)
{ //将pb的系数取反
p->coef*=-1;
p=p->next;
}
pd=AddPolyn(pa,h);
for(p=h->next;p;p=p->next) //恢复pb的系数
p->coef*=-1;
return pd;
}
int ValuePolyn(Polyn head,int x){
//输入x值,计算并返回多项式的值
Polyn p;
int i;
int sum=0,t;
for(p=head->next;p;p=p->next)
{
t=1;
for(i=p->expn;i!=0;)
{
if(i<0){t/=x;i++;}//指数小于0,进行除法
else{t*=x;i--;}//指数大于0,进行乘法
}
sum+=p->coef*t;
}
return sum;
}
Polyn Derivative(Polyn head){
//求解并建立导函数多项式,并返回其头指针
Polyn q=head->next,p1,p2,hd;
hd=p1=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hd->next=NULL;
while(q)
{
if(q->expn!=0)
{ //该项不是常数项时
p2=(Polyn)malloc(sizeof(struct Polynomial));
p2->coef=q->coef*q->expn;
p2->expn=q->expn-1;
p2->next=p1->next;//连接结点
p1->next=p2;
p1=p2;
}
q=q->next;
}
return hd;
}
Polyn MultiplyPolyn(Polyn pa,Polyn pb){
//求解并建立多项式a*b,返回其头指针
Polyn hf,pf;
Polyn qa=pa->next;
Polyn qb=pb->next;
hf=(Polyn)malloc(sizeof(struct Polynomial));//建立头结点
hf->next=NULL;
for(;qa;qa=qa->next)
{
for(qb=pb->next;qb;qb=qb->next)
{
pf=(Polyn)malloc(sizeof(struct Polynomial));
pf->coef=qa->coef*qb->coef;
pf->expn=qa->expn+qb->expn;
Insert(pf,hf);//调用Insert函数以合并指数相同的项
}
}
return hf;
}
void main()
{
int m,n,a,x;
char flag;
Polyn pa=0,pb=0,pc;
printf(" 欢迎使用多项式操作程序\n\n");
printf("请输入a的项数:");
scanf("%d",&m);
pa=CreatePolyn(pa,m);//建立多项式a
printf("请输入b的项数:");
scanf("%d",&n);
pb=CreatePolyn(pb,n);//建立多项式b
//输出菜单
printf(" *******************************************************\n");
printf(" * 多项式操作程序 *\n");
printf(" * *\n");
printf(" * A:输出多项式 B:输出多项式b *\n");
printf(" * *\n");
printf(" * C:输出a的导数 D:输出b的导数 *\n");
printf(" * *\n");
printf(" * E:代入x的值计算a F:代入x的值计算b *\n");
printf(" * *\n");
printf(" * G:输出a+b H:输出a-b *\n");
printf(" * *\n");
printf(" * I:输出a*b J:退出程序 *\n");
printf(" * *\n");
printf(" *******************************************************\n");
while(a)
{
printf("\n请选择操作:");
scanf(" %c",&flag);//空格符号一定要注意
switch(flag)
{
case'A':
case'a':
{
printf("\n 多项式a=");
PrintPolyn(pa);
break;
}
case'B':
case'b':
{
printf("\n 多项式b=");
PrintPolyn(pb);
break;
}
case'C':
case'c':
{
pc=Derivative(pa);
printf("\n 多项式a的导函数为:a'=");
PrintPolyn(pc);
break;
}
case'D':
case'd':
{
pc=Derivative(pb);
printf("\n 多项式b的导函数为:b'=");
PrintPolyn(pc);
break;
}
case'E':
case'e':
{
printf("输入x的值:x=");
scanf("%d",&x);
printf("\n x=%d时,a=%d\n",x,ValuePolyn(pa,x));
break;
}
case'F':
case'f':
{
printf("输入x的值:x=");
scanf("%d",&x);
printf("\n x=%d时,b=%d\n",x,ValuePolyn(pb,x));
break;
}
case'G':
case'g':
{
pc=AddPolyn(pa,pb);
printf("\n a+b=");
PrintPolyn(pc);
break;
}
case'H':
case'h':
{
pc=SubtractPolyn(pa,pb);
printf("\n a-b=");
PrintPolyn(pc);
break;
}
case'I':
case'i':
{
pc=MultiplyPolyn(pa,pb);
printf("\n a*b=");
PrintPolyn(pc);
break;
}
case'J':
case'j':
{
printf("\n 感谢使用此程序!\n");
DestroyPolyn(pa);
DestroyPolyn(pb);
a=0;
break;
}
default:
printf("\n 您的选择错误,请重新选择!\n");
}
}
}
一元稀疏多项式计算器的课程设计(数据结构)视频
相关评论:
滕美旭(1) 输入并建立多项式 (2) 输出多项式,输出形式为整数序列:n,c1,e1,c2,e2,...,Cn,en,其中n是多项式的相数,Ci和Ei分别是第i项的系数和指数,序列按指数降序排列 (3) 两个多项式相加,建立并输出和多项式 (4) 两个多项式相减,建立并输出差多项式 (5) 两个多项式相乘, 建立乘积多项式 (6) 计算多项式在x...
滕美旭输入说明:一组输入数据,所有数据均为整数。第1行为2个正整数n,m,其中 n表示第一个多项式的项数,m表示第二个多项式的项数。第2行包含2n个整数,每两个整数分别表示第一个多项式每一项的系数和指数;第3行包含2m个整数,每两个整数分别表示第二个多项式每一项的系数和指数。(注:序列按指数升序...
滕美旭void DestroyPolyn(Polyn p){ \/\/销毁多项式p Polyn q1,q2;q1=p->next;q2=q1->next;while(q1->next){ free(q1);q1=q2;q2=q2->next;} } void PrintPolyn(Polyn P){ Polyn q=P->next;int flag=1;\/\/项数计数器 if(!q){ \/\/若多项式为空,输出0 putchar('0');printf("\\n");re...
滕美旭1 存储结构与基本运算的算法4.2 看病排队候诊问题4.3 数制的转换4.4 停车场管理4.5 基数排序第5章 串的应用5.1 存储结构与基本运算的算法5.2 KMP算法5.3 最长公共子串5.4 大整数计算器第6章 多维数组和广义表的应用6.1 存储结构与基本运算的算法6.2 魔方阵6.3 稀疏矩阵的加法...
滕美旭三十六、并将模加、模乘、模平方 运算 集中设计成了一个多功能运算器,使控制电路更加简单。 三十七、并在几何直观分析的基础上,为模糊数的四则 运算 提出了一种比较简便可行的运算方法。 三十八、在高等代数教课书中,关于多项式的除法 运算 中余项的确定是以余式定理为依据且利用带余除法进行的,这是大家所熟悉...
滕美旭int flag=1;\/\/项数计数器 if(!q) { \/\/若多项式为空,输出0 putchar('0');printf("\\n");return;} while (q){ if(q->coef>0&&flag!=1) putchar('+'); \/\/系数大于0且不是第一项 if(q->coef!=1&&q->coef!=-1){\/\/系数非1或-1的普通情况 printf("%g",q->coef);if(q-...
滕美旭Polyn CreatePolyn(Polyn head,int m){\/\/建立一个头指针为head、项数为m的一元多项式 int i;Polyn p;p=head=(Polyn)malloc(sizeof(struct Polynomial));head->next=NULL;for(i=0;i<m;i++){ p=(Polyn)malloc(sizeof(struct Polynomial));\/\/建立新结点以接收数据 printf("请输入第%d项的...