我有这堂课:
class Elem
{
public:
int x;
Elem *nast;
};
我有一个默认构造函数,函数显示x
。我制作了十个元素列表,但如何按x
排序此列表?
我试过了:
void Sortlinked_list(Elem *head)
{
int ile = 0;
Elem *cur;
cur = head;
while( cur->nast != NULL )
{
cur = cur->nast;
ile++;
}
Elem* curr = head;
Elem* next;
int temp;
for(int i = 0; i < ile; i++ )
{
while( curr && curr->nast )
{
next = curr->nast;
while (next)
{
if (curr->show() > next->show())
{
std::swap(next->nast, curr->nast);
}
next = next->nast;
}
curr = curr->nast;
}
}
}
但它不起作用。输出为:http://i.stack.imgur.com/vJrRK.png
如果有人可以帮我这个吗?我花了3个小时什么也没做。
答案 0 :(得分:2)
我觉得这个算法有问题。
考虑:
7 -> 3 -> 5
在第一个循环中,cur
指向7,next
指向3,因此将会交换nast
指针。
交换cur->nast
将指向5,而next->nast
指向3本身。因此链断裂,元素3丢失。
7 -> 5
3 -> 3
换句话说 - 只交换nast
指针是不够的。
答案 1 :(得分:0)
这是一个简单的函数实现方法。该函数只是交换相邻元素的数据成员x
。
void sort( Elem * &head )
{
Elem *first = head;
Elem *last = nullptr;
while ( first && first->nast != last )
{
Elem *sorted = first->nast;
for ( Elem *current = first; current->nast != last; current = current->nast )
{
if ( current->nast->x < current->x )
{
std::swap( current->nast->x, current->x );
sorted = current->nast;
}
}
last = sorted;
}
head = first;
}
答案 2 :(得分:0)
交换列表中的节点时出现问题。如果节点是相邻的,则旋转3个下一个指针,如果节点不相邻,则交换2对下一个指针。如果代码交换指向要首先交换的节点的下一个指针,则交换后要交换的节点的下一个指针,处理这两种情况。
如果其中一个节点是列表中具有头指针的第一个节点,则会出现问题。和/或列表中具有尾指针的最后一个节点。
更简单的替代方法是使用两个列表(只需要第二个指向节点的指针,最初为NULL)。从源列表中删除节点,然后将其按顺序插入到第二个最初为空的列表中。