如果用循环链表表示一元多项式,计算在X处的值 程序怎么写?最好是c语言或者c++
答案:2 悬赏:50 手机版
解决时间 2021-02-01 18:59
- 提问者网友:我没有何以琛的痴心不悔
- 2021-02-01 12:49
如果用循环链表表示一元多项式,计算在X处的值 程序怎么写?最好是c语言或者c++
最佳答案
- 五星知识达人网友:孤独的牧羊人
- 2021-02-01 13:37
#include
//定义多项式结构体,p为系数,n为x的指数,next指向下一个元素
typedef struct node{
float p;
int n;
struct node *next;
}polynomial;
float CalPXN(polynomial *head,float x,int len)
//计算多项式链表数值,head为多项式头指针,x为数值,len为多项式元素个数。函数返回计算结果;
{
int i;
float value,sum=0;
polynomial *sp;
float CalXN(float x ,int n);
sp=head;
for(i=0;i
{
value=(sp->p)*CalXN(x,sp->n);
sum=sum+value;
sp++;
}
return(sum);
}
float CalXN(float x ,int n)
//计算x的n次幂,函数返回计算结果
{
int i;
float sum=1;
for(i=1;i<=n;i++)
sum=sum*x;
return sum;
}
void main()
{
polynomial *head,p[3];//链表首元素为p[0],尾元素为p[3],含有三个元素
int i;
float ans;
head=&p[0];
for(i=0;i<3;i++)
//用于链表初始化,构建循环链表,链表初始化为:1*x1+2*x2+3*x3,即1乘x一次幂加到3乘x的3次幂。
{
p[i].p=(float)(i+1);
p[i].n=i+1;
if(i==2) p[i].next=head;//即令p[2]->next=head;构成循环链表
else p[i].next=&p[i+1];
}
ans=CalPXN(head,1.5,3);//x=1.5
printf("ans=%f\n",ans);
getchar();
}
我用的vc6.0编译器,如果你用tc2.0的话,建议把注释全部删去,包括//符号和后面的文字。我这里把多项式设计为只有三个元素,比较简单,具体情况你自己在改下就ok了。请多注意下我的开头多项式结构定义。如果你多项式结构改变了,那么相应的函数也要改变下。
//定义多项式结构体,p为系数,n为x的指数,next指向下一个元素
typedef struct node{
float p;
int n;
struct node *next;
}polynomial;
float CalPXN(polynomial *head,float x,int len)
//计算多项式链表数值,head为多项式头指针,x为数值,len为多项式元素个数。函数返回计算结果;
{
int i;
float value,sum=0;
polynomial *sp;
float CalXN(float x ,int n);
sp=head;
for(i=0;i
value=(sp->p)*CalXN(x,sp->n);
sum=sum+value;
sp++;
}
return(sum);
}
float CalXN(float x ,int n)
//计算x的n次幂,函数返回计算结果
{
int i;
float sum=1;
for(i=1;i<=n;i++)
sum=sum*x;
return sum;
}
void main()
{
polynomial *head,p[3];//链表首元素为p[0],尾元素为p[3],含有三个元素
int i;
float ans;
head=&p[0];
for(i=0;i<3;i++)
//用于链表初始化,构建循环链表,链表初始化为:1*x1+2*x2+3*x3,即1乘x一次幂加到3乘x的3次幂。
{
p[i].p=(float)(i+1);
p[i].n=i+1;
if(i==2) p[i].next=head;//即令p[2]->next=head;构成循环链表
else p[i].next=&p[i+1];
}
ans=CalPXN(head,1.5,3);//x=1.5
printf("ans=%f\n",ans);
getchar();
}
我用的vc6.0编译器,如果你用tc2.0的话,建议把注释全部删去,包括//符号和后面的文字。我这里把多项式设计为只有三个元素,比较简单,具体情况你自己在改下就ok了。请多注意下我的开头多项式结构定义。如果你多项式结构改变了,那么相应的函数也要改变下。
全部回答
- 1楼网友:过活
- 2021-02-01 14:50
你的 creat_polynode()是需要修改传人的指针的,那么应该使用指向指针的指针。如果你在main函数里link a=null;,那么在print_polynode()的时候,你会发现a还是等于null。
你的create函数可以采用以下任何一个。
int creat_polynode(link *h)
{
polynode *p;int i;
*h=(link)malloc(sizeof(polynode));
if(*h==null) return 0;
(*h)->next=null;
for(i=0;;i++)
{
p=(link)malloc(sizeof(polynode));
if(p==null) return 0;
scanf("%f",&p->coef);
scanf("%d",&p->exp);
p->next=(*h)->next;(*h)->next=p;
if(p->coef==0&&p->exp==0)break;
}
return 1;
}
link creat_polynode2()
{
polynode *h,*p;int i;
h=(link)malloc(sizeof(polynode));
if(h==null) return null;
h->next=null;
for(i=0;;i++)
{
p=(link)malloc(sizeof(polynode));
if(p==null) return null;
scanf("%f",&p->coef);
scanf("%d",&p->exp);
p->next=h->next;h->next=p;
if(p->coef==0&&p->exp==0)break;
}
return h;
}
注意:
1.你的coef是浮点数,输入采用%f格式,不是%d。在print里面也要用%f输出或%g自动有效浮点数输出。
2.使用malloc之后,最好判断分配是否成功,如果没成功,p->next这种操作就异常退出了,我们应该对这些采用主动处理。
3.包括2在内,所有指针,都需要检测其安全性。
全程序:
#include
#include
typedef struct polynode
{
float coef;
int exp;
struct polynode *next;
}polynode,*link;
int creat_polynode(link *h)
{
polynode *p;int i;
if(h==null) return 0;
*h=(link)malloc(sizeof(polynode));
if(*h==null) return 0;
(*h)->next=null;
for(i=0;;i++)
{
p=(link)malloc(sizeof(polynode));
if(p==null) return 0;
scanf("%f",&p->coef);
scanf("%d",&p->exp);
p->next=(*h)->next;(*h)->next=p;
if(p->coef==0&&p->exp==0)break;
}
return 1;
}
link creat_polynode2()
{
polynode *h,*p;int i;
h=(link)malloc(sizeof(polynode));
if(h==null) return null;
h->next=null;
for(i=0;;i++)
{
p=(link)malloc(sizeof(polynode));
if(p==null) return null;
scanf("%f",&p->coef);
scanf("%d",&p->exp);
p->next=h->next;h->next=p;
if(p->coef==0&&p->exp==0)break;
}
return h;
}
void print_polynode(link h)
{
polynode *p;
if(h==null) return;
for(p=h->next;p!=null;p=p->next)
{
printf("%gx^%d",p->coef,p->exp);
if(p->next!=null)
printf("+");
}
}
int main()
{
link a=null;
creat_polynode(&a);
print_polynode(a);
system("pause");
return 0;
}
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯