Отображает обратный порядок, но не обратный порядок c ++ - PullRequest
0 голосов
/ 28 марта 2019

Он не будет отображать строковый массив 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 массив после реверса: edc.

1 Ответ

0 голосов
/ 28 марта 2019

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

Кроме того, полезно использовать заглавные буквы для ваших типов (например, 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> *&head, Node<T> *&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;

}
...