Связанный список МОЖЕТ быть построен без использования new
, но в большинстве случаев это не очень практичное решение. Причина, по которой мы используем связанные списки (и деревья, и другие «связанные» структуры данных), должна иметь некоторый способ хранения произвольного количества элементов в структуре, где легко добавлять/удалять элементы в середине. Если бы это было не так, мы могли бы использовать массив или вектор.
Мы могли бы сделать короткий связный список, делая это:
Node a, b, c;
Node *head = &a; // Head is the pointer to the first element.
a.link = &b;
b.link = &c;
c.link = NULL;
// Clearly we want to set ch in each node as well, but I'm ignoring it for shortness.
Но это становится очень грязным, если мы не знаем, сколько ссылок нам нужно.
Итак, мы используем кучу для выделения элементов, потому что мы не знаем заранее, сколько они.
Связанный список использует указатели на «ближайшие» (или «предыдущие») узлы в списке - таким образом мы можем легко вставить элемент в середине списка. Или удалите элемент из середины.
В векторе из 1000 элементов, чтобы удалить первый элемент означает перемещение 999 элементов «на один шаг». Для удаления первого элемента в связанном списке требуется существенно одно изменение: переместите головку списка в следующий элемент.
Удаление 500-го элемента вектора требует перемещения 499 элементов на «один шаг». Удаление 500-го элемента связанного списка требует, чтобы ссылка из 499-го была пропечена, чтобы указать на 501-й элемент. Это займет одну операцию. (Конечно, нам также нужно найти правильный элемент для удаления, но если элементы в векторе не отсортированы каким-то образом, что помогает искать, это по существу то же самое).
Для начала я предполагаю, что вы понимаете, что c/C++ чувствительны к регистру? 'node' - это не то же самое, что' Node'. В любом случае это тонкий 'Node * temp = new Node' или' Node * temp1' - они фактически эквивалентны.Первый пример не только объявляет переменную, но и выделяет для нее память. Остальная часть вашего вопроса связана с кодом, который вы не показывали. Никаких комментариев по невидимому коду! – enhzflep
второй, что вы имеете в виду под названием «Node temp» без звезды? – concept3d
@enhzflep Они не эквивалентны. Один экземпляр объекта 'node', другой - нет. – juanchopanza