Я учусь в университете Колорадо Меса. Начальник отдела преподает обоснованный метод для связанных списков:
struct nodeType
{
int id;
nodeType *link;
};
void createList(nodeType *&head, nodetype *&tail)
{
head = new nodetype;
tail = new nodetype;
head->id=-1; //some initialize value
head->link=tail;
tail->link=NULL;
}
void insertList(nodeType *&head, nodeType *&tail)
{
nodetype *knew,*prior, *next;
knew = new nodetype;
knew ->name = name
prior = head;
next = head->link;
while(next != tail && knew->id > next->id)
{
prior = next;
next = next->link;
}
prior->link = knew;
knew->link = next;
}
Она учит этому по понятным причинам. С заземленной головой и хвостом легче вставлять из, как вы вызываете вышеупомянутую функцию, а затем пишете функцию для добавления всех данных внутри этих двух узлов, и это немного легче при написании вашей функции удаления, так как вы никогда не удаляете голову или хвост, и, следовательно, становится труднее потерять список и создать мусор.
Мой профессор алгоритмов говорит, что везде, где я сталкиваюсь со списками «в реальном мире», необоснованный список был бы лучше. На других языках, использующих STL и в Интернете, я не нашел бы список функций, которые реализуют голову и хвост.
Я просто хочу быть готовым к программированию в реальном реальном мире, а не в том, что мои профессора считают реальным миром, поэтому мой вопрос таков: лучше ли использовать один или другой, использовать то, что мне легче, или подходить к каждой проблеме с учетом обоих?
Заранее спасибо за то, что уделили мне время для разрешения этой вражды.