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



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

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