2012-10-29 3 views
0

이진 트리와 BFS 순회를 구현했습니다. 이 프로그램은 다음과 같습니다 : 코드가 긴BFS에서 BFS 통과시 seg fault가 발생했습니다.

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 insert는 요소를 큐에 삽입하고 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; 
} 

NULL로 설정된 경우 front에 있지만 rear 여전히 현재 free D 메모리 가리킨다.

은 문제를 해결하기 위해

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

추가합니다.