C语言----计算器 用链表实现简单的+-*/混合运算

计算器

全部代码如下

#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);
}

+ - 法同理,先算乘除,再算加减就欧克了。

看,就像这样

 

  • 3
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

.KEG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值