我有一个包含姓氏,名字和值的单个链接电话簿列表。 我可以按创建顺序打印出来,但不能按值打印出来。我怎么修改这个?如果您需要在代码中查看其他内容,请告诉我,但此功能是我主要关注的问题。
ostream& operator<<(ostream& out, const PhoneBook& p) // out stream
{
if(p.head==NULL)
{
cout << "is empty";
}else
{
PhoneBookItem* item = p.head;
for(int i=0; i < p.num; i++)
{
cout << item->lastname<< " ";
cout << item->firstname<< " : ";
cout << item->phone<<endl;
item = item->next;
}
}
return out;
答案 0 :(得分:1)
选项1:对列表排序,然后打印
选项2:对于每个循环,搜索下一个应打印的项目。 (昂贵的)
选项3:使用哈希/字典方法而不是链表。哈希/字典是
固定数组和链接列表的组合。他们很适合
比固定数组和链表更快地搜索项目
选项4:使用链接列表以外的其他数据结构,这些数据结构能够按字母顺序/按字母顺序访问您的数据。
答案 1 :(得分:1)
可以通过多种方式对链接列表进行排序。
std::sort
或qsort
也可以。然后遍历排序的数组以重置每个节点的“下一个”指针。最后释放临时阵列存储。以下是一些未经测试的插入排序代码:
PhoneBookItem* sorted = NULL;
while (p.head) {
// Pop
PhoneBookItem* head = p.head;
p.head = head->next;
head->next = NULL;
// Find the place to insert.
PhoneBookItem* lead = sorted;
PhoneBookItem* trail = NULL;
while (lead && lead->phone <= head->phone) {
trail = lead;
lead = lead->next;
}
// Insert either within the list or at the head.
head->next = lead;
if (trail)
trail->next = head;
else
sorted = head;
}
p.head = sorted;
// Now print the sorted list as before...