day7: homework-LinkedList 链表的实现

This commit is contained in:
flykhan 2023-08-01 22:21:52 +08:00
parent 5ab334d200
commit c127a3a81b
1 changed files with 22 additions and 9 deletions

View File

@ -6,7 +6,7 @@ using namespace std;
template <typename T> template <typename T>
class LinkedList class LinkedList
{ {
// 使用友元函数模版的方式,可以避免重复声明 // // 使用友元函数模版的方式,可以避免重复声明
template <typename U> template <typename U>
friend ostream &operator<<(ostream &out, const LinkedList<U> &list); friend ostream &operator<<(ostream &out, const LinkedList<U> &list);
@ -104,22 +104,35 @@ public:
size--; // 计数器减一 size--; // 计数器减一
return *this; // 返回当前对象 return *this; // 返回当前对象
} }
Node *search(T val) void search(T val)
{ {
Node *p = head; Node *p = head;
while (p != nullptr && p->val != val) while (p != nullptr && p->val != val)
{ {
p = p->next; // 找到要删除的节点的前一个节点 p = p->next; // 找到要删除的节点的前一个节点
} }
return p; // 返回找到的节点,如果未找到,返回 nullptr if (p == nullptr) // 找到最后也没有找到要查找的节点
{
cout << val << " 未找到" << endl;
return;
}
cout << val << " 已找到" << endl;
return;
} }
}; };
template <typename U> template <typename U>
ostream &operator<<(ostream &out, const LinkedList<U> &list) ostream &operator<<(ostream &out, const LinkedList<U> &list)
{ {
LinkedList p = list; // 从头节点开始 /*
while (p != nullptr) // 遍历链表 typename LinkedList<U>::Node
LinkedList<U>::Node LinkedList<U> Node
*p Node
list.head
*/
// 注意,由于 Node 是一个内部嵌套结构体,所以在使用时需要使用 typename 关键字来指示其是一个类型名
typename LinkedList<U>::Node *p = list.head; // 从头节点开始
while (p != nullptr) // 遍历链表
{ {
out << p->val << " "; // 输出节点的值 out << p->val << " "; // 输出节点的值
p = p->next; // 指向下一个节点 p = p->next; // 指向下一个节点
@ -133,9 +146,9 @@ int main()
LinkedList<double> list; // 创建一个链表 LinkedList<double> list; // 创建一个链表
list.insert(1.1).insert(2.2).insert(3.3).insert(4.4).insert(5.5); // 插入节点 list.insert(1.1).insert(2.2).insert(3.3).insert(4.4).insert(5.5); // 插入节点
cout << list; // 输出链表 cout << list; // 输出链表
Node *tmp = list.search(3.3); // 查找节点 list.search(3.9); // 查找节点
cout << tmp->val << endl; list.search(4.4); // 查找节点
list.remove(3.3); // 删除节点 list.remove(3.3); // 删除节点
cout << list; // 输出链表 cout << list; // 输出链表
return 0; return 0;
} }