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

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

看,就像这样

 


版权声明:本文为AChmg原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。