标题:[讨论]一元多项式计算
只看楼主
无奈的人
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2006-1-10
 问题点数:0 回复次数:10 
[讨论]一元多项式计算
一元多项式计算
要求:能够按照指数降序排列建立并输出多项式;能够完成两个多项式的相加、相减,并将结果输出。
大家帮忙看看这个程序的对错,谢谢~~~

#include<stdio.h>
#include<malloc.h>

typedef struct{
float coef;
int expn;
}Elemtype;

typedef struct node{
Elemtype date;
struct node* next;
}node,*polynomial;

void Initpoly(polynomial &p)
{
p=(polynomial)malloc(sizeof(node));
p->date.expn=0;
p->date.coef=0.0;
p->next=NULL;
} //初始化链表

int cmp(Elemtype a1,Elemtype a2)
{
if(a1.expn>a2.expn)return 1;
if(a1.expn<a2.expn)return -1;
else return 0;
}//比较两个结点

void Insertpoly(polynomial p1,Elemtype e)
{
polynomial p=p1,pnew;
pnew=(polynomial)malloc(sizeof(node));
while(p->next!=NULL)
{
if(cmp(p->next->date,e)==-1) p=p->next;
else break;
}
pnew->date=e;
pnew->next=NULL;

if(cmp(p->date,e)==0)p->date.coef+=e.coef;

else
{
pnew->next=p->next;p->next=pnew;
}

}//按序插入结点

void Creatpoly(polynomial & poly)
{
static int i=1;
Elemtype e;
printf("请输入第%d个多项式的系数与指数 以 系数 指数的形式输入\n",i);
scanf("%f %d",&e.coef,&e.expn);
Initpoly(poly);
while(e.coef!=0||e.expn!=0)
{
Insertpoly(poly,e);
scanf("%f %d",&e.coef,&e.expn);
}
i++;

}//创造一个链表

void Appendpoly(polynomial &p1,polynomial &p2)
{
polynomial p=p1;
while(p->next!=NULL)
{p=p->next;}
p->next=p2;
}//两个链表相接

void Addpoly(polynomial p1,polynomial p2)
{
polynomial p=p1->next,h=p2->next;
while(p!=NULL&&h!=NULL)
{
switch(cmp(p->date,h->date))
{
case 1:
{
Insertpoly(p1,h->date);
h=h->next;
break;
}
case 0:
{
p->date.coef+=h->date.coef;
p=p->next;h=h->next;
break;
}
case -1:
{
Insertpoly(p,h->date);
h=h->next;
p=p->next;
break;
}
}
}
if(h!=NULL)Appendpoly(p1,h);
printf("两个多项式的和为:\n");

}//两个多项式相加

void Destroypoly(polynomial p)
{
while(p!=NULL)
{
polynomial p1=p;
p=p->next;
free(p1);
}
}//释放存储空间

void Printpoly(polynomial p)
{
polynomial p1=p->next;
printf("(%f %d)",p1->date.coef,p1->date.expn);
p1=p1->next;
while(p1!=NULL)
{
printf("+(%f %d)",p1->date.coef,p1->date.expn);
p1=p1->next;
}
printf("\n");

}//打印多项式

void main()
{
polynomial p1;
Creatpoly(p1);
Printpoly(p1);

polynomial p2;
Creatpoly(p2);
Printpoly(p2);
Addpoly(p1,p2);
Printpoly(p1);
Destroypoly(p2);
Destroypoly(p1);
}

大家有没有更简单的方法 谢谢阿!~

搜索更多相关主题的帖子: 多项式 STRONG node struct polynomial 
2006-01-10 15:04
yaojing1122
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-1-18
得分:0 

#include<stdio.h>
#include<stdlib.h>

typedef struct node
{ int coef;

int exp;

struct node *next;

}Node;

int string_change_num(char *start,int *end);

Node *string_change_link(int *end,int n);

Node *order(Node *head);

Node *unite(Node *head);

void print (Node *head);

void main()
{ Node *head,*head1;

char str[255];

int i,end[255],n;

printf("输入字符,以'='号结束:\n\n");

printf("例如要输入 3x^3+4x^3,就要输入3x3+4x3\n\n");
for(i=0;i<255;i++)
{
scanf("%c",&str[i]);

if(str[i]=='=')

break;
}

str[i]='\0';

n=string_change_num(str,end);

head=string_change_link(end,n);

head1=order(head);

printf("按照指数从小到大排序的多项式:\n\n");

print(head1);

printf("\n");

printf("合并后的多项式是:\n");

head1=unite(head);

head=order(head1);

print(head);

printf("\n");
}

int string_change_num(char *start,int *end)
{ int i=0,j=0,k,sum=0,c=0,flag=1;

while(start[i]!='\0')
{
if(start[i]=='x'||start[i]=='+'||start[i]=='-')
{
if(start[i]=='x'&&start[j-1]=='-')

flag=0;

if(start[i]=='x'&&start[j-1]=='+')

flag=1;

for(k=j;k<i;k++)

sum=sum*10+start[k]-'0';

if(flag==0)
{
sum=-sum;

flag=1;
}

end[c++]=sum;

sum=0;

j=i+1;
}
i++;
}
while(start[j]>'0'&&start[j]<'9')
{ sum=sum*10+start[j]-'0';

j++;
}

end[c++]=sum;

return c;

}

Node *string_change_link(int *end,int n)
{ Node *head,*p,*s;

int i=0;

head=(Node *)malloc(sizeof(Node));

head->next=NULL;

p=head;

while(i<n)
{
s=(Node *)malloc(sizeof(Node));

if(i%2==0)

s->coef=end[i];

i++;

if(i%2!=0)

s->exp=end[i];

p->next=s;

p=s;

i++;
}

p->next=NULL;

return head;
}

Node *order(Node *head)
{ Node *p,*q,*t,*s,*h;
h=(Node *)malloc(sizeof(Node));
h->next=head;
p=h;
while(p->next->next!=NULL)
{
for(s=p,q=p->next;q->next!=NULL;q=q->next)

if(q->next->exp<s->next->exp)

s=q;
if(s!=q)
{
t=s->next;

s->next=t->next;

t->next=p->next;

p->next=t;
}
p=p->next;
}
head=h->next;

free(h);

return head;
}

Node *unite(Node *head)
{ Node *p,*q,*q1,*p1;

q1=head;

p1=head;

p=head->next;

q=p->next;

while(p->next!=NULL)
{
for(q=p->next;q!=NULL;q=q->next)
{
if(p->exp==q->exp)
{
while(q1->next!=q)

q1=q1->next;

while(p1->next!=p)

p1=p1->next;

if(p->coef+q->coef==0)
{
if(q==p->next)
{
p1->next=q->next;

free(q);

free(p);

q=p1;

p=p1;

}
else{
p1->next=p->next;

free(p);

p=p1;

q1->next=q->next;

free(q);

q=q1;
}
p1=head;

q1=head;
}
else{
p->coef=p->coef+q->coef;

q1->next=q->next;

free(q);

q=q1;

p1=head;

q1=head;
}
}
}
if(p->next!=NULL)

p=p->next;
if(p->next==NULL)

break;
}
return head;
}

void print(Node *head)
{ Node *p;

p=head->next;

if(p==NULL)

printf("0");

else
{
if(p->exp==0)

printf("%d",p->coef);

else
if(p->exp==1)

printf("%dx",p->coef);

else

if(p->coef==1)

printf("x^%d",p->exp);

else if(p->coef==-1)

printf("-x^%d",p->exp);

else

printf("%dx^%d",p->coef,p->exp);
p=p->next;

while(p!=NULL)
{
if(p->exp==0)

printf("%d",p->coef);

else
if(p->exp==1)
{
if(p->coef>0)

printf("+%dx",p->coef);

else printf("%d",p->coef);
}

else if(p->coef>0&&p->coef!=1&&p->exp!=-1)

printf("+%dx^%d",p->coef,p->exp);

else if(p->coef<0&&p->coef!=1&&p->exp!=-1)

printf("%dx^%d",p->coef,p->exp);

else if(p->coef==1)

printf("+x^%d",p->exp);

else if(p->coef==-1)

printf("-x^%d",p->exp);

p=p->next;
}

}
}


2006-01-18 12:41
XIAOHUA
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-2-21
得分:0 
一帮强人!
2006-02-21 18:50
sxsx
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-4-17
得分:0 

一帮强人,顶!!!!!!!!!!!!

2006-04-17 21:24
xiao_pig
Rank: 1
等 级:新手上路
帖 子:14
专家分:0
注 册:2006-4-20
得分:0 


//一元稀疏多项式简单计算器

#include<iostream.h>

typedef struct Node{ //定义单链表结点

int expn;
float coef;
Node* next;

}*linklist;

linklist create(int n) //建立带头结点的单链表
{
linklist p,q,r;
int i;

r=new Node;
p=new Node;
r->next=p;
cin>>p->expn;
cin>>p->coef;

for(i=0;i<n-1;i++)
{
q=new Node;
cin>>q->expn;
cin>>q->coef;
p->next=q;
p=q;
}
p->next=NULL;

return (r);
}


void output(linklist p,int n) //多项式的输出
{
int i;
linklist q;

cout<<n<<'\t';
q=p->next;
for(i=0;i<n;i++)

{
cout<<q->coef;
cout<<q->expn<<'\t';
q=q->next;
}

}

int compare(int a,int b) //指数比较函数,并返回一整型值
{
if(a==b)return 0;
else if(a<b)return -1;
else return 1;
}


void caculation(linklist &qa,linklist &qb,int &m,int &n, char s) //多项式的计算
{
linklist pa,pb,p,q,r;
float value;
pa=qa->next;
pb=qb->next;
p=qa;
q=qb;
while(pa&&pb)
{
switch(compare(pa->expn,pb->expn)) //compare函数的返回值进行分类
{
case -1: p=p->next;pa=pa->next;break;

case 0: if(s=='a')
value=pa->coef+pb->coef;

else if(s=='s')
value=pa->coef-pb->coef;

if(value!=0)
pa->coef=value;

else
{
p->next=pa->next;
r=pa;
pa=pa->next;
delete r;
m--;
}

q->next=pb->next;
r=pb;
pb=pb->next;
delete r;
n--;
break;

case 1: p->next=pb;
q->next=pb->next;
pb->next=pa;
pb=q->next;
p=p->next;
m++;n--;
break;
}

}
if(pb)
{
p->next=pb;
m=m+n;
}

delete q;

}


void main() //主函数
{
int a,b;
linklist ha,hb;
char ans,reply='y';

while(reply=='y')
{
cout<<"Now,Input the number of polyn A:"<<endl;
cin>>a;

cout<<"Now,Input the number of polyn B:"<<endl;
cin>>b;


cout<<"Now,Enter the polyn A:"<<endl;
ha=create(a);
output(ha,a);
cout<<endl;
cout<<"Now,Enter the polyn B:"<<endl;
hb=create(b);
output(hb,b);
cout<<endl;


cout<<"want to add or subtract?"<<endl;
cin>>ans;
cout<<"Now,this's the result:"<<endl;

caculation(ha,hb,a,b,ans);

output(ha,a);

cout<<endl<<"want to go on?"<<endl;
cin>>reply;

}
}


这是我弄的……呵呵,多指教

2006-04-20 18:22
冬日阳光
Rank: 1
等 级:新手上路
帖 子:5
专家分:0
注 册:2006-5-9
得分:0 
啊呀,实在是太佩服了啊~~
2006-05-09 12:42
小草草
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-6-5
得分:0 
[讨论][分享]
你们太强了!小妹我佩服啊!
2006-06-05 19:37
puppet213
Rank: 1
等 级:新手上路
帖 子:2
专家分:0
注 册:2006-6-13
得分:0 
大家太伟大了
2006-06-13 11:30
vfdff
Rank: 6Rank: 6
等 级:侠之大者
威 望:8
帖 子:2172
专家分:425
注 册:2005-7-15
得分:0 
你们能 不能多加一点注释

~~~~~~~~~~~~~~~好好学习~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
2006-06-15 01:07
hao_ren22
Rank: 1
等 级:新手上路
帖 子:1
专家分:0
注 册:2006-6-25
得分:0 
好厉害 佩服佩服!!!
2006-06-25 00:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-42259-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.155590 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved