| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 402 人关注过本帖
标题:先序遍历遇到的问题,高手进
只看楼主 加入收藏
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
结帖率:73.96%
收藏
已结贴  问题点数:10 回复次数:3 
先序遍历遇到的问题,高手进
程序代码:
#include<stdio.h>
#include<stdlib.h>  //包括malloc()和realloc()函数的头文件
#include<math.h>   //包括pow()函数的头文件
#define Max_stack_size 20
#define Addersize      10
typedef struct BiTNode
{
     char data;
     struct BiTNode *lchild;
     struct BiTNode *rchild;
}BiTNode,*BiTree;

typedef struct{
BiTNode *base;
BiTNode *top;
int stacksize;
}sqStack;

BiTree CreateBiTree(BiTree T)
{
    char ch;
    fflush(stdin);
    if((ch=getchar())=='#')
    {
        T=NULL;
    }
    else
    {
        T=(BiTNode *)malloc(sizeof(BiTNode));
        if(!T)
            exit(0);
        T->data=ch;
        T->lchild=CreateBiTree(T->lchild);
        T->rchild=CreateBiTree(T->rchild);
    }
    return T;
}

void initStack (sqStack *s)
{                          //初始化一个空栈
    s->base=(BiTNode *)malloc(Max_stack_size*sizeof(BiTNode));
    if(!s->base) exit(0);
     s->top=s->base;
     s->stacksize=Max_stack_size;
}

void pushStack(sqStack *s,BiTNode e)
{                                      //入栈操作
    if(s->top-s->base>=s->stacksize)
    {
        printf("栈已满,追加空间");
        s->base=(BiTNode *)realloc(s->base,(s->stacksize+Addersize)*sizeof(BiTNode));
        if(!s->base) exit(0);
         s->top=s->base+s->stacksize;
         s->stacksize=s->stacksize+Addersize;
    }
    *(s->top++)=e;
}

void popStack(sqStack *s,BiTNode *e)
{           //出栈操作
     if(s->top==s->base) exit(0);
    *e=*--s->top;
}

int stackempty(sqStack *S)
{
    if(S->top==S->base)
         return 1;
    else
        return 0;
}
void Preorder(BiTNode *T)
{
    sqStack S;
    BiTNode *p;
    initStack(&S);
    p=T;
    while(p||!(stackempty(&S)))
    {
        if(p)
        {
            printf("%c ",p->data);
            pushStack(&S,*p);
            p=p->lchild;
        }
        else {
            popStack(&S,p);
            p=p->rchild;
        }
    }
}
int main()
{
    BiTNode *T;
    T=CreateBiTree(T);
    Preorder(T);
}

假如输入34##5## 结果只有3和4 没有5
为什么??
搜索更多相关主题的帖子: 问题 color 
2011-09-28 09:34
silent_world
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:1
帖 子:258
专家分:1138
注 册:2011-9-24
收藏
得分:5 
回复 楼主 qq8801103
逻辑本身没有问题,提两点建议:
1、你实现堆栈操作,必须依赖原有的二叉树,是什么原因在堆栈中不存储指针,而存储数据?
2、既然堆栈存储内容,在出栈操作时就需要有空间,仅仅一个指针不够。
第二个问题修改后,就可以运行正常了。
见如下代码:
#include<stdio.h>
#include<stdlib.h>  //包括malloc()和realloc()函数的头文件
#include<math.h>   //包括pow()函数的头文件
#define Max_stack_size 20
#define Addersize      10
typedef struct BiTNode
{
     char data;
     struct BiTNode *lchild;
     struct BiTNode *rchild;
}BiTNode,*BiTree;

typedef struct{
     BiTNode *base;
     BiTNode *top;
     int stacksize;
}sqStack;

BiTree CreateBiTree(BiTree T)
{
     char ch;
     fflush(stdin);
     if((ch=getchar())=='#')
     {
          T=NULL;
     }
     else
     {
          T=(BiTNode *)malloc(sizeof(BiTNode));
          if(!T)
               exit(0);
          T->data=ch;
          T->lchild=CreateBiTree(T->lchild);
          T->rchild=CreateBiTree(T->rchild);
     }
     return T;
}

void initStack (sqStack *s)
{                          //初始化一个空栈
     s->base=(BiTNode *)malloc(Max_stack_size*sizeof(BiTNode));
     if(!s->base) exit(0);
     s->top=s->base;
     s->stacksize=Max_stack_size;
}

void pushStack(sqStack *s,BiTNode e)
{                                      //入栈操作
     if(s->top-s->base>=s->stacksize)
     {
          printf("栈已满,追加空间");
          s->base=(BiTNode *)realloc(s->base,(s->stacksize+Addersize)*sizeof(BiTNode));
          if(!s->base) exit(0);
          s->top=s->base+s->stacksize;
          s->stacksize=s->stacksize+Addersize;
     }
     *(s->top++)=e;
}

void popStack(sqStack *s,BiTNode *e)
{           //出栈操作
     if(s->top==s->base) exit(0);
     *e=*--s->top;
}

int stackempty(sqStack *S)
{
     if(S->top==S->base)
          return 1;
     else
          return 0;
}
void Preorder(BiTNode *T)
{
     sqStack S;
     BiTNode *p;
     BiTNode q = {0};
     initStack(&S);
     p=T;
     while(p||!(stackempty(&S)))
     {
          if(p)
          {
               printf("%c ",p->data);
               pushStack(&S,*p);
               p=p->lchild;
          }
          else {
               popStack(&S, &q);
               p=q.rchild;
          }
     }
}
int main()
{
     BiTNode *T = 0;
     T=CreateBiTree(T);
     Preorder(T);
}






2011-09-28 10:47
czsbc
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
帖 子:469
专家分:1700
注 册:2008-12-13
收藏
得分:5 
popStack(&S,p);   //p没有分配内存空间导致*e=*--s->top;这里非法访问。
 
2011-09-28 10:55
qq8801103
Rank: 5Rank: 5
来 自:苏州中科大软件学院
等 级:职业侠客
威 望:1
帖 子:422
专家分:340
注 册:2009-10-8
收藏
得分:0 
了解了

Discuz!  
好好学习  天天向上
2011-09-28 12:49
快速回复:先序遍历遇到的问题,高手进
数据加载中...
 
   



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

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