Разработать функцию перестановки заданного элемента в начало списка

Есть данная программа. Нужно "разработать функцию перестановки заданного элемента в начало списка"

Содержание файла "input.txt"

"Lo in the orient when the gracious light Lifts up his burning head, each under eye Doth homage to his new-appearing sight, Serving with looks his sacred majesty; And having climbed the steep-up heavenly hill, Resembling strong youth in his middle age, Yet mortal looks adore his beauty still, Attending on his golden pilgrimage: But when from highmost pitch, with weary car, Like feeble age he reeleth from the day, The eyes (fore duteous) now converted are From his low tract and look another way: So thou, thyself outgoing in thy noon, Unlooked on diest unless thou get a son."

#include <cctype>
#include <fstream>
#include <iostream>
#include <string>

using namespace std;

struct Node
{
    string word; // область данных
    int count;
    Node *next; // ссылка на следующий узел
};

typedef Node *PNode; // тип данных: указатель на узел

PNode Head = NULL;

PNode CreateNode (string NewWord)
{
    PNode NewNode = new Node; // указатель на новый узел
    (NewNode->word).assign(NewWord); // записать слово
    NewNode->count = 1; // счетчик слов = 1
    NewNode->next = NULL; // следующего узла нет
    return NewNode; // результат функции – адрес узла
}

void AddFirst (PNode &Head, PNode NewNode)
{
    NewNode->next = Head;
    Head = NewNode;
}

void AddAfter (PNode p, PNode NewNode)
{
    NewNode->next = p->next;
    p->next = NewNode;
}

void AddBefore(PNode &Head, PNode p, PNode NewNode)
{
    PNode q = Head;
    if (Head == p) // если p голова списка
    {
        AddFirst(Head, NewNode); // вставка перед первым узлом
        return;
    }
    while (q && q->next != p) // ищем узел, за которым следует p
        q = q->next;
    if (q) // если нашли такой узел,
        AddAfter(q, NewNode); // добавить новый после него
}

void AddLast(PNode &Head, PNode NewNode)
{
    PNode q = Head;
    if (Head == NULL) // если список пуст,
    {
        AddFirst(Head, NewNode); // вставляем первый элемент
        return;
    }
    while (q->next)
        q = q->next; // ищем последний элемент
    AddAfter(q, NewNode);
}

PNode Find (PNode Head, string NewWord)
{
    PNode q = Head;
    while (q && (q->word).compare(NewWord))
        q = q->next;
    return q;
}

PNode FindPlace (PNode Head, string NewWord)
{
    PNode q = Head;
    while (q && (NewWord.compare((q->word)) > 0))
        q = q->next;
    return q;
}

void EditWord(string *word)
{
    if (!isalpha((*word).back()))
        (*word).pop_back();
    if (!isalpha((*word).back()))
        (*word).pop_back();
    if (!isalpha((*word).front()))
        (*word).erase(0, 1);
    for (unsigned int i = 0; i < (*word).length(); i++)
        (*word).at(i) = tolower((*word).at(i));
}

int main()
{
     PNode Head = NULL, p, where;
     ifstream fi;
     ofstream fo;
     string word;
     fi.open("E:\\input.txt");
     if(fi)
     {
         while (!fi.eof())
         {
             fi >> word;
             EditWord(&word);
             p = Find (Head, word);
             if (p != NULL)
                 p->count++;
             else
             {
                 p = CreateNode(word);
                 where = FindPlace(Head, word);
             if (!where)
                 AddLast(Head, p);
             else
                 AddBefore(Head, where, p);
             }
         }
         fi.close();
         fo.open("E:\\output.txt");
         if (fo)
         {
             p = Head;
             while (p)
             {
                 fo.width(20);
                 fo << left << p->word << '\t' << p->count << endl;
                 p = p->next;
             }
             fo.close();
         }
         else
             cout << "file opening error!" << endl;
     }
     else
         cout << "file not found!" << endl;
    return 0;
}


Perhaps I didn't integrate my code correctly

void MoveToFront(PNode &Head, string target)
{
    if (Head == NULL || Head->word == target) {
        // Если список пуст или заданная строка уже находится в начале списка, ничего не делаем
        return;
    }

    PNode prev = NULL;
    PNode curr = Head;

    // Поиск узла с заданной строкой в списке
    while (curr != NULL && curr->word != target) {
        prev = curr;
        curr = curr->next;
    }

    if (curr == NULL) {
        // Если заданная строка не найдена в списке, ничего не делаем
        return;
    }

    // Перестановка узла в начало списка
    prev->next = curr->next;
    curr->next = Head;
    Head = curr;
}

string target = "example";
MoveToFront(Head, target);

Ответы (0 шт):