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