我正在使用一个名为Reverse()的函数,因为我仅使用两个链接来反转列表中元素的顺序。我已经搜索了许多方法来执行此操作,但始终以“分段错误”结尾。我有一个方法可以帮助您确定出了什么问题,但是最多可以告诉我的是,当我创建一个包含五个元素(不包括头部和尾部)的列表时,“在位置0处存在正向互惠失败”。请记住,我不想给我代码,而只是给您关于出问题的意见。
void List<T>::Reverse ()
{
//make sure that the list is long enough
if( this->Empty())
return;
Link * link = this->head_;
Link * temp = NULL;
while( link != NULL )
{
temp = link->next_;
link->next_ = link->prev_;
link->prev_ = temp;
if( link->prev_ == NULL )
head_ = link;
link = link->prev_;
}
CheckLinks();
}
最佳答案
您的算法工作正常。该错误位于代码中的其他位置。
我创建了自己的(非常快速又肮脏的)双向链接列表来进行测试。
我在一个文件中做了所有这些。
我的链接结构与您的结构略有不同:
#include <iostream>
template <typename T>
struct Link
{
Link (const T &data, Link <T> *prev = NULL, Link <T> *next = NULL) ;
T data ;
Link <T> *next_ ;
Link <T> *prev_ ;
};
template <typename T>
Link <T>::Link (const T &data, Link <T> *prev, Link <T> *next) : data (data), prev_ (prev), next_ (next)
{
}
然后这是我的测试列表结构:
template <typename T>
struct List
{
List () ;
bool IsEmpty () const ;
void Reverse () ;
void CheckLinks () const ;
Link <T> *head_ ;
};
template <typename T>
List <T>::List () : head_ (NULL)
{
}
template <typename T>
bool List <T>::IsEmpty () const
{
return head_ == NULL ;
}
template <typename T>
void List <T>::Reverse ()
{
if (this->IsEmpty () == true) {
return ;
}
Link <T> *link = head_ ;
Link <T> *temp = NULL ;
while (link != NULL) {
temp = link->next_ ;
link->next_ = link->prev_ ;
link->prev_ = temp ;
if (link->prev_ == NULL) {
head_ = link ;
}
link = link->prev_ ;
}
}
template <typename T>
void List <T>::CheckLinks () const
{
Link <T> *link = head_ ;
while (link != NULL) {
std::cout << link->data << " " ;
link = link->next_ ;
}
std::cout << std::endl ;
}
这些是我为确保其正确性而进行的测试。
// Null List
void Test0 ()
{
List <int> list ;
list.CheckLinks () ;
list.Reverse () ;
list.CheckLinks () ;
}
// List with 1 node
void Test1 ()
{
Link <int> n1 (1) ;
List <int> list ;
list.head_ = &n1 ;
list.CheckLinks () ;
list.Reverse () ;
list.CheckLinks () ;
}
// List with 2 nodes
void Test2 ()
{
Link <int> n1 (1) ;
Link <int> n2 (2) ;
n1.next_ = &n2 ;
n2.prev_ = &n1 ;
List <int> list ;
list.head_ = &n1 ;
list.CheckLinks () ;
list.Reverse () ;
list.CheckLinks () ;
}
// List with 3 nodes
void Test3 ()
{
Link <int> n1 (1) ;
Link <int> n2 (2) ;
Link <int> n3 (3) ;
n1.next_ = &n2 ;
n2.prev_ = &n1 ;
n2.next_ = &n3 ;
n3.prev_ = &n2 ;
List <int> list ;
list.head_ = &n1 ;
list.CheckLinks () ;
list.Reverse () ;
list.CheckLinks () ;
}
// List with 4 nodes
void Test4 ()
{
Link <int> n1 (1) ;
Link <int> n2 (2) ;
Link <int> n3 (3) ;
Link <int> n4 (4) ;
n1.next_ = &n2 ;
n2.prev_ = &n1 ;
n2.next_ = &n3 ;
n3.prev_ = &n2 ;
n3.next_ = &n4 ;
n4.prev_ = &n3 ;
List <int> list ;
list.head_ = &n1 ;
list.CheckLinks () ;
list.Reverse () ;
list.CheckLinks () ;
}
这是我的主要内容:
int main (void)
{
Test0 () ;
Test1 () ;
Test2 () ;
Test3 () ;
Test4 () ;
return 0 ;
}
希望这足以使您相信您的错误在其他地方。
关于c++ - 反向双向链表会导致正向互惠失败,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21288990/