计算器
全部代码如下
#include<stdio.h>
#include<malloc.h>
struct numc{
double a0;
char s0;
struct numc* next;
};
typedef struct numc* point;
point head , tear , p0 , p;
void build (void)
{
double a;
char s;
p=(point)malloc(sizeof(struct numc));
p->next=NULL;
head = p;
tear = p;
scanf ("%lf%c" ,&a,&s);
while ( s != '=' )
{
p-> a0 = a;
p-> s0 = s;
tear->next=p;
p->next=NULL;
tear = p;
p=(point)malloc(sizeof(struct numc));
scanf("%lf%c",&a,&s);
}
p-> a0 = a;
p-> s0 = s;
tear->next=p;
p->next=NULL;
tear = p;
}
void print (void)
{
point r;
r=head;
while(r!=0)
{
printf("%.2lf",r->a0);
printf("%c",r->s0);
r=r->next;
}
}
void ele (void)
{
point r,r0,q;
r0=(point)malloc(sizeof(struct numc));
r0->next=head;
q=r0;
r=head;
while(r->s0!='=')
{
if(r->s0=='*')
{
r->next->a0 = r->a0 * r->next->a0;
r0->next=r->next;
free(r);
r=r0->next;
}
else if(r->s0=='/')
{
r->next->a0 = r->a0 / r->next->a0;
r0->next=r->next;
free(r);
r=r0->next;
}
else
{
r0=r;
r=r->next;
}
}
r0=q;
r=q->next;
while(r->s0!='=')
{
if(r->s0=='+')
{
r->next->a0 = r->a0 + r->next->a0;
r0->next=r->next;
free(r);
r=r0->next;
}
else if(r->s0=='-')
{
r->next->a0 = r->a0 - r->next->a0;
r0->next=r->next;
free(r);
r=r0->next;
}
else
{
r0=r;
r=r->next;
}
}
printf("%.2lf",tear->a0);
free(q);
free(tear);
}
int main () {
build();
print();
ele();
return 0;
}
其中build子函数用于创建链表。
而print函数的作用不用多说,输出生成的链表。
真正的算法在ele中:
首先从表头开始检索s0是’*‘||’/‘的链节,并把检索到的链节中的数字与下一链节中的数进行相应的运算存放到下一链节a0中,使r0指向r的下一项,free(r),r0->next赋给 r 即可。
若该项s0中不是’*‘||’/‘,继续向下检索。
void ele (void)
{
point r,r0,q;
r0=(point)malloc(sizeof(struct numc));
r0->next=head;
q=r0;
r=head;
while(r->s0!='=')
{
if(r->s0=='*')
{
r->next->a0 = r->a0 * r->next->a0;
r0->next=r->next;
free(r);
r=r0->next;
}
else if(r->s0=='/')
{
r->next->a0 = r->a0 / r->next->a0;
r0->next=r->next;
free(r);
r=r0->next;
}
else
{
r0=r;
r=r->next;
}
}
r0=q;
r=q->next;
while(r->s0!='=')
{
if(r->s0=='+')
{
r->next->a0 = r->a0 + r->next->a0;
r0->next=r->next;
free(r);
r=r0->next;
}
else if(r->s0=='-')
{
r->next->a0 = r->a0 - r->next->a0;
r0->next=r->next;
free(r);
r=r0->next;
}
else
{
r0=r;
r=r->next;
}
}
printf("%.2lf",tear->a0);
free(q);
free(tear);
}
+ - 法同理,先算乘除,再算加减就欧克了。
看,就像这样
文章评论