C语言 堆栈使用中的未识别错误

jaql4c8m  于 2022-12-02  发布在  其他
关注(0)|答案(1)|浏览(133)

我试图使用指针实现二叉树,然后我必须使用堆栈从后缀表达式创建一个新的二叉树(并打印它)。
函数“create”应该这样做,但每次它到达StTop或StPop时,程序都会停止工作。
我的函数得到字符串,然后对每个字符c做如下操作:如果c是一个字母,那么它创建一个二叉树,它的根是c,它的孩子是NULL,并把它放在堆栈“niz”的顶部。
否则使用Stack,它从Stack中弹出last和second to last值,并创建新树,其中char c是根,last值是右子,second to last是左子,并将其放回Stack顶部。
我不知道我做错了什么。每一个提示或建议将不胜感激!

#include<stdio.h>
#include<stdlib.h>

#define LAMBDA NULL
#define MAXLENGHT 10000

typedef char labeltype;

typedef struct celltag{
    labeltype label;
    struct celltag *leftchild;
    struct celltag *rightchild;
} celltype;

typedef celltype *node; //ovo ti je cvor
typedef celltype *BinaryTree;

void BiMakeNull(BinaryTree *Tp)
{
    *Tp=NULL;
}

int BiEmpty(BinaryTree T)
{
    if(T==NULL) return 0;
    return 1;
}

void BiCreate(labeltype l, BinaryTree TL, BinaryTree TR, BinaryTree *Tp)
{
    (*Tp)=(celltype*)malloc(sizeof(celltype));
    (*Tp)->label= l;
    (*Tp)->leftchild=TL;
    (*Tp)->leftchild=TR;
}

void BiLeftSubtree(BinaryTree T, BinaryTree *TLp)
{
    (*TLp)=T->leftchild;
}

void BiRightSubtree(BinaryTree T, BinaryTree *TRp)
{
    (*TRp)=T->rightchild;
}

node BiInsertLeftChild(labeltype l, node i, BinaryTree *Tp)
{
    if(i==NULL) exit(1);
    if(i->leftchild != NULL) exit(2);

    i->leftchild->label=l;
    i->leftchild->leftchild=NULL;
    i->leftchild->rightchild=NULL;

    return i->leftchild;
}

 node BiInsertRightChild(labeltype l, node i, BinaryTree *Tp)
 {
    if(i==NULL) exit(1);
    if(i->rightchild != NULL) exit(2);

    i->rightchild->label=l;
    i->rightchild->rightchild=NULL;
    i->rightchild->rightchild=NULL;

    return i->rightchild;
 }

 void BiDelete(node i, BinaryTree *Tp)
 {
     if(i==NULL) exit(3);
     if(i->leftchild!=NULL || i->rightchild!= NULL) exit(4);

     i=NULL;
 }

 node BiRoot(BinaryTree T)
 {
     if(T==NULL) return LAMBDA;
     return T;
 }

 node BiLeftChild(node i, BinaryTree T)
 {
     if(i==NULL) exit(5);
     if(i->leftchild==NULL) return LAMBDA;
     return i->leftchild;
 }

 node BiRightChild(node i, BinaryTree T)
 {
     if(i==NULL) exit(5);
     if(i->rightchild==NULL) return LAMBDA;
     return i->rightchild;
 }

 node nadiRoditelja(node i, node root)
 {
     if(root->leftchild==i || root->rightchild==i) return root;

     if(root->leftchild!=NULL) {nadiRoditelja(i, root->leftchild);}
     if(root->rightchild!=NULL) {nadiRoditelja(i, root->rightchild);}

 }

 node BiParent(node i, BinaryTree T)
 {
     if(i==NULL) exit(6);
     if(i==T) return LAMBDA;

     node parent;
     parent=nadiRoditelja(i, BiRoot(T));
     return parent;
 }

 labeltype BiLabel(node i, BinaryTree T)
 {
     if(i==NULL) exit(7);
     return i->label;
 }

void BiChangeLabel(labeltype l, node i, BinaryTree *Tp)
{
    if(i==NULL) exit(8);
    i->label=l;
}

//implementacija stoga pomocu polja 

typedef struct {
    int top;
    BinaryTree elementi[MAXLENGHT];
} Stack;

void StMakeNull(Stack *St)
{
    St->top=MAXLENGHT;
}

int StEmpty(Stack S)
{
    if(S.top>=MAXLENGHT) return 1;
    return 0;
}

void StPush(BinaryTree x, Stack *Sp)
{
    if(Sp->top==0) exit(101);
    else{
        Sp->top--;
        Sp->elementi[Sp->top]=x;
    }
}

void StPop(Stack *Sp)
{
    if(StEmpty(*Sp)){exit(212);}
    else{
            Sp->top++;
    }

}

BinaryTree StTop(Stack S)
{
    if(StEmpty(S)) {exit(202);}
    else{
        return (S.elementi[S.top]);
    }
}



void Postorder(node i, BinaryTree T)
{
    if(i)
    {
        Postorder(BiLeftChild(i,T), T);
        Postorder(BiRightChild(i, T), T);
        printf(" %c", BiLabel(i, T));
    }
}

void printajdrvo(BinaryTree T, node root)
{
    printf(" %c ", BiLabel(root, T));
    if(BiLabel(BiLeftChild(root, T), T)== 0) {printf(" NULL ");return;}
    else{printf(" %c ", BiLabel(BiLeftChild(root, T), T) );}

    if(BiLabel(BiRightChild(root, T), T)== 0) {printf(" NULL\n"); return;}
    else{printf(" %c\n", BiLabel(BiRightChild(root, T), T) );}

    printajdrvo(T, BiLeftChild(root, T));
    printajdrvo(T, BiRightChild(root, T));

}

BinaryTree create(char string[100])
{
    Stack niz;
    StMakeNull(&niz);
    BinaryTree pom, poml, pomr;
    BiMakeNull(&pom);
    BiMakeNull(&poml);
    BiMakeNull(&pomr);
    BinaryTree newroot;

    int i=0;
    while(string[i]!='\0')
    {
        BiCreate(string[i], poml, pomr, &pom);


        if(string[i]>='A' && string[i]<='z')
        {
            StPush(pom, &niz);
        }
        else{

            BinaryTree l,d;
            BiMakeNull(&l);
            BiMakeNull(&d);
            BiMakeNull(&newroot);
            newroot=pom;
            
            d=StTop(niz);

            StPop(&niz);

            l=StTop(niz);

            StPop(&niz);

            BiCreate(string[i],l,d,&newroot);
            StPush(newroot, &niz);

        }
        BiMakeNull(&pom);
      i++;
    }
    return newroot;
}

int main()
{

    char string[100];
    printf("Enter postfix: \n");
    scanf(" %s", string);
    BinaryTree T;
    BiMakeNull(&T);
    T = create(string);
    printajdrvo(T, BiRoot(T));
    Postorder(BiRoot(T), T);
    return 0;
}
ou6hu8tu

ou6hu8tu1#

printajdrvo永远不会退出,它将永远递归
vs说

Severity    Code    Description Project File    Line    Suppression State
Warning C4717   'printajdrvo': recursive on all control paths, function will cause runtime stack overflow   ConsoleApplication3 C:\work\ConsoleApplication3\ConsoleApplication3.cpp 205

相关问题