代碼是為了創建一個以順序結構存盤的二叉樹,并且能夠以先前的順序遍歷二叉樹。但是,當我創建二叉樹時,它無法輸出。為什么創建二叉樹會出現問題?結構有問題嗎?請告訴我如何解決這個問題?我會感謝你所做的。
#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];
}
Bitree *create(Bitree *tree1,int n)
{
int x;
tree1->a[0]->data=1;
printf("%d ",tree1->a[0]->data);
tree1->length=0;
printf("請輸入根節點\n");
scanf("%d ",&x);
tree1->a[1]->data=x;
tree1->length ;
for(int i=2;i<=n;i )
{
if(i%2==0)
{
printf("please input left binary tree\n");
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\n");
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;
Bitree *t1;
scanf("%d",&n);
t1=create(t1,n);
preorder1(t1);
}
uj5u.com熱心網友回復:
我看到的第一個問題是,您忘記分配您的Bitree和其中的a結構。嘗試這個 :
int main()
{
int n;
Bitree *t1 = (Bitree*) malloc(sizeof(Bitree));
int i = 0 ;
for(i ; i < 100 ; i )
t1->a[i] = (Tree*) malloc(sizeof(Tree));
scanf("%d",&n);
t1=create(t1,n);
preorder1(t1);
for(i = 0 ; i < 100 ; i )
free(t1->a[i]);
free(t1);
}
uj5u.com熱心網友回復:
該計劃的主要問題包括:
正如@AsmineBensalem 首先觀察到的那樣,取消參考
main()的指標的不確定初始值。t1function 的簽名
create()表明,對于應該如何分配空間可能存在一些混淆——create()接收一個指向 a 的指標Bitree,但也回傳一個。如果期望該函式分配空間,則它不需要接收指向現有空間的指標,但鑒于它實際上依賴于呼叫者提供的有效Bitree *,它似乎沒有什么意義回顯相同的指標值給來電者。為了記錄,
create()按照目前所寫的,我會這樣寫main()(沒有malloc()):int main(void) { int n; Bitree t1 = { .length = 0 }; // not a pointer; with initializer scanf("%d", &n); create(&t1, n); preorder1(&t1); }宣告
t1為 aBitree而不是 aBitree *為整體提供存盤,Bitree而不僅僅是指向一個的指標。有關初始化程式的更多資訊,請參見下文。t1->a當這些(指標)值不確定時,取消參考元素的值,正如@AsmineBensalem 首先觀察到的那樣。這與上一個問題本質上是一樣的,它的重復表明你不明白宣告一個指標只會得到一個指標,而不是它指向的物件。由于您似乎試圖避免動態分配,您可以通過更改 type 的定義Bitree以包含所需Tree物件的陣列而不是指向此類物件的指標來開始解決此問題:typedef struct bit { Tree a[100]; // array of Tree, not of Tree * int length; } Bitree;這將需要在代碼的其他地方進行一些額外的更改,但這些都很簡單。
無法初始化少于兩個子節點的節點的
left和right指標。您的preorder()函式假定這些將是NULL節點在指定方向上沒有子節點的地方,但create()不能確保這一點。但是,您可以通過更改
Bitree前一點中描述的 的定義來自動獲得它,并確保您的Bitree物件是使用初始化程式宣告的,如上面的第一點所示。在這種情況下,您不必顯式初始化所有指標來為它們獲取 null 初始值,但您確實需要為Bitree.或者,您可以只
create()顯式分配NULL給它初始化的每個節點的子指標。
其他問題包括:
Function
create()的scanf()格式會導致誤導行為。這段代碼出現了 3 次:scanf("%d ",&x);格式中的尾隨空格匹配任意數量的空格,因此
scanf必須通過繼續讀取空格來匹配它,直到它看到非空格。實際效果是用戶必須在列印每個非根節點的提示之前輸入該節點的值,并且他們需要輸入額外的值或某種尾隨垃圾以完成輸入階段。只需洗掉每種格式末尾的空格:scanf("%d", &x);函式
top()被宣告為回傳 aTree *,但是當stack傳遞給它的為空時,它終止而不回傳任何內容。函式
top()和empty()每個都接收 astack作為引數,按 value。盡管這本身并不是錯誤,但原則上確實涉及在每次呼叫時復制調??用者的引數。stack是一個相當大的結構,所以這是不可取的。pop()從堆疊中彈出一個元素而不回傳它是令人驚訝的。您可以通過首先檢索頂部元素top()然后pop()ping 來處理它,但更傳統的是pop()同時從堆疊中彈出一個元素并回傳該元素。It is surprising and unnecessary that
create()does not use the tree node at index 0. (I discount entering a dummy value into it, since that's purposeless when you don't mean for that value to be accessed elsewhere.)
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/335627.html
標籤:C
上一篇:C中%fl和%lf之間的區別
