私は2つの単純な構造を持っています:
struct Address
{
char city[255];
};
typedef Address* AddressPtr;
struct Person
{
char fullName[255];
Address* address;
Person* next;
};
typedef Person* PersonPtr;
Person 構造は、新しい要素がリストの先頭に追加される Linked リストを形成します。私がやりたいのは、それらを でソートすることfullName
です。最初はリンクを交換しようとしましたが、リストの先頭が失われ、その結果、リストが部分的にソートされました。次に、ノードの値を交換してリストをソートすることにしました。しかし、私は奇妙な結果を得ます。名前のリストの場合: Test3, Test2, Test1
、取得しTest3, Test3, Test3
ます。
これが私のソートコードです:
void sortByName(PersonPtr& head)
{
TaskPtr currentNode, nextNode;
for(currentNode = head; currentNode->next != NULL; currentNode = currentNode->next)
{
for(nextNode = currentNode->next; nextNode != NULL; nextNode = nextNode->next)
{
if(strcmp(currentNode->fullName, nextNode->fullName) > 0)
{
swapNodes(currentNode, nextNode);
}
}
}
}
void swapNodes(PersonPtr& node1, PersonPtr& node2)
{
PersonPtr temp_node = node2;
strcpy(node2->fullName, node1->fullName);
strcpy(node1->fullName, temp_node->fullName);
strcpy(node2->address->city, node1->address->city);
strcpy(node1->address->city, temp_node->address->city);
}
ソートが完了した後、ノードの値は少し変です。
更新しました
これは私がリンクを交換した方法です:
void swapNodes(PersonPtr& node1, PersonPtr& node2)
{
PersonPtr temp_person;
AddressPtr temp_address;
temp_person = node2;
node2 = node1;
node1 = temp_person;
temp_address = node2->address;
node2->address = node1->address;
node1->address = temp_address;
}