Так как я не уверен, что каждый ответ полностью отвечает на него, вот реализация связного списка (написано без testig:
// your (correct) structure
struct Node
{
float item; // storage for the node's item
Node* next; // pointer to the next node
};
Теперь нам нужно два указателя где-нибудь, чтобы посмотреть список:
/* some pointers */
struct List
{
Node* head;
Node* tail;
};
Теперь нам нужно создать некоторые элементы. Как уже говорили другие, вы можете сделать это с новым:
/* create some elements we want to link in */
Node* elem1 = new Node();
Node* elem2 = new Node();
Node* elem3 = new Node();
/* maybe even set their properties! */
elem1->item = 3.14;
elem2->item = 3.14;
elem3->item = 3.14;
Обратите внимание, как я еще не пытался добавить эти элементы в список?Это потому, что я имею в виду функцию, которая выглядит следующим образом:
void addtolist(List &list, Node* node)
{
/* if no head, initialise the list */
if ( list->head == NULL )
{
list->head = node;
list->tail = node;
}
else if ( list->head != NULL && list->tail != NULL )
{
/* access the tail element and set its
next to this ptr.
Move tail to this node */
list->tail->next = node;
list->tail = node;
}
else
{
/* probably raise an exception! */
}
}
Вы можете вызвать это, выполнив это:
List l;
addtolist(l, elem1); /* etc */
Удаление элементов несколько сложнее, так как вынужно перейти к этому элементу, запомнить его предыдущий элемент, взять его следующий элемент, соединить их и удалить узел *, на котором вы находитесь.
Теперь для обхода списков ... ваша терминология HEAD|TAIL
напоминает мнеErlang и хвостовой рекурсии, где текущий элемент упоминается как голова, а остальная часть хвоста. Если я напишу:
Node* cur = l.head;
while ( cur != NULL )
{
// do something with cur.item ?
cur = cur->next;
}
Вы можете видеть это происходящее. Замена cur
на head
здесьбудет безвреднымanks к List
struct.
Наконец, я использовал очень C-подобный подход здесь, но есть область применения для шаблонов:
template<typename T>
struct node
{
T item; // storage for the node's item
Node<T>* next; // pointer to the next node
};
и инкапсуляция структуры List
как класс:
template<typename T>
class List
{
protected:
Node<T>* head;
Node<T>* tail;
public:
void addtolist(Node<T>* node);
Node<T>* gethead();
Node<T>* gettail();
}
Что немного приближает вас к std::list
.