2013-08-02 62 views
0

在向特定的成對頂點添加邊時,如何確定如何正確獲取指針,遇到了一些麻煩。使用鏈接列表的圖表表示

下面是關於頂點和節點完成輸入後鏈接列表應該如何看起來的一個簡短概念。

我該如何在neighborList上下訂單?如果在當前頂點中已經存在頂點邊緣,是否應該存在另一個條件?

繼承人的結構化類即時試圖建立:

class graph{ 
private: 
    typedef struct node{ 
     char vertex; 
     node * nodeListPtr; 
     node * neighborPtr; 

    }* nodePtr; 
    nodePtr head; 
    nodePtr curr; 
public: 
    graph(); 
    ~graph(); 

    void AddNode(char AddData); 
    void AddEdge(char V, char E); 
    void printList(); 
}; 

graph::graph(){ 
    head = NULL; 
    curr = NULL; 
} 

// Adds a node to a linked list 
void graph::AddNode(char AddData){ 
    nodePtr n = new node; 
    n->nodeListPtr = NULL; 
    n->vertex = AddData; 

    if(head != NULL){ 
     curr = head; 
     while(curr->nodeListPtr != NULL){ 
      curr = curr->nodeListPtr; 
     } 
     curr->nodeListPtr = n; 
    } 
    else{ 
     head = n; 
    } 
} 

// takes 2 Parameters (V is pointing to E) 
// I want to set it up where the neighborptr starts a double linked List basically 
void graph::AddEdge(char V, char E){ 
    // New Node with data 
    nodePtr n = new node; 
    n->neighborPtr = NULL; 
    n->vertex = E; 
    // go to the first node in the nodeList and go through till you reach the Vertex V 
    curr = head; 
    while(curr->vertex != V){ 
     curr = curr->nodeListPtr; 
    } 
    //Once the Vertex V is found in the linked list add the node to the neighborPtr. 
    curr->neighborPtr = n; 

} 

What Im trying to acheive in my Linked List Graph Rep.

+0

這應該是一個普通圖嗎?如果是這樣,請考慮使用鄰接列表:http://en.wikipedia.org/wiki/Adjacency_list –

回答

0

一個問題,您目前擁有的是,每個節點只能有一個「邊緣」節點。在你的例子中,節點A,C和D都是可能的,但是節點B並不是沒有做不同的事情。

問題發生在這裏:

curr->neighborPtr = n; 

每次調用AddEdge()相同的頂點,它會直接覆蓋該頂點的neighborPtr。在找到空指針之前,您不會努力遍歷neighborPtrs。

考慮添加另一個while循環遞歸增加邊:

while (curr->neighborPtr != null) 
    curr = curr->neighborPtr; 
curr->neighborPtr = n; 

請注意,這是不是在你的代碼,唯一的問題;你有幾個地方你應該防範空指針,而不是。例如:在AddEdge()中,如果無法找到頂點V會發生什麼?你的行爲假設它已經被創建。如果沒有,最終會出現一些空指針錯誤。記住這一點,如果你正在努力使代碼功能強大,除了功能強大。