泛型单链表搜索功能异常:存在值却无预期输出
问题分析与修复方案
你的泛型单链表search函数无法正常工作,核心是几个关键逻辑错误导致的,我来帮你拆解并修复:
核心错误点
错误1:调用
search时传入了无关的空指针
在main函数里,你手动定义了Node<int>* head = NULL;并传给obj.search(head, 8),这个空指针和链表对象obj内部维护的真实链表头完全没关系——相当于你在搜索一个空链表,自然找不到实际存在的8。错误2:
search函数的参数设计冗余且不符合泛型要求
作为类的成员函数,SingleLinkedList已经有私有成员head,完全不需要额外传入Node<T>* head参数;另外,搜索值的类型固定为int,直接破坏了泛型链表的通用性,应该改为泛型类型T。小问题:输出被
system("pause")阻塞
你把搜索输出放在system("pause")之后,程序会先暂停,你可能没等看到输出就被卡住了,应该把搜索代码移到暂停之前。
修复后的代码修改
1. 修正SingleLinkedList中的search函数
移除多余的head参数,使用类内部的成员变量,同时将搜索值改为泛型类型:
bool search(const T& x) { Node<T>* current = head; // 直接使用类的私有成员head while (current != nullptr) { if (current->data == x) return true; current = current->next; } return false; }
2. 修正main函数中的调用逻辑
移除自己定义的空head指针,正确调用search,并调整输出位置:
int main(int argc, const char * argv[]) { // ... 前面的链表操作代码保持不变 ... std::cout<<"\n--------------------------------------------------\n"; // 把搜索输出移到暂停之前,正确调用search obj.search(8) ? printf("Yes") : printf("No"); std::cout<<"\n--------------------------------------------------\n"; system("pause"); return 0; }
额外优化建议(提升代码质量)
- 你的
display、delete_first等函数里,不需要用new Node<T>创建临时指针,直接声明Node<T>* temp = head;即可,否则会造成不必要的内存泄漏。 delete_position函数里没有删除被移除的current节点,会导致内存泄漏,建议在函数末尾加上delete current;。
修改完成后运行程序,就能正确输出"Yes"了,因为现在search函数会正确遍历链表中的实际节点。
内容的提问来源于stack exchange,提问作者user9366862
相关产品推荐
相关产品推荐

