1. 程式人生 > >C語言-二叉樹-建立問題:指標的指標

C語言-二叉樹-建立問題:指標的指標

自己動手寫二叉樹的建立時出現了一個問題

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

typedef struct _BinNode BinNode;
struct _BinNode{
    char ch;
    BinNode * left;
    BinNode * right;
};

void CreateNode(BinNode * binNode){
    char ch;
    scanf("%c",&ch);
    if(ch=='*'){
        binNode=NULL;
    }
    else
{ binNode=(BinNode*)malloc(sizeof(BinNode)); binNode->ch=ch; CreateNode(binNode->left); CreateNode(binNode->right); } } void PreShow(BinNode *binNode){ if(!binNode){ return; } else{ printf("%c",binNode->ch); PreShow(binNode->left); PreShow(binNode->right); } } int
main(){ BinNode * binNode; printf("請輸入二叉樹前序遍歷結果:"); CreateNode(binNode); printf("前序遍歷結果:"); PreShow(binNode); return 0; }

這樣寫貌似沒什麼問題,但是執行結果卻不能達到預期所想
這裡寫圖片描述

通過debug發現二叉樹沒有建立好,核實了一遍程式碼,也沒有什麼邏輯問題,最後對照原始碼發現了的問題
這裡寫圖片描述
原始碼用的是指標的指標**CreateNode(BinNode binNode)
於是百思不得其解,一層指標就可以解決問題,最後在看了幾篇文章

二叉樹建立,指標問題
二叉樹為什麼用二級指標來構造的原因

自己動手再寫的時候發現了問題:
函式對指標進行修改,如果引數為指標,那麼傳遞的是指標的副本,真正的指標並沒有修改,就像swap(int a ,int b)不能交換a,b的值一個道理
對於函式修改指標的值,引數應當是指標的指標才行,就如同swap(int* a,int* b)一個道理

這是修改後的程式碼

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

typedef struct _BinNode BinNode;
struct _BinNode{
    char ch;
    BinNode * left;
    BinNode * right;
};
//指標的指標
void CreateNode(BinNode ** binNode){
    char ch;
    scanf("%c",&ch);
    if(ch=='*'){
        *binNode=NULL;
    }
    else{
        *binNode=(BinNode*)malloc(sizeof(BinNode));
        (*binNode)->ch=ch;
        CreateNode(&(*binNode)->left);
        CreateNode(&(*binNode)->right);
    }
}

void PreShow(BinNode *binNode){
    if(!binNode){
        return;
    }
    else{
        printf("%c",binNode->ch);
        PreShow(binNode->left);
        PreShow(binNode->right);
    }
}

int main(){

    BinNode * binNode;
    printf("請輸入二叉樹前序遍歷結果:");
    CreateNode(&binNode);
    printf("前序遍歷結果:");
    PreShow(binNode);

    return 0;
}

執行結果
這裡寫圖片描述