| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 662 人关注过本帖
标题:非递归构造树...为什么老是报空指针啊?求高人指点
只看楼主 加入收藏
carlzhao531
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-5-25
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:2 
非递归构造树...为什么老是报空指针啊?求高人指点
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERR -1

typedef char ElemType;
typedef int status;
typedef struct BiTNode
{
    ElemType data;
 BiTNode *lchild,*rchild;     
}BiTNode;

typedef BiTNode* BiTree;

typedef struct SNode
{
    BiTNode elem;
 SNode  *next;
}SNode;

typedef struct NodeStack
{
     SNode *top,*bottom;
  int size;   
}NodeStack;

status initStack(NodeStack &ns)
{
 ns.top = ns.bottom = 0;
 ns.size = 0;
 return OK;
}

status push(NodeStack &ns,BiTNode* node)
{
    SNode *p = (SNode*)malloc(sizeof(SNode));
    p->elem.data = node->data;
   
    if(ns.size == 0)
 {
    ns.top = ns.bottom = p;
    p->next = NULL;
 }
 
 else
 {
    p->next = ns.top;
    ns.top = p;
 }
 
 ns.size++;
 return OK;
}

status pop(NodeStack &ns,BiTNode *node)
{
 SNode* p;
    if(ns.size == 0)
     return ERR;
 else
 {
        node->data = ns.top->elem.data;
  p = ns.top;  
        ns.top = ns.top->next;
        free(p);
        ns.size--;
 }
 return OK;
}

status creatTree(BiTree &t,char data[],int len)
{
  NodeStack ns;
  int i,flag=0;  
     BiTNode* node;
     BiTNode* popnode;
     initStack(ns);
     
  t = (BiTree)malloc(sizeof(BiTNode));
     t->data = data[0];
     t->lchild = NULL;
     t->rchild = NULL;
     push(ns,t);

  for(i=1; i<len; i++)
  {   
   if(data[i] == '#' && flag == 1)
   //当前栈顶节点的左右孩子生成结束,应将栈顶节点出栈,
   //若出栈节点仍是出栈后栈顶节点的右孩子,则栈顶节点继续出栈。
   {
      pop(ns,popnode);
         while(popnode == ns.top->elem.rchild)
             pop(ns,popnode);
   }
   
   else if(data[i] == '#' && flag == 0)
   //当前节点的左孩子生成结束,将flag置为1,转而生成当前节点的右孩子
    {
     flag = 1;
   }
   
   else
   {
    node = (BiTree)malloc(sizeof(BiTNode));
    node->data = data[i];
    node->lchild = NULL;
    node->rchild = NULL;
    if(flag == 0)
    //生成当前节点并将该节点作为栈顶节点的左孩子
   //同时将当前节点入栈
    {
     ns.top->elem.lchild = node;
    push(ns,node);
    }
    else
    //生成当前节点并将该节点作为栈顶节点的右孩子
      //同时将当前节点入栈,同时将flag置为0,下次转向左孩子
    {
     ns.top->elem.rchild = node;
     push(ns,node);
     flag = 0;
    }
   }
  }   
}

int main(int argc, char *argv[])
{
    BiTree t;
    char* data = "12##3##";
    int len = 7;
 creatTree(t,data,len);
 return 0;
}
搜索更多相关主题的帖子: 递归 指针 构造 高人 
2010-05-25 09:04
hzh512
Rank: 9Rank: 9Rank: 9
等 级:蜘蛛侠
威 望:6
帖 子:234
专家分:1333
注 册:2009-6-5
收藏
得分:10 
指针用法的老问题,
你的程序有两个致命错误:
1.栈元素为什么不是指针,而是一个结构体对象,这浪费了空间,非常不合理。
  typedef struct SNode
{
    BiTNode elem; // 极不合理,浪费空间
    SNode  *next;
} SNode;

2.push后,应为地址指针,不然相当于没有链入树根中。

源代码:
程序代码:
#include <stdio.h>
#include <malloc.h>
#define OK 1
#define ERR -1
typedef char ElemType;
typedef int status;
typedef struct BiTNode
{
    ElemType data;
    BiTNode *lchild,*rchild;   
} BiTNode;
typedef BiTNode* BiTree;
typedef struct SNode
{
    BiTNode* elem;
    SNode  *next;
} SNode;
typedef struct NodeStack
{
    SNode *top,*bottom;
    int size; 
} NodeStack;
void initStack(NodeStack &ns);
status push(NodeStack &ns,BiTNode* node);
status pop(NodeStack &ns,BiTNode *node);
void creatTree(BiTree &t,char data[],int len);
int main(int argc, char *argv[])
{
    BiTree t;
    char* data = "12##3##";
    int len = 7;
    creatTree(t,data,len);
    return 0;
}
/*
status push(NodeStack &ns,BiTNode* node)
{
    SNode *p = (SNode*)malloc(sizeof(SNode));
    p->elem.data = node->data;
  
    if(ns.size == 0)
    {
        ns.top = ns.bottom = p;
        p->next = NULL;
    }
  
    else
    {
        p->next = ns.top;
        ns.top = p;
    }
  
    ns.size++;
    return OK;
}
*/
status push(NodeStack &ns,BiTNode* node)
{
    SNode *p = (SNode*)malloc(sizeof(SNode));
    p->elem = node;
  
    if(ns.size == 0)
    {
        ns.top = ns.bottom = p;
        p->next = NULL;
    }
  
    else
    {
        p->next = ns.top;
        ns.top = p;
    }
  
    ns.size++;
    return OK;
}
status pop(NodeStack &ns,BiTNode *node)
{
    SNode* p;
    if(ns.size == 0)
        return ERR;
    else
    {
        node->data = ns.top->elem->data;
        p = ns.top;
        ns.top = ns.top->next;
        free(p);
        ns.size--;
    }
    return OK;
}
void initStack(NodeStack &ns)
{
    ns.bottom = NULL;
    ns.top = NULL;
    ns.size = 0;
}
void creatTree(BiTree &t,char data[],int len)
{
    NodeStack ns;
    int i,flag=0;
    BiTNode* node;
    BiTNode* popnode = (BiTree)malloc(sizeof(BiTNode));
    initStack(ns);
  
    t = (BiTree)malloc(sizeof(BiTNode));
    t->data = data[0];
    t->lchild = NULL;
    t->rchild = NULL;
    push(ns,t);
  
    for(i=1; i<len; i++)
    { 
        if(data[i] == '#' && flag == 1)
            //当前栈顶节点的左右孩子生成结束,应将栈顶节点出栈,
            //若出栈节点仍是出栈后栈顶节点的右孩子,则栈顶节点继续出栈。
        {
            pop(ns,popnode);
            while(popnode == ns.top->elem->rchild)
                pop(ns,popnode);
        }
      
        else
            if(data[i] == '#' && flag == 0)
                //当前节点的左孩子生成结束,将flag置为1,转而生成当前节点的右孩子
            {
                flag = 1;
            }
          
            else
            {
                node = (BiTree)malloc(sizeof(BiTNode));
                node->data = data[i];
                node->lchild = NULL;
                node->rchild = NULL;
                if(flag == 0)
                    //生成当前节点并将该节点作为栈顶节点的左孩子
                    //同时将当前节点入栈
                {
                    ns.top->elem->lchild = node;
                    push(ns,node);
                }
                else
                    //生成当前节点并将该节点作为栈顶节点的右孩子
                    //同时将当前节点入栈,同时将flag置为0,下次转向左孩子
                {
                    ns.top->elem->rchild = node;
                    push(ns,node);
                    flag = 0;
                }
            }
    } 
}


编程=用几种语言在某个或几个平台上通过抽象思维运用一系列算法来解决现实中问题的手段
2010-05-25 14:30
carlzhao531
Rank: 1
等 级:新手上路
帖 子:6
专家分:0
注 册:2010-5-25
收藏
得分:0 
回复 2楼 hzh512
谢谢版主了
2010-05-25 21:20
快速回复:非递归构造树...为什么老是报空指针啊?求高人指点
数据加载中...
 
   



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

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