簡體   English   中英

C ++在有向圖中創建指向節點的指針數組

[英]C++ Creating Array of Pointers to Nodes in Directed Graph

我正在嘗試創建一個由指向節點的指針數組表示的有向圖,但是我正在努力將節點添加到圖的每個索引中。 這是我所擁有的:

struct Node {
    int index;                 
    list<Node*> outgoingNodes; 
};

struct Graph {
    Node* nodePointers; // Array of pointers to nodes in graph
    int N;              // Number of nodes in graph       
};

這是我創建圖形的方式:

Graph* graph = new Graph();
graph->N = 7;
graph->nodePointers = new Node[graph->N];

然后,我嘗試通過以下方式將節點添加到圖中的索引0中,但出現錯誤:“操作數類型為'Node'和'Node *'”:

Node* a = new Node();
a->index = 0;
graph->nodePointers[0] = a;

在不更改任何結構的情況下,如何將節點正確添加到圖形的節點指針數組的索引中?

謝謝你的幫助!

Node* nodePointers是指向Node數組的指針。 如果要使用Node指針數組,則需要將其聲明為Node** nodePointers ,並使用new Node*[graph->N]分配該數組:

struct Graph {
    Node** nodePointers; // Array of pointers to nodes in graph
    int N;              // Number of nodes in graph       
};

int main() {
    Graph* graph = new Graph();
    graph->N = 7;
    graph->nodePointers = new Node*[graph->N];
    ...
}

第一:

struct Node {
    int index;                 
    list<Node*> outgoingNodes; 
};

盡管正確,但沒有明顯的原因它是無效的。 幾乎總是比列表更喜歡向量。 它很容易使用,但是占用的內存更少,並且在幾乎所有可能的用例上都可以更快地工作:

struct Node {
    int index;                 
    std::vector<Node*> outgoingNodes; 
};

接下來,代碼:

struct Graph {
    Node* nodePointers; // Array of pointers to nodes in graph
    int N;              // Number of nodes in graph       
};

保存一個Node對象塊,而不是指向節點的指針。 最好的辦法是使用指針向量:

struct Graph {
    std::vector<std::unique_ptr<Node>> nodePointers; // pointers to nodes in graph

};

這樣,重新分配和內存管理將是自動的。

然后,您的用法示例變為:

// are you sure graph has to be on the heap?
auto graph = std:: make_unique<Graph>();
graph->nodePointers.resize(7);

然后,您可以通過以下方式將節點添加到圖中的索引0中:

graph->nodePointers[0] = std::make_unique<Node>();
graph->nodePointers[0]->index = 0;


這是更好的方法,但是如果您堅持:

在不更改任何結構的情況下,如何將節點正確添加到圖形的節點指針數組的索引中?

然后您應該注意,“圖的數組”不是由指針組成的,而是由節點組成的。 因此添加節點的方式有所不同:

 // you can still allocate the graph on the heap, but the following way is safer Graph graph; graph.N = 7; graph.nodePointers = new Node[graph.N]; 

但是現在nodePointers是一個錯誤的名詞,因為它應該被命名為節點(而不是指針)。

然后按照以下方式將節點添加到圖中的索引0中(到此為止,它已經被構造):

graph->nodePointers[0].outgoingNodes.push_back(&graph->nodePointets[2]);

並且添加一個邊緣看起來不錯:

 graph->nodePointers[0].outgoingNodes.push_back(&graph->nodePointets[2]); 

在線圖- graph->nodePointers[0] = a; 將其更改為graph->nodePointers[0] = *a; 它會工作。

現在讓我解釋一下,假設您想要一個int數組,則可以將其聲明為int x[10] or int *x=new int(10) 在第二種情況下,x顯示的是一個指向int對象而不是int指針的指針。 希望您能找到解決方案。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM