Отображает обратный порядок, но не в обратном порядке c

#c #templates #reverse #allocation

#c #шаблоны #обратный #распределение

Вопрос:

Он не будет отображать массив string char в обратном порядке (cde), но он отображает массив в обратном порядке (edc). Не могли бы вы, пожалуйста, помочь с тем, почему он не отображает cde?

Я пытался изменить имена переменных, но я новый программист, поэтому я действительно еще не знаю, что делать.

 #include <iostream>
using namespace std;

// of linked list in reverse order

// Structure of a node

template<class T>
struct listrec2
{
    T value; //corresponds to data
    listrec2 *next; //points to next node
    listrec2 *prev; //points to previous nod
};

template<class T>
void downwardSearch(listrec2<T> *head)
//traverse from start of linked list to end of linked list
//print out value of each node along way
{

    char s[] = { 'c', 'd', 'e' };
// if you wanted to make it in the function listrec2<T> *tail;

    listrec2<T> *current;
    listrec2<T> *tail;
    listrec2<T> value;

    head = tail = new listrec2<T>; // make a new node
    head->value = s[0];
    tail = NULL;
    head = NULL;

    for (int i = 1; i < strlen(s); i  )
    {
        current = new listrec2<T>; //makes new node
        current->value = s[i];
        current->next = NULL;
        current->prev = tail;
        tail->next = current;
        tail = current;

    }

    listrec2<T> *ptr;
    ptr = head;
    cout << "The array in non-reverse order: " << endl;
    while (ptr != NULL)
    {
        cout << ptr->value;
        ptr = ptr->next;

    }
}

template<class T>
void upwardSearch(listrec2<T> *tail)
{

    char s[] = { 'c', 'd', 'e' };
// if you wanted to make it in the function listrec2<T> *tail;

// listrec2<T> *temp;
    listrec2<T> *current2;
    listrec2<T> *tail2;
    listrec2<T> *value;
    listrec2<T> *head2;

    head2 = tail = new listrec2<T>; // make a new node
    head2->value = s[0];
    tail2 = NULL;
    head2 = NULL;

    for (int i = 1; i < strlen(s); i  )
    {
        current2 = new listrec2<T>;
        current2->value = s[i];
        current2->next = NULL;
        current2->prev = tail;
        tail->next = current2;
        tail = current2;

    }

    listrec2<T> *ptr2;
    ptr2 = tail;
    cout << "The array in reverse order or backwards: " << endl;
    while (ptr2 != NULL)
    {
        cout << ptr2->value;
        ptr2 = ptr2->prev;
    }
    cout << endl;
}

int main()
{
//missing info here

    listrec2<char> *head;
    listrec2<char> *tail;

    upwardSearch(head);

    downwardSearch(tail);

    return 0;

}
  

Ожидаемые результаты: массив перед обращением: cde
массив после reversa: edc.

Комментарии:

1. Добро пожаловать в stackoverflow! Здесь люди с радостью ответят на конкретные вопросы по программированию, которые вы приложили некоторые усилия, чтобы решить самостоятельно и представить в легко понятной форме. Люди вряд ли положительно отреагируют на дамп кода и «пожалуйста, найдите мою проблему». Пожалуйста, закройте этот вопрос, сузьте круг вопросов, которые вам непонятны, и задайте новый конкретный вопрос по этому вопросу, если вы все еще застряли.

2. Обе ваши search функции имеют неопределенное поведение.

3. head = tail = new listrec2<T>; ОК. head->value = s[0]; Возможно, это хорошая идея. Нужно продолжать читать. head = NULL; Почему? Вы только что выделили и настроили head . Зачем использовать nuke?

4. Эта строка выглядит не очень хорошо: ` head2 = tail = new listrec2<T>; // создать новый узел` Вероятно, нужен tail2?

5. Похоже, вам нужно разделить вашу логику: вам нужна одна функция для создания вашего связанного списка и отдельная функция для поиска в нем. Вы смешали их вместе, что означает, что вы создадите связанный список при поиске, что противоречит интуиции.

Ответ №1:

Вот один из способов сделать это с помощью функций create_list, search_up, search_down и destory_list. Я стараюсь использовать имена переменных, которые являются более описательными. Мне не нравится listrec2 , потому что это очень запутанно. Это заставляет меня думать о втором узле, но это не то, чем он является. Это тип узла.

Кроме того, хорошей привычкой является использование заглавных букв в ваших типах (например, Node). Затем вы можете использовать версию в нижнем регистре для объекта (например, Node узел;)

 #include <iostream>
using namespace std;

// of linked list in reverse order

// Structure of a Node

template<class T>
struct Node {
    T value; //corresponds to data
    Node *next; //points to next Node
    Node *prev; //points to previous nod
};

template<typename T>
void CreateList(Node<T> *amp;head, Node<T> *amp;tail, T value_array[], int array_size)
{

  head = nullptr;
  tail = nullptr;

  for (int i = 0; i < array_size; i  ) {
    // Create new node and add node to the end of the list
    Node<T> *node = new Node<T>();

    node->next = nullptr;
    node->prev = tail;
    if (head == nullptr) {
      head = tail = node;
    } else {
      tail->next = node;
      tail = node;
    }
    node->value = value_array[i];

  }
}

template<class T>
void downwardSearch(Node<T> *head)
//traverse from start of linked list to end of linked list
//print out value of each Node along way
{

  Node<T> *ptr = head;
  cout << "The array in forward order: " << endl;
  while (ptr != nullptr) {
    cout << ptr->value;
    ptr = ptr->next;

  }
}

template<class T>
void DestroyList(Node<T> *head)
{
  Node<T> *ptr;

  while (head != nullptr) {
    ptr = head->next;
    delete head;
    head = ptr;
  }
}

template<class T>
void upwardSearch(Node<T> *tail)
{

  Node<T> *ptr = tail;

  cout << "The array in reverse order or backwards: " << endl;
  while (ptr != nullptr) {
    cout << ptr->value;
    ptr = ptr->prev;
  }
  cout << endl;
}

int main()
{
  char s[] = {'c', 'd', 'e'};

  Node<char> *head;
  Node<char> *tail;

  CreateList<char>(head, tail, s, 3);

  upwardSearch(tail);

  downwardSearch(head);

  DestroyList(head);
  head = tail = nullptr;

  return 0;

}