Сортировка по возрастанию - связанный список [закрыт]

0

У меня небольшие проблемы с тем, как я буду работать над этой функцией и что мне нужно делать. У меня есть номер 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;

    }
}
  • 2
    Для внутреннего списка, такого как std :: list, существует специальная сортировка для списков, std :: list :: sort, но узлы поддерживаются в классе, и функции класса копируют данные узла между внутренними узлами и некоторыми указанный пользователем тип (например, структура), который не включает ссылки. Однако в этом случае вы создаете свой собственный класс узлов и функций, таких как ваш собственный вид, поэтому стандартные функции не помогут.
  • 0
    @Ryan - Для этой сортировки списка вы хотите поменять местами данные в узлах или поменять местами узлы?
Показать ещё 2 комментария
Теги:
sorting
linked-list

2 ответа

2

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

Тем не менее, если вы хотите сделать это для учебных целей - как вы, вероятно, должны "по крайней мере один раз" - тогда это не так сложно реализовать.

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 является единственным другим в узле, поскольку оно фактически не заменяет узлы, а только данные. (Выполнение первого на самом деле не является более сложным - но, не видя объявления типа вашего узла, я бы назвал имена и рискнул запутать проблему.)

  • 0
    Для std :: sort требуются итераторы с произвольным доступом, а списковые классы обычно не поддерживают итераторы с произвольным доступом. std :: list: sort будет работать, но узлы списка являются внутренними по отношению к std :: list, а исходное сообщение реализует свои собственные узлы и функции класса списка.
  • 0
    Немного перепутан с обменом строк (temp-> data, current-> data);
Показать ещё 7 комментариев
0

Я не вижу никаких объявлений для текущего, 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);
}
  • 0
    @Jasen - я случайно разместил свой ответ, прежде чем он был завершен. Теперь есть ответ.
  • 0
    @Ryan - это то, что вы хотите сделать, или вы рассматривали бы удаление узла и вставку его в новый список как лучший вариант? Если это домашнее задание, я не уверен, сколько кода мы должны сделать для вас. Можете ли вы попытаться написать код, который находит самый большой узел в исходном списке?
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню