2011-06-08 44 views
-1

這裏是我到目前爲止的代碼讀取字符串建立一個二叉搜索樹

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

#define lineSize 256 

struct recordNode { 
    char district[256]; 
    int employees; 
    int employers; 
    int students; 
    int retried; 
    int others; 
    struct recordNode* left; 
    struct recordNode* right; 
}; 

struct stockNode* addRecord(struct recordNode* tree, struct recordNode node) { 
    struct recordNode* newnode; 
    struct recordNode* searcher; 

    /* allocate memory block and assign parameter values to it */ 
    newnode = (struct recordNode*)malloc(sizeof(struct recordNode)); 

    newnode->left = NULL; 
    newnode->right = NULL; 
    /* check if the tree is empty, and in such case, return the newnode as*/ 
    /* the first node of the tree */ 
    if (tree == NULL) 
    return newnode; 
    /* searcher is the pointer to search for the correct location for insertion */ 
    searcher = tree; 
    while (1) { 
    /* see if the newnode should go to left branch */ 
     //if (code < searcher->code) { 
     if (strcmp(tree->district, node.district) < 0) { 
     /* yes, and if the left branch is empty, this is the insertion location */ 
     if (searcher->left == NULL) { 
      searcher->left = newnode; 
      return tree; 
     } 
     else { /* not yet, keep moving to the next level down */ 
     searcher = searcher->left; 
     continue; 
     } 
    } 
    /* see if the newnode should go to right branch */ 
     if (strcmp(tree->district, node.district) > 0) { 
    /* yes, and if the right branch is empty, this is the insertion location */ 
     if (searcher->right == NULL) { 
      searcher->right = newnode; 
      return tree; 
     } 
     else { /* not yet, keep moving to the next level down */ 
     searcher = searcher->right; 
     continue; 
     } 
    } 
    else { 
     free(newnode); 
     return NULL; /* an error indication */ 
    } 
    } 
} 

void getFile() { 
    struct recordNode node; 
    struct recordNode *tree; 

    FILE* fpin; 
    FILE* fpout; 

    char line_buffer[lineSize]; /* BUFSIZ is defined if you include stdio.h */ 
    int counter = 0; 

    //file validation 
    fpin=fopen("testData.txt", "r"); 

    if (fpin == NULL) exit(0); 
     counter = 0; 
    while (fgets(line_buffer, sizeof(line_buffer), fpin)) { 
       counter++; 
       if (counter != 1) { 
       sscanf(line_buffer, "%[^','],%d,%d,%d,%d", node.district, &node.employees, &node.students, &node.retried, &node.others); 
       tree = addRecord(tree, node); **//ERROR** 

       } 

    } 
     getchar(); 

} 

void main() { 

    getFile(); 
    getchar(); 

} 

以下行:

tree = addRecord(tree, node); 

給出了這樣的錯誤:

//ERROR Project Project2.exe raised exception class EAccessViolation with message 'Access violation at address 32657E39. Read of address 00000001'. Process stopped. Use Step or Run to continue

我該如何解決這個問題?

+0

你遇到什麼錯誤?你有什麼嘗試去調試這個問題? – 2011-06-08 05:22:24

+0

Project Project2.exe引發異常類EAccessViolation,消息'地址32657E39處出現訪問衝突。讀取地址00000001'。進程停止。使用Step或Run繼續(borland C++) – hkvega 2011-06-08 05:25:45

回答

1

確保在首次創建時將* tree指針指定爲NULL。否則它可以是任何值。

void getFile() { 
     struct recordNode node; 
     struct recordNode *tree=NULL; 
     ...