Как связать узлы LinkedList с отображением значений - PullRequest
0 голосов
/ 12 января 2019

Я хочу реализовать структуру данных графа, где каждый узел представлен:

type Node struct {
    root  string
    links []*Node
}

В основном каждый узел имеет значение root и список ссылок, для каждой ссылки требуется только сохранить указатель на него, поскольку память структуры будет выделена и принадлежит карте:

rooturl := "root"
graph := Node{rooturl, []*Node{}}
graphMap := make(map[string]Node)
graphMap[rooturl] = graph

Проблема возникает, когда я пытаюсь добавить указатель на недавно созданный узел:

u := "new node"
// if the link is not stored in the graph not create a new node
if _, exists := graphMap[u]; !exists {
    graphMap[u] = Node{u, []*Node{}}
}
// add the links to the graph
graphMap[rooturl].links = append(graphMap[rooturl].links, &graphMap[u])

Я получаю две ошибки:

невозможно присвоить структуре поля graphMap [rooturl] .links в карте

и

не может получить адрес graphMap [u]

Как мне решить это правильно? Я также хотел бы запросить карту дважды с помощью graphMap[rooturl].links при добавлении (но так как я не могу взять указатель или ссылку на него, я не знаю как)

Ответы [ 2 ]

0 голосов
/ 12 января 2019

Поскольку go является языком для сборки мусора, вам не нужно понятие карты, «владеющей» памятью узла. Вы, вероятно, можете просто хранить указатели на карте.

https://play.golang.org/p/DpcsIqg0Trx

0 голосов
/ 12 января 2019

То, чего вы пытаетесь достичь, невозможно, как вы это делаете. Речь идет о адресуемости и назначаемости . Вы должны искать спецификацию языка для этой клавиатуры. Значения карты не адресуемы, поэтому поле структуры в этом значении не может быть назначено. Также ваш дизайн структуры данных выглядит не очень эффективным, по крайней мере, для меня.

Мне кажется, нет причин хранить значения на карте, ссылки будут достаточно хорошими

type Node struct {
    root  string
    links []*Node
}
//////
rooturl := "root"
graph := Node{rooturl, []*Node{}}
graphMap := make(map[string]*Node)
graphMap[rooturl] = &graph
u := "new node"
// if the link is not stored in the graph not create a new node
if _, exists := graphMap[u]; !exists {
    graphMap[u] = &Node{u, []*Node{}}
}
// add the links to the graph
graphMap[rooturl].links = append(graphMap[rooturl].links, graphMap[u])

Рабочий пример

Если вы все равно предпочитаете сохранять фактические значения на карте, вам вообще не нужна древовидная структура. Это похоже на ненужные накладные расходы. Хранящейся на карте информации будет достаточно для любых операций.

type Node string
type Graph map[Node][]Node
////
rooturl := Node("root")
graph := make(Graph)
graph[rooturl] = make([]Node, 0)
u := Node("new node")
// if the link is not stored in the graph not create a new node
if node, exists := graph[u]; !exists {
    graph[u] = make([]Node, 0)
    graph[rooturl] = append(graph[rooturl], u)
}

Рабочий пример

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...