2014-12-07 53 views
-2

我試圖實現一個二叉搜索樹來查找莫爾斯碼轉換,但是我在繞過這個概念和涉及的結構時遇到了麻煩。在C中設置二進制搜索的結構和節點,內存違規

我的更具體的問題是,我得到了一些內存違規,就像我正在寫給我的內存不可用。

我的結構是這樣的......

typedef struct mtn{ 
    char ASCII; 
    int isinit; 
    struct mtn *dah; 
    struct mtn *dit; 
} MTN; 

typedef struct tree{ 
    struct mtn *root; 
} Tree; 

,問題中的代碼就是我試圖初始化樹。

具體...

struct mtn* mtnNew() 
{ 
    struct mtn *node; 
    node = (MTN *)malloc(sizeof(MTN)); 
    node->isinit = 0; 
    node->dit = NULL; 
    node->dah = NULL; 
    return node; 
} 

void initializeTree(char ch, char *mch, Tree *tr) 
{ 
    MTN *curr = NULL; 

    int i = 0; 

    tr-> root = mtnNew();  //This is where the program breaks 

而如果任何人有任何的提示,這裏的函數的其餘部分...

void initializeTree(char ch, char *mch, Tree *tr) 
{ 
    MTN *curr = NULL; 

    int i = 0; 

    tr-> root = mtnNew(); 

    curr = tr-> root; 

    if(strlen(mch) == 1) 
    { 
     if(mch[i] == '-') 
     { 
      curr = mtnNew(); 
      curr-> dah-> ASCII = ch; 
      curr-> dah-> isinit++; 
     } 
     else if(mch[i] == '.') 
     { 
      curr = mtnNew(); 
      curr-> dit-> ASCII = ch; 
      curr-> dit-> isinit++; 
     } 
     else 
      printf("wut"); 
    } 


    while(mch[i] != '\0') 
    { 
     if(mch[i] == '-') 
     { 
      if(curr-> dah == NULL) 
       curr-> dah = mtnNew(); 
      curr = curr-> dah; 
      i++; 
     } 
     else if(mch[i] == '.') 
     { 
      if(curr-> dit == NULL) 
       curr-> dit = mtnNew(); 
      curr = curr-> dit; 
      i++; 
     } 
    } 

    curr-> ASCII = ch; 
    curr-> isinit++; 

    return; 
} 

不管怎麼說,任何幫助表示讚賞,因爲是方向良好的參考或其他有用的信息。

謝謝!

編輯:

愛好者,愛好者,和myTree被初始化如下...

char buff, buffs[8]; 
Tree *myTree = NULL; 

我對initializeTree()調用

while(!feof(BTkeyFile)) 
{ 
    i = 0; 
    buff = fgetc(BTkeyFile); 
    for(i = 0; i < 8; i++) 
     buffs[i] = '\0'; 
    while(buffs[--i] != '\n') 
    { 
     buffs[i] = fgetc(BTkeyFile); 
     i++; 
    } 
    initializeTree(buff, buffs, myTree); 
} 

而且它讀取該文件格式

A.- 
B-... 
C-.-. 
D-.. 
E. 

etc. 

編輯2:

這絕對是線路tr-> root = mtnNew();打破代碼,在函數內部和main()錯誤停止在該行。

+0

你怎麼稱呼'initializeTree()'? – Rohan 2014-12-07 13:02:33

+0

我添加了一個顯示它是如何完成的編輯@Rohan – Charles 2014-12-07 13:10:36

+0

'curr = mtnNew();'關聯丟失。 – BLUEPIXY 2014-12-07 13:14:12

回答

1

Tree *myTree = NULL; 

意味着你提領((Tree*)NULL)->root自己的函數中。解除引用NULL是不好的。試試這個:

Tree myTree; 
initializeTree(buff, buffs, &myTree); 
0

從您的代碼,您傳遞myTree這是NULLinitializeTree()。你引用它爲tr->root = mtnNew()這會讓你崩潰,因爲trNULL

在將其傳遞給初始化函數之前,您應該先將內存分配給myTree

喜歡的東西:

Tree *myTree = malloc(sizeof(*myTree)); 
+0

我不太明白你在暗示什麼。在將函數傳遞給函數之前,我應該使用大小爲「struct mtn」的malloc內存,然後在函數中將它設置爲等於'mtnNew()'? – Charles 2014-12-07 13:54:28

+0

@Charles,在答案中查看更新的行。 – Rohan 2014-12-07 14:07:17