要对列表进行排序,您可以通过在现有列表的新列表中按顺序插入元素,从现有列表构建一个新列表。
这是一个简化的例子。当然,您需要添加更多功能,例如删除列表中所有节点的功能。
#include <iostream>
#include <string>
#include <cstdlib>
#include <ctime>
#include <tuple>
struct Man
{
std::string surname;
std::string name;
/*
char sex;
int birth_year;
int age;
*/
Man * next;
};
void push_front( Man * &head, const std::string &surname, const std::string &name )
{
head = new Man { surname, name, head };
}
std::ostream & display( const Man *head,
std::ostream &os = std::cout,
const char *delim = ", ")
{
for ( const Man *tmp = head; tmp; tmp = tmp->next )
{
os << tmp->surname << ' ' << tmp->name << delim;
}
return os;
}
void sort( Man * &head )
{
Man *new_head = nullptr;
while ( head != nullptr )
{
Man *node = head;
head = head->next;
Man *prev = nullptr;
for ( Man *tmp = new_head;
tmp && !
( std::tie( node->surname, node->name ) < std::tie( tmp->surname, tmp->name ) ); )
{
prev = tmp;
tmp = tmp->next;
}
if ( prev == nullptr )
{
node->next = new_head;
new_head = node;
}
else
{
node->next = prev->next;
prev->next = node;
}
}
head = new_head;
}
int main()
{
Man *head = nullptr;
std::srand( ( unsigned int )std::time( nullptr ) );
const size_t N = 10;
for ( size_t i = 0; i < N; i++ )
{
push_front( head,
std::string( 1, 'A' + std::rand() % ( 'Z' - 'A' + 1 ) ),
std::string( 1, 'A' + std::rand() % ( 'Z' - 'A' + 1 ) ) );
}
display( head ) << std::endl;
sort( head );
display( head ) << std::endl;
return 0;
}
程序输出是
Y P, D X, K J, R G, K J, X V, V I, X M, C K, A Y,
A Y, C K, D X, K J, K J, R G, V I, X M, X V, Y P,
您可以简单地比较两个节点的姓氏,而不是函数std::tie。
考虑到最好将您的结构分成两部分。例如
struct Man
{
std::string surname;
std::string name;
char sex;
int birth_year;
int age;
};
struct Node
{
Man person;
Node * next;
};