| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 951 人关注过本帖
标题:求助大神,关于C语言为基础的数据结构,动态表达式求值
只看楼主 加入收藏
无贫
Rank: 1
等 级:新手上路
帖 子:5
专家分:8
注 册:2016-7-6
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:1 
求助大神,关于C语言为基础的数据结构,动态表达式求值
求助大神,关于C语言为基础的数据结构,动态表达式求值,我遇到难题,求助大神帮忙,时间紧急,在线等,QQ:358791396,微信:xhj368447,电话:13161076219.
这是我写的代码,求帮忙
#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define MAX 100;

typedef struct node{
    char data;
    struct node *lchild,*rchild;
}bitnode,*bitree;


#define chsize 20
#define flsize 30
/*建立字符栈*/
typedef struct
{
   char elem[chsize];//存储定义
   int top;
}chstack;
void Initchar(chstack *S)//初始化顺序栈
 {
    S->top=-1;
 }
int Pushchar(chstack *S,char x)//进栈
{
    if(S->top==-1) return 0;
    S->top++;
    S->elem[S->top]=x;
    return 1;
}
int Popchar(chstack *S,char *x)//出栈
{
    if(S->top==-1) return 0;
    else
    {
        *x=S->elem[S->top];
        S->top--;
        return(1);
    }
}
int GetTopchar(chstack S,char*x)// 取栈顶
{
    if(S.top==-1) return(0);
    else
    {
        *x=S.elem[S.top];
        return(1);
    }
}
//建立子树栈
typedef struct//建立
{
    bitree elem[flsize];
    int top;
}substack;

void InitStree(substack *S)//初始化
{
     S->top=-1;
}

int Pushtree(substack *S,bitree e) //进栈
{
    if(S->top==-1) return(0);
    else
    {
        S->top++;
        S->elem[S->top]=e;
        return(1);
    }
}
int Poptree(substack *S,bitree *x)//出栈
{
    if(S->top==-1) return(0);
    else
    {
        *x=S->elem[S->top];
        S->top--;
        return(1);
    }
}
int GetToptree(substack S,bitree *x)// 取栈顶
{
    if(S.top==-1) return(0);
    else
    {
        *x=S.elem[S.top];
        return(1);
    }
}
void CrtNode(bitree *T,substack *PTR,char ch)
{
    if(!(*T=new(bitnode))) exit(0);
    (*T)->data=ch;
    (*T)->lchild=(*T)->rchild=NULL;
    Pushtree(PTR,(*T));
}

void CrtSubTree(bitree *T,substack *PTR,char c)
{
    bitree lc,rc;
    if(!((*T)=new(bitnode))) exit(0);
    (*T)->data=c;
    Poptree(PTR,&rc);
    (*T)->rchild=rc;
    Poptree(PTR,&lc);
    (*T)->rchild=lc;
    Pushtree(PTR,*T);
}
int IN(char c)
{
    if(c=='(' || c==')' || c=='*' || c=='/' || c=='+' || c=='-') return 0;
    else return 1;
}
int prior(char a)
{
    if(a=='*' || a=='/') return 4;
    else if(a=='+' || a=='-') return 3;
    else if(a=='(') return 2;
    else if(a=='#') return 1;
    else return 0;
}
void crtex(bitree *T,char exp[])
{
    substack PTR;
    chstack PND;
    int i,j;
    Initchar(&PND); Pushchar(&PND,'#');
    InitStree(&PTR);
    char *p=exp;char ch,c;ch=*p;
    GetTopchar(PND,&c);
    while(c!='#' || ch!='#')
    {
        if(!IN(ch)) CrtNode(T,&PTR,ch);
        else{
            switch(ch){
            case '(':Pushchar(&PND,ch);break;
            case ')':Popchar(&PND,&c);
                while(c!='(')
                {
                    CrtSubTree(T,&PTR,c);
                    Popchar(&PND,&c);
                }
                break;
            default:GetTopchar(PND,&c);
                i=prior(c);j=prior(ch);
                while(c!='#' && i>=j)
                    {
                        CrtSubTree(T,&PTR,c);
                        Popchar(&PND,&c);
                        i=prior(c);j=prior(ch);
                    }
                if(ch!='#') Pushchar(&PND,ch);
            }
            if(ch!='#') {p++;ch=*p;}
        }
    }
    Poptree(&PTR,T);
}

double culexp(bitree T)
{
    double result,a,b;
    if(T){
        if(!IN(T->data))
        {
            printf("请输入%c的值",T->data);
            scanf("%lf",&result); return result;
        }
        a=culexp(T->lchild); b=culexp(T->rchild);
        switch(T->data)
        {
        case '+':return a+b;
        case '-':return a-b;
        case '*':return a*b;
        case '/':if(b!=0) return a/b;
            else {printf("分母为0!!!!\n"); exit(0);}
        }
    }
}

void main()
{
    char ex[100];
    bitree t;
    printf("请输入字符串,以#结束\n");
    gets(ex);
    crtex(&t,ex);
    culexp(t);
}


搜索更多相关主题的帖子: include 表达式 C语言 在线 动态 
2016-07-06 19:54
lanke711
Rank: 9Rank: 9Rank: 9
来 自:流浪在天国之路
等 级:蜘蛛侠
威 望:7
帖 子:317
专家分:1437
注 册:2015-7-16
收藏
得分:20 
程序代码:
double culexp(bitree T)
{
    double result,a,b;
    if(T){
        if(!IN(T->data))
        {
            printf("请输入%c的值",T->data);
            scanf("%lf",&result); return result;
        }
        a=culexp(T->lchild); b=culexp(T->rchild);
        switch(T->data)
        {
        case '+':return a+b;
        case '-':return a-b;
        case '*':return a*b;
        case '/':if(b!=0) return a/b;
            else {printf("分母为0!!!!\n"); exit(0);}
        }
    }
    //return ???;  这里需要返回一个double值
}

有数据类型的函数需有返回值。这里没有返回。

其它BUG未知,楼主可以断点单步一下。

普通人之所以普通,是因为他们普遍有一个通病,那就是认为自己永远普通。
千夫所指,我亦坚持。就算被所有人误解,我也照样守护这一切。
我们总是觉得,这些灵魂的表情,傲慢自大,目中无人,其实,真正目中无人的是我们。它们傲慢的不过是表情,而我们傲慢的却是行为!
记得,是为了忘记!
只要想着有那么一天,我就能忍受现在的每一天!
灾难并不可怕,可怕的是心中没有了希望。
你以为我在天堂,其实我正在路上。
当你觉得自己走不到终点的时候,请不要放弃。或许你的对手也是这种感觉。
2016-07-07 03:19
快速回复:求助大神,关于C语言为基础的数据结构,动态表达式求值
数据加载中...
 
   



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

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