Search code examples
c++templatesreverseallocation

Displays reverse order but not the non-reverse order c++


It will not show the string char array in non-reverse order (cde), but it does display the array in reverse order (edc). Could you please help with why it isn't displaying the cde?

I tried changing variable names, but I'm a new programmer so I don't really know yet what to do.

#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;

}

The expected results are: the array before reversal: cde the array after reversa: edc.


Solution

  • Here is one way of doing it with a create_list, search_up, search_down, and destory_list functions. I try to use variable names that are more descriptive. I do not like listrec2 because it is very confusing. It makes me think of the second node, but that is not what it is. It is a node type.

    Also, it is a good habbit to capitalize your types (e.g. Node). Then, you can use the lowercase version for the object (e.g. 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;
    
    }