#include <stdlib.h>
#include <stdio.h>
#include "sorted_tree.h"
int insert_value(int value, struct TreeNode *n) {
if (value < n->value) {
if (n->left_child == NULL) {
struct TreeNode t = {0};
struct TreeNode *tpointer = &t;
tpointer->value = value;
tpointer->left_child = NULL;
tpointer->right_child = NULL;
n->left_child = tpointer;
printf("links eingefügt\n");
}
else {
insert_value(value, n->left_child);
}
return 0;
}
else if (value > n->value) {
if (n->right_child == NULL) {
struct TreeNode t = {0};
struct TreeNode *tpointer = &t;
tpointer->value = value;
tpointer->left_child = NULL;
tpointer->right_child = NULL;
n->right_child = tpointer;
printf("rechts eingefügt\n");
}
else {
insert_value(value, n->right_child);
}
return 0;
}
else {
return 1;
}
}
void print_inorder(struct TreeNode *n) {
if (n == NULL) {
printf("r");
return;
}
else {
print_inorder(n->left_child);
printf("%d ", n->value);
print_inorder(n->right_child);
}
}
int main() {
struct TreeNode t = {0};
struct TreeNode *tpointer = &t;
tpointer->value = 5;
tpointer->left_child = NULL;
tpointer->right_child = NULL;
insert_value(6, tpointer);
printf("%d", tpointer->right_child->value);
printf("%d", tpointer->right_child->value);
}
main 中的第一個 printf() 輸出正確的“6”,但第二個輸出一個亂數,就好像地址已更改一樣。6 應該插入到正確的子節點中,所以我期望 66 作為輸出。為什么會發生這種情況,我該如何解決?
uj5u.com熱心網友回復:
struct TreeNode t={0};
struct TreeNode *tpointer=&t;
tpointer->value=value;
of里面的那些代碼塊if/else if是insert_value不正確的。這是因為struct TreeNode t={0};創建了一個僅在封閉范圍內具有生命周期的自動變數。在這種情況下,生命周期僅在if/else if塊內。保留對變數的參考并在此之外使用它會導致未定義的行為。
解決方案是創建具有超出函式生命周期的變數。最常見的方法是使用動態分配的記憶體:
struct TreeNode *tpointer = malloc(sizeof(*tpointer));
free當不再需要時,不要忘記所有動態分配的記憶體。
uj5u.com熱心網友回復:
當樹的第一個節點沒有像在您的程式中那樣動態分配時的方法
struct TreeNode t={0};
struct TreeNode *tpointer=&t;
tpointer->value=5;
tpointer->left_child=NULL;
tpointer->right_child=NULL;
不好。事實上,您不能創建或使用空樹。
樹中的所有節點都應在需要時動態分配。
n所以函式內的指標insert_value 通常可以等于NULL一棵空樹。你需要檢查一下。否則這樣的陳述
if(value<n->value){
可以呼叫未定義的行為。
同樣在函式中,您正在設定指向該型別的本地物件的指標struct TreeNode,例如
struct TreeNode t={0};
struct TreeNode *tpointer=&t;
退出函式后,本地物件t將不再存在。所以一個無效的指標將被添加到樹中。
您需要動態分配一個新節點。
此外,該函式實際上回傳任意數字 0 或 1,因為該函式不回傳該函式后續遞回呼叫的最終值。
此外,在添加新節點的情況下回傳 1 在邏輯上更一致,否則回傳 0。
我將通過以下方式宣告和定義函式
int insert_value( struct TreeNode **n, int value )
{
if ( *n == NULL )
{
*n = malloc( sizeof( struct TreeNode ) );
( *n )->value = value;
( *n )->left_child = NULL;
( *n )->right_child = NULL;
return 1;
}
else if ( value < ( *n )->value )
{
return insert_value( &( *n )->left_child, value );
}
else if ( ( *n )->value < value )
{
return insert_value( &( *n )->right_child, value );
}
else
{
return 0;
}
}
如果在 main 中有一個指向根節點的指標,宣告如下
struct TreeNode *root = NULL;
然后該函式被稱為
insert_value( &root, value );
轉載請註明出處,本文鏈接:https://www.uj5u.com/qiye/420517.html
標籤:
上一篇:轉換為指標錯誤多執行緒程式
