C语言顺序存储结构二叉树创建失败无输出问题求解
问题诊断
你的结构体定义本身没有错误,无法正常输出是内存访问、输入逻辑等环节的问题,具体错误如下:
- 野指针批量访问:
main函数中定义的Bitree *t1未初始化就直接传入create函数,属于野指针访问;同时Bitree结构体内的Tree *a[100]数组存储的都是树节点指针,没有给每个指针分配Tree类型的内存空间就直接访问->data成员,直接触发内存访问错误。 - 输入格式错误:所有
scanf("%d ",&x)语句中%d后面多写了空格,会导致输入数字后需要额外输入非空白字符程序才会继续执行,输入逻辑全程卡住。 - 多余的无效代码:
create函数开头对tree1->a[0]的赋值操作完全无用,你的二叉树是从下标1开始存储的,这段代码只会额外触发野指针访问。 - 指针未初始化导致遍历逻辑错误:创建每个树节点时只赋值了
data成员,left和right指针都是随机野值,前序遍历中判断x->left!=NULL/x->right!=NULL的逻辑完全失效,会访问非法内存。
修复方案
- 先在
create函数内完成Bitree结构体的内存分配,再给每个用到的Tree节点分配内存,同时初始化left/right指针为NULL。 - 删掉所有
scanf语句中%d后面的多余空格。 - 删掉
create函数中对a[0]的无用操作代码。 main函数不需要预先定义Bitree指针,直接接收create函数返回的已经分配好内存的结构体指针即可。
修复后完整可运行代码
#include <stdio.h> #include <stdlib.h> typedef struct node { int data; struct node* left; struct node* right; }Tree; typedef struct bit { Tree *a[100]; int length; }Bitree; typedef struct Stack { Tree *sq[1000]; int top; }stack; int empty(stack s) { return s.top==-1; } void push(stack *s,Tree *p) { s->sq[++s->top]=p; } void pop(stack *s) { if(s->top!=-1) { s->top--; } } //return the top element Tree *top(stack s) { if(s.top!=-1) return s.sq[s.top]; return NULL; } Bitree *create(int n) { // 先给Bitree分配内存 Bitree *tree1 = (Bitree*)malloc(sizeof(Bitree)); tree1->length=0; int x; printf("请输入根节点\n"); scanf("%d",&x); // 给根节点分配内存 tree1->a[1] = (Tree*)malloc(sizeof(Tree)); tree1->a[1]->data = x; tree1->a[1]->left = NULL; tree1->a[1]->right = NULL; tree1->length++; for(int i=2;i<=n;i++) { // 先给当前节点分配内存 tree1->a[i] = (Tree*)malloc(sizeof(Tree)); tree1->a[i]->left = NULL; tree1->a[i]->right = NULL; if(i%2==0) { printf("please input left binary tree of node %d\n", tree1->a[i/2]->data); scanf("%d",&x); tree1->a[i]->data=x; tree1->a[i/2]->left=tree1->a[i]; tree1->length++; } else { printf("please input right binary tree of node %d\n", tree1->a[i/2]->data); scanf("%d",&x); tree1->a[i]->data=x; tree1->a[i/2]->right=tree1->a[i]; tree1->length++; } } return tree1; } void preorder1(Bitree *t) { stack s; s.top=-1; if(t->a[1]!=NULL) { push(&s,t->a[1]); } while(!empty(s)) { Tree *x=top(s); pop(&s); printf("%d ",x->data); if(x->right!=NULL) push(&s,x->right); if(x->left!=NULL) push(&s,x->left); } } int main() { int n; printf("请输入二叉树总节点数:\n"); scanf("%d",&n); Bitree *t1 = create(n); printf("前序遍历结果:\n"); preorder1(t1); // 可选:添加内存释放逻辑避免内存泄漏 return 0; }
内容的提问来源于stack exchange,提问作者waggghhh
相关产品推荐
相关产品推荐

