2012-10-29 66 views
0

我實現了一個二叉樹及其BFS遍歷。該程序如下:BST遍歷BFS中的seg錯誤

struct elemq{ 
    int ele; 
    struct elemq *left; 
    struct elemq *right; 
}; 

struct que{ 
    struct elemq *ss; 
    struct que *next; 
}; 

void qinsert(struct elemq *ptr){ 
    struct que *node; 
    node = (struct que *)malloc(sizeof(struct que)); 
    if(front == NULL && rear == NULL){ 
      node->ss = ptr; 
      node->next = NULL; 
      front = node; 
      rear = node; 
    } 
    else{ 
      node->ss = ptr; 
      node->next = NULL; 
      rear->next = node; 
      rear = node; 
    } 
} 

struct elemq *qdelete(){ 
    if(front == NULL && rear == NULL){ 
      cout << "No elements to delete\n"; 
      exit(0); 
    } 
    struct elemq *dd = front->ss; 
    struct que *ddd = front; 
    front = front->next; 
    free(ddd); 
return dd; 
} 

int isempty(){ 
    if(front == NULL && rear == NULL){ 
      return 1; 
    } 
    else{ 
      return 0; 
    } 
} 

void bfs(){ 
    qinsert(root); 
    struct elemq *fff; 
    while(!isempty()){ 
      fff = qdelete(); 
      cout << fff->ele << "\n"; 
      if(fff->left != NULL){ 
        qinsert(fff->left); 
      } 
      if(fff->right != NULL){ 
        qinsert(fff->right); 
      } 
    } 
} 

雖然代碼很長,但它很容易理解。 elemq結構是樹中節點的結構。 que是我用來實現bfs的隊列。 q插入是將元素插入到隊列中,qdelete刪除隊列中的元素。 isempty()用於檢查隊列是否爲空。該程序顯示根元素,然後給出分段錯誤。請幫忙。從相當一段時間掙扎。

回答

3

如果只有一個隊列中的元素qdelete功能無法正常工作:

struct elemq *qdelete(){ 
    if(front == NULL && rear == NULL){ 
      cout << "No elements to delete\n"; 
      exit(0); 
    } 
    struct elemq *dd = front->ss; 
    struct que *ddd = front; 
    front = front->next; 
    free(ddd); 
return dd; 
} 

在這種情況下front設置爲NULL,但rear仍然指向現在free d內存。

添加

if (front == rear) { 
    struct elemq *dd = front->ss; 
    free(front); 
    front = rear = NULL; 
} else { 
    // what you have 
} 

修復它。