У меня небольшие проблемы с тем, как я буду работать над этой функцией и что мне нужно делать. У меня есть номер int как мой тип данных и node * next в моем классе узла. У меня также есть указатели узлов, ток и темп. Мой вопрос в том, как я могу получить список целых чисел? Также как восходящий и убывающий работы работают в одном связанном списке?
Мой заголовочный файл:
#ifndef SDI_LL
#define SDI_LL
namespace SDI
{
class LinkedList
{
class Node
{
public:
int number; //data element
Node* next; //pointer to next, node inside each node
private:
};
private:
Node *head;
Node *current; //head, current and temp node pointers
Node *temp;
public:
LinkedList(); //constructor to access nodes from above
~LinkedList(); //destructor
void insert(int add);
void remove(int remove); //functions that access private data nodes above
void display();
void reverse();
void search(int searchNum);
void sortAscending();
void sortDecending();
void saveAll();
void restoreAll();
};
}
#endif
Моя восходящая функция до тех пор, где она начинается с начала и просматривает список:
void LinkedList::sortAscending()
{
current = head;
for (current = head; current;)
{
temp = current;
current = current->next;
}
}
В общем, вы должны использовать контейнеры, доступные в стандартных библиотеках, которые обеспечивают эффективные методы сортировки, где это применимо.
Тем не менее, если вы хотите сделать это для учебных целей - как вы, вероятно, должны "по крайней мере один раз" - тогда это не так сложно реализовать.
for (current = head; current;)
Это смешная for
цикла, лично я предпочел бы:
current = head;
while(current) // or current != nullptr to be more explicit
Обратите также внимание на то, что вы (необязательно, конечно) назначаете head
на current
дважды - непосредственно перед циклом for
и в его инициализации.
Простая схема (но совсем не эффективная!) Может заключаться в том, чтобы просто заменить элементы "не по порядку", когда вы перебираете список, пока не понадобится своп:
bool changeMade;
do{
changeMade = false;
current = head;
while( current ){
temp = current;
current = current->next;
if( current && current->data < temp->data ){
changeMade = true;
swap( temp->data, current->data );
}
}
} while( changeMade );
Это предполагает, что поле data
является единственным другим в узле, поскольку оно фактически не заменяет узлы, а только данные. (Выполнение первого на самом деле не является более сложным - но, не видя объявления типа вашего узла, я бы назвал имена и рискнул запутать проблему.)
Я не вижу никаких объявлений для текущего, head и temp, но я предполагаю, что они являются указателями на узел. Вы определили алгоритм сортировки? Должен ли алгоритм сортировки быть эффективным или что-то с производительностью пузырькового сортировки в порядке? С логикой, подобной сортировке пузырьков, вы можете многократно перемещать узел с наибольшим значением до конца списка. Или, чтобы сэкономить немного времени, вы можете удалить узел с наибольшим значением из исходного списка и вставить его в переднем плане нового списка, который окажется в отсортированном порядке. Более эффективные алгоритмы используют логику, основанную на сортировке слияния.
Для удаления или замены узлов с помощью указателя на указатель можно избежать специальной обработки для первого узла списка (тот, на который указывает pList в этом примере):
NODE * SortList(NODE * pList)
{
NODE * pNew = NULL; /* sorted list */
NODE **ppNode; /* ptr to ptr to node */
NODE **ppLargest; /* ptr to ptr to largest node */
NODE * pLargest; /* ptr to largest node */
while(pList != NULL){ /* while list not empty */
ppLargest = &pList; /* find largest node */
ppNode = &((*ppLargest)->next);
while(NULL != *ppNode){
if((*ppNode)->data > (*ppLargest)->data)
ppLargest = ppNode;
ppNode = &((*ppNode)->next);
}
pLargest = *ppLargest; /* move node to new */
*ppLargest = pLargest->next;
pLargest->next = pNew;
pNew = pLargest;
}
return(pNew);
}