| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 654 人关注过本帖
标题:急,帮忙看看哪里错了?重分悬赏...
只看楼主 加入收藏
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
结帖率:100%
收藏
已结贴  问题点数:50 回复次数:6 
急,帮忙看看哪里错了?重分悬赏...
#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;//
}BiTNode,*BiTree;
typedef struct
{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;
void initialStack(SqStack *s)
{
    s->base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree));
    if(!s->base) exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}
void Push(SqStack *s,BiTNode *e)
{
    if(s->top-s->base>=s->stacksize)
    {
        s->base=(BiTree *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(BiTree));
        if(!s->base) exit(0);
        s->top=s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }
    *(s->top)++=e;
}
void Pop(SqStack *s,BiTNode *e)
{
    if(s->top==s->base) exit(0);
    e=*--(s->top);
}
int GetTop(SqStack *s,BiTNode *e)
{
    if(s->top==s->base) return(0);
    e=*(s->top-1);
    return(1);
}
int StackEmpty(SqStack *s)
{
    if(s->base==s->top)
        return(1);
    else
        return(0);
}
BiTree CreatBiTree()//先序建立二叉链表
{
    TElemType ch;
    BiTree T;
    scanf("%c",&ch);
    if(ch==' ')
        T=NULL;
    else
    {
        T=(BiTree)malloc(sizeof(BiTNode));
        if(!T)
            exit(0);
        T->data=ch;
        T->lchild=CreatBiTree();
        T->rchild=CreatBiTree();
    }
    return T;
}
void Visit(BiTree p)//对数据元素进行操作的Visit函数
{
    printf("%c",p->data);
}
void InOrderTraverse(BiTree T)//非递归算法中序遍历二叉树链表
{
    BiTree p;
    SqStack S;
    initialStack(&S);
    p=T;
    Push(&S,p);//将根结点指针压入栈中
    while(!StackEmpty(&S))
    {
        while(GetTop(&S,p)&&(p!=NULL))
            Push(&S,p->lchild);//从左走到尽
        Pop(&S,p);//空指针退栈
        if(!StackEmpty(&S))//访问结点,向右一步
        {
            Pop(&S,p);
            Visit(p);//访问该结点
            Push(&S,p->rchild);//将刚才访问的结点的右儿子结点的地址压入栈中
        }
    }
}
void main()
{
    BiTree t;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入空格键:\n");
    t=CreatBiTree();
    printf("[中序遍历]该二叉树的各个结点:\n");
    InOrderTraverse(t);
}
//测试值abc@@de@g@@f@@@输入时用空格键替换@)
//递归算法先序建立二叉树二叉链表,再用非递归算法的中序遍历算法访问二叉树的各个结点
搜索更多相关主题的帖子: 悬赏 
2010-04-23 11:03
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
下面这个陷入死循环了吧?!
        while(GetTop(&S,p)&&(p!=NULL))
            Push(&S,p->lchild);//从左走到尽

★★★★★为人民服务★★★★★
2010-04-23 21:55
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
只要根结点不为空,这个循环必定会导致realloc()失败!

★★★★★为人民服务★★★★★
2010-04-23 21:59
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
那怎么改呢?我测试过这个循环好像是死循环,但不知道怎么改?
2010-04-23 22:46
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:50 
看看这样吧:改了下面两个函数
void Pop(SqStack *s,BiTNode **e)
void InOrderTraverse(BiTree T)//非递归算法中序遍历二叉树链表
#define STACK_INIT_SIZE 100
#define STACKINCREMENT  10
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;//
}BiTNode,*BiTree;
typedef struct
{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;
void initialStack(SqStack *s)
{
    s->base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree));
    if(!s->base) exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}
void Push(SqStack *s,BiTNode *e)
{
    if(s->top-s->base>=s->stacksize)
    {
        s->base=(BiTree *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(BiTree));
        if(!s->base) exit(0);
        s->top=s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }
    *(s->top)++=e;
}
void Pop(SqStack *s,BiTNode **e)
{
    if(s->top==s->base) exit(0);
    *e=*(--(s->top));
}
int GetTop(SqStack *s,BiTNode *e)
{
    if(s->top==s->base) return(0);
    e=*(s->top-1);
    return(1);
}
int StackEmpty(SqStack *s)
{
    if(s->base==s->top)
        return(1);
    else
        return(0);
}
BiTree CreatBiTree()//先序建立二叉链表
{
    TElemType ch;
    BiTree T;
    scanf("%c",&ch);
    if(ch==' ')
        T=NULL;
    else
    {
        T=(BiTree)malloc(sizeof(BiTNode));
        if(!T)
            exit(0);
        T->data=ch;
        T->lchild=CreatBiTree();
        T->rchild=CreatBiTree();
    }
    return T;
}
void Visit(BiTree p)//对数据元素进行操作的Visit函数
{
    printf("%c",p->data);
}
void InOrderTraverse(BiTree T)//非递归算法中序遍历二叉树链表
{
    BiTree p;
    SqStack S;
    initialStack(&S);
    p=T;
    Push(&S,p);//将根结点指针压入栈中
    p=p->lchild;
    while(!StackEmpty(&S))
    {
        while(p!=NULL){
            Push(&S,p);//从左走到尽
            p=p->lchild;
        }
        if(!StackEmpty(&S))//访问结点,向右一步
        {
            Pop(&S,&p);
            Visit(p);//访问该结点
            p=p->rchild;
        }
    }
}
void main()
{
    BiTree t;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入空格键:\n");
    t=CreatBiTree();
    printf("[中序遍历]该二叉树的各个结点:\n");
    InOrderTraverse(t);
}

★★★★★为人民服务★★★★★
2010-04-25 08:10
cnfarer
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:179
帖 子:3330
专家分:21157
注 册:2010-1-19
收藏
得分:0 
不过这个程序中依然有错误,只是一般情况下不影响运行和测试而已。自己检查修改吧!

★★★★★为人民服务★★★★★
2010-04-25 10:30
xichong
Rank: 7Rank: 7Rank: 7
来 自:四川南充
等 级:黑侠
威 望:2
帖 子:146
专家分:582
注 册:2009-6-10
收藏
得分:0 
谢谢了,最后修改结果如下:


#define STACK_INIT_SIZE 100//测试值:abc@@de@g@@f@@@
#define STACKINCREMENT  10
#include <stdio.h>
#include <stdlib.h>
typedef char TElemType;
typedef struct BiTNode
{
    TElemType data;
    struct BiTNode *lchild,*rchild;//
}BiTNode,*BiTree;
typedef struct
{
    BiTree *base;
    BiTree *top;
    int stacksize;
}SqStack;
void initialStack(SqStack *s)
{
    s->base=(BiTree *)malloc(STACK_INIT_SIZE*sizeof(BiTree));
    if(!s->base) exit(0);
    s->top=s->base;
    s->stacksize=STACK_INIT_SIZE;
}
void Push(SqStack *s,BiTNode *e)
{
    if(s->top-s->base>=s->stacksize)
    {
        s->base=(BiTree *)realloc(s->base,(STACK_INIT_SIZE+STACKINCREMENT)*sizeof(BiTree));
        if(!s->base) exit(0);
        s->top=s->base+s->stacksize;
        s->stacksize+=STACKINCREMENT;
    }
    *(s->top)++=e;
}
void Pop(SqStack *s,BiTree *e)//////////////////
{
    if(s->top==s->base) exit(0);
    *e=*--(s->top);//
}
int GetTop(SqStack *s,BiTree *e)///////////////////
{
    if(s->top==s->base) return(0);
    *e=*(s->top-1);//
    return(1);
}
int StackEmpty(SqStack *s)
{
    if(s->base==s->top)
        return(1);
    else
        return(0);
}
void ClearStack(SqStack *s)
{
    s->top=s->base;
    s->stacksize=0;
}
void DestoryStack(SqStack *s)
{
    free(s->base);
    s->stacksize=0;
}
BiTree CreatBiTree()//先序建立二叉链表
{
    TElemType ch;
    BiTree T;
    scanf("%c",&ch);
    if(ch==' ')//' ' not ''
        T=NULL;
    else
    {
        T=(BiTree)malloc(sizeof(BiTNode));
        if(!T)
            exit(0);
        T->data=ch;
        T->lchild=CreatBiTree();
        T->rchild=CreatBiTree();
    }
    return T;//返回结点(T->data,T->lchild,T->rchild三个值已经确定)的指针的值
}
void Visit(BiTree p)//对数据元素进行操作的Visit函数
{
    printf("%c",p->data);
}
//////////////////////////////////方法一///////////////////////////////////////////////////////////
/*void InOrderTraverse(BiTree T)//Push(&S,p),GetTop(&S,&p),Pop(&S,&p)**********************************
{
    BiTree p;
    SqStack S;
    initialStack(&S);
    p=T;
    Push(&S,p);
    while(!StackEmpty(&S))
    {
        while(GetTop(&S,&p)&&(p!=NULL))
            Push(&S,p->lchild);//从左走到尽
        Pop(&S,&p);//空指针退栈
        if(!StackEmpty(&S))//访问结点,向右一步
        {
            Pop(&S,&p);
            Visit(p);
            Push(&S,p->rchild);
        }
    }
}*/
////////////////////////////////方法一的改进/////////////////////////////////////////
void InOrderTraverse(BiTree T)//算法改进:去掉冗余,空指针不进栈
{
    SqStack S;
    BiTree p;
    initialStack(&S);
    p=T;
    while(p||!StackEmpty(&S))
    {
        if(p)//根指针进栈,遍历左子树
        {
            Push(&S,p);
            p=p->lchild;
        }
        else//根指针退栈,访问根节点,遍历右子树
        {
            Pop(&S,&p);//Pop(&S,p) is incomptible
            Visit(p);
            p=p->rchild;
        }
    }
}
void main()
{
    BiTree t;
    printf("请按先序遍历序列输入二叉树中各个结点的值(字符),若为空树时输入空格键:\n");
    t=CreatBiTree();
    printf("[中序遍历]该二叉树的各个结点:\n");
    InOrderTraverse(t);
    printf("\n");
}
2010-04-26 17:40
快速回复:急,帮忙看看哪里错了?重分悬赏...
数据加载中...
 
   



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

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