Список C ++ Перейти на передний план; - PullRequest
0 голосов
/ 29 мая 2020

Здравствуйте, мне нужно найти самую раннюю заметку в одностороннем списке. К сожалению, я не могу использовать контейнер списка. Здесь код

Struct

    struct Sterminarz
{
    Sterminarz *next=NULL;
    int year;
    int month;
    int day;
    int hour;
    string note;

};

Функция, которая ищет самую раннюю заметку

  void findEarliest(Sterminarz *head)
{
    Sterminarz *p, *min;
    min = head;
    int counter = 0;


    for(p=head->next;p;p=p->next)
    {
        if (p->hour < min->hour)
        {
            min = p;
            counter++;  
            printNote(min, counter);

        }           
    }


}

И я не знаю, как переместить самый ранний элемент в начало списка без контейнера списка.

Ответы [ 2 ]

2 голосов
/ 29 мая 2020

Чтобы переместить узел в начало списка, вы можете сначала удалить узел из списка, а затем добавить его в начало списка. Это обе общие операции со списком. Если вы еще не написали функцию remove() для своего списка, сделайте это сейчас. Точно так же вы должны написать функцию add_to_head() или общую функцию add().

0 голосов
/ 29 мая 2020

Попробуйте что-то вроде этого:

struct Sterminarz
{
    Sterminarz *next = NULL;
    int year;
    int month;
    int day;
    int hour;
    string note;

    bool operator<(const Sterminarz &rhs) const {
        if (year < rhs.year) return true;
        if (year > rhs.year) return false;

        if (month < rhs.month) return true;
        if (month > rhs.month) return false;

        if (day < rhs.day) return true;
        if (day > rhs.day) return false;

        return (hour < rhs.hour);

        /* alternatively:
        return std::tie(year, month, day, hour) < std::tie(rhs.year, rhs.month, rhs.day, rhs.hour);
        */
    }

    /* or, if you just want to compare hours by themselves
    bool operator<(const Sterminarz &rhs) const {
        return (hour < rhs.hour);
    }
    */
};

Sterminarz* findEarliest(Sterminarz *head, Sterminarz** beforeEarliest)
{
    if (beforeEarliest)
        *beforeEarliest = NULL;

    if (!head)
        return NULL;

    Sterminarz *p, *previous = head, *earliest = head;
    int counter = 0;

    for(p = head->next; p; p = p->next)
    {
        if (*p < *earliest)
        {
            earliest = p;
            if (beforeEarliest) *beforeEarliest = previous;
            counter++;  
            printNote(earliest, counter);
        }           
        previous = p;
    }

    return earliest;
}

И затем вы можете сделать это, чтобы переместить самый ранний узел в начало списка:

Sterminarz *head;
...
Sterminarz *beforeEarliest;
Sterminarz *earliest = findEarliest(head, &beforeEarliest);
if (earliest != head)
{
    beforeEarliest->next = earliest->next;
    earliest->next = head;
    head = earliest;
}

Live Demo

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...