望讲解详细些,谢谢!  
 
下面定义的结构在构造的时候就出问题,成员**child出错.
我本意是设想 树应该有一个父结点和若干子结点,所以用**child,可是却出错,如何构造呢?
struct  Node_Type  
{  
     char  *buf;                      //内容地址  
     char  bufsize;                //内容大小  
     int    childNum;              //子群数量  
     Node_Type  *parent;      //父结点  
     Node_Type  **child;      //子群结点  
     Node_Type():buf(0),parent(0),*child(0),childNum(0){};  
     ~Node_Type()[  
               if(buf!=NULL){delete  []buf;buf=NULL;}  
               if(parent!=NULL){delete  parent;parent=NULL}  
               if(childNum>0)  
                 {  
                         for(register  int  i=0;i<childNum;i++)  
                         {  delete  child[i];child[i]=NULL;}  
                   }  
         }  
}  我的email: [email protected]

解决方案 »

  1.   

    咦?结构体还可以带成员函数么?我怎么不知道?你在*chile两端打上括号试试。还有~Node_Type()[  这里的[应该是{吧?
      

  2.   

    靠你的结构也太那个了吧,
    将新你的结构,typedef struct tagNodeType  
    {  
    char  *buf;                      //内容地址  
    char  bufsize;                //内容大小  
    int    childNum;              //子群数量  
    struct tagNodeType  *parent;      //父结点  
    struct tagNodeType  **child;      //子群结点  
    tagNodeType():buf(NULL),
    parent(NULL),
    child(NULL)
    {
    }

    ~tagNodeType()
    {
    if (buf!=NULL)
    {
    delete[] buf;
    buf = NULL;
    }  

    if (parent != NULL)
    {
    delete parent;
    parent = NULL;
    }  

    if (childNum > 0)  
    {  
    for (register  int i=0; i<childNum; i++)  

    delete  child[i];
    child[i] = NULL;
    }  
    }  
    }  
    }NODE, *LPNODE;
      

  3.   

    #include <stdlib.h>
    #include <stdio.h>
    #define queuesize 100
    #define null 0typedef char datatype;typedef struct node{
    typedef char data;
    struct node *lchild,*rchild;
    }bintnode;//定义二叉链表结点结构
    typedef bintnode *bintree;
    //定义二叉链表指针类型typedef struct{
    int front,rear;
    bintree data[queuesize];
    //循环队列元素类型为二叉链表结点指针
    int count;
    }cirqueue;
    //循环队列结构定义main()
    //主函数
    {
    //建立二叉树的二叉链表表示,并进行先序遍历、中序遍历、后序遍历和按层次遍历,

    //求出所有叶子和结点总数。
    bintree t=null;
    int n;
    printf("please input nodes of bintree:\n");
    createbintree(&t);
    //建立二叉链表

    printf("the preorder is:");
    preorder(t);
    //对二叉树t进行先序遍历
    printf("\n");

    printf("the inorder is:");
    inorder(t);
    //对二叉树t进行中序遍历

    printf("\nthe postorder is:");
    postorder(t);
    //对二叉树t进行后序遍历

    printf("\nthe leverorder is:");
    leverorder(t);
    //对二叉树t进行按层次遍历

    n=leave(t);
    // 求出二叉树的叶子数n

    printf("\nthe leave of bintree is: %d",n);
    //打印二叉树的叶子总数
    if (n){
    //当叶子数不为0
    printf("\nthe list of leave is:"); 
    leavelist(t);
    //输出所有的叶子
    }
    else 
    printf("\nno leave!");
    //输出无叶子(即空树)信息
    printf("\nthe nodes of bintree is: %d\n",nodes(t));
    //输出二叉树的总结点数
    }createbintree(bintree *t)
    {
    //输入二叉树的先序遍历序列,创建二叉链表
    char ch;
    if ((ch=getchar())==' ')
    //如果读入空格字符,创建空树
    *t=null;
    else{
    *t=(bintnode*)malloc(sizeof(bintnode));
    //申请根结点*t空间
    (*t)->data=ch;
    //将结点数据ch放入根结点的数据域
    createbintree(&(*t)->lchild);
    //建左子树
    createbintree(&(*t)->rchild);
    //建右子树
    }
    //end of if
    }
    //end of creatbintreepreorder(bintree t)
    {
    //对二叉树进行先序遍历
    if (t){
    printf("%c",t->data);
    preorder(t->lchild);
    preorder(t->rchild);
    }
    //end of if
    }
    //end of preorderinorder(bintree t)
    {
    //对二叉树进行中序遍历
    if (t){
    inorder(t->lchild);
    printf("%c",t->data);
    inorder(t->rchild);
    }//end of if
    }//end of inorderpostorder(bintree t)
    {
    //对二叉树进行后序遍历
    if (t){
    postorder(t->lchild);
    postorder(t->rchild);
    printf("%c",t->data);
    }//end of if
    }//end of postordererror(char *message)
    {
    //出错时,调用的返回出错信息,终止程序运行的函数
    fprintf(stderr,"error:%s\n",message);
    exit(1);
    }leverorder(bintree t)
    {
    cirqueue *q;
    bintree p;
    q=(cirqueue*)malloc(sizeof(cirqueue));
    //申请循环队列空间
    q->rear=q->front=q->count=0;
    //将循环队列初始化为空
    q->data[q->rear]=t;q->count++;q->rear=(q->rear+1)%queuesize;
    //将根结点入队
    while (q->count)
    //若队列不为空,做以下操作
    if (q->data[q->front]){
    //当队首元素不为空指针,做以下操作
    p=q->data[q->front];
    //取队首元素*p
    printf("%c",p->data);
    //打印*p结点的数据域信息
    q->front=(q->front+1)%queuesize;q->count--;
    //队首元素出队
    if (q->count==queuesize)
    //若队列为队满,则打印队满信息,退出程序的执行
    error("the queue full!");
    else{
    //若队列不满,将*p结点的左孩子指针入队
    q->count++;q->data[q->rear]=p->lchild;
    q->rear=(q->rear+1)%queuesize;
    }
    //enf of if
    if (q->count==queuesize)
    //若队列为队满,则打印队满信息,退出程序的执行
    error("the queue full!");
    else{
    //若队列不满,将*p结点的右孩子指针入队
    q->count++;q->data[q->rear]=p->rchild;
    q->rear=(q->rear+1)%queuesize;
    }
    //end of if
    }
    //end of if 
    else{
    //当队首元素为空指针,将空指针出队
    q->front=(q->front+1)%queuesize;q->count--;}
    }
    //end of leverorder
    int leave(bintree t)
    {
    //求以t为树根的二叉树的叶子总数
    if (!t)
    //若根结点为
    return 0;
    //返回叶子数0
    else
    //若根结点非空 
    if ((t->lchild==null)&&(t->rchild==null))
    //若根结点的左、右孩子都为空
    return 1;
    //返回叶子数1
    else 
    //根结点的左、右孩子有1个不为空
    return(leave(t->lchild)+leave(t->rchild));

    //叶子数为左子树的叶子数加右子树中的叶子数
    }leavelist(bintree t)
    {
    if (t){
    leavelist(t->lchild);
    //输出左子树中的所有叶子
    if ((t->lchild==null)&&(t->rchild==null))

    //若根结点为叶子,则输出叶子的数据域信息
    printf("%c",t->data);
    leavelist(t->rchild);
    //输出右子树中的所有叶子
    }
    //end of if
    }
    //end of inorderint nodes(bintree t)
    {
    if (!t)
    //若二叉树为空树 
    return 0;
    //返回结点数0
    else 
    //若二叉树非空
    return nodes(t->lchild)+nodes(t->rchild)+1;

    //二叉树的结点总数为左、右子树的结点总数加上1(根结点)
    }
    //end of node