显示逆序但非逆序显示c ++

时间:2019-03-27 23:04:09

标签: c++ templates reverse allocation

它不会以非相反的顺序显示字符串char数组(cde),但是会以相反的顺序显示数组edc(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 :(得分:0)

这是使用create_list,search_up,search_down和destory_list函数的一种方法。我尝试使用更具描述性的变量名。我不喜欢listrec2,因为它非常令人困惑。它让我想到了第二个节点,但事实并非如此。这是节点类型。

此外,习惯大写您的类型(例如Node)也是个好习惯。然后,您可以为对象使用小写版本(例如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> *&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;

}