В C ++ вам не нужно использовать ключевые слова struct
или class
, когда в качестве спецификатора типа используется уже объявленная структура или класс.
Функция reve
имеет неопределенное поведение.
Прежде всего head
может быть равно nullptr
. В этом случае это выражение
if (p->link == NULL) {
вызывает неопределенное поведение.
Во-вторых, функция ничего не возвращает в случае, когда p->link
не равно nullptr
.
//...
reve(p->link);
struct Node *temp = p->link;
temp->link = p;
p->link = NULL;
}
Вот демонстрационная программа, которая показывает, как функции могут быть реализованы. Я использовал ваш C подход, включив ключевое слово struct
, когда структура используется в качестве спецификатора типа.
#include <iostream>
struct Node
{
int data;
struct Node *link;
};
struct Node * insert( struct Node *head, int data )
{
return head = new Node{ data, head };
}
struct Node * reverse( struct Node *head )
{
if ( head && head->link )
{
struct Node *tail = head;
head = reverse( head->link );
tail->link->link = tail;
tail->link = nullptr;
}
return head;
}
std::ostream & display( struct Node *head, std::ostream &os = std::cout )
{
if ( head )
{
os << head->data;
if ( head->link )
{
os << '\t';
display( head->link, os );
}
}
return os;
}
int main()
{
struct Node *head = nullptr;
const int N = 10;
for ( int i = 0; i < N; i++ )
{
head = insert( head, i );
}
display( head ) << '\n';
head = reverse( head );
display( head ) << '\n';
return 0;
}
Вывод программы:
9 8 7 6 5 4 3 2 1 0
0 1 2 3 4 5 6 7 8 9