使用C++实现简单(阉割版)的单链表:
实现的功能有:插入节点、删除节点、查找、显示列表。
#ifndef FORWARDLIST_H_#define FORWARDLIST_H_#include <iostream>using std::cout;using std::endl;template<class T>struct ListNode{ T m_data; ListNode<T>* m_pNext;};template<class T>class ForwardList{public: ForwardList(const ListNode<T>* node); ~ForwardList(); //在pos位置节点后边插入节点node void Insert(ListNode<T>* pos, const ListNode<T>* node); //删除位于pos位置的节点 ListNode<T> Delete(ListNode<T>* pos); //删除所有值为value的节点 void Delete(const T& value); //按值查找 ListNode<T>* Find(const ListNode<T>* node); //按位置查找 ListNode<T>* Find(int idx); //显示整个列表 void PrintList(); int size() { return count; } //返回头节点 ListNode<T>* Head() { return m_pHead; }private: ListNode<T>* m_pHead; int count;};template<class T>ForwardList<T>::ForwardList(const ListNode<T>* node){ m_pHead = new ListNode<T>; m_pHead->m_data = node->m_data; m_pHead->m_pNext = nullptr; count = 1;}template<class T>ForwardList<T>::~ForwardList(){ ListNode<T>* pos; while (m_pHead != nullptr) { pos = m_pHead; m_pHead = m_pHead->m_pNext; delete pos; }}template<class T>void ForwardList<T>::Insert(ListNode<T>* pos, const ListNode<T>* node) { ListNode<T>* temp = new ListNode<T>; temp->m_data = node->m_data; temp->m_pNext = pos->m_pNext; pos->m_pNext = temp; count++;}template<class T>ListNode<T> ForwardList<T>::Delete(ListNode<T>* pos) { ListNode<T> ret; ListNode<T>* temp; temp = m_pHead; if (temp == pos) { m_pHead = m_pHead->m_pNext; ret.m_data = temp->m_data; ret.m_pNext = nullptr; delete temp; count--; return ret; } while (temp->m_pNext != pos) { temp = temp->m_pNext; } ret.m_data = temp->m_pNext->m_data; ret.m_pNext = temp->m_pNext->m_pNext; delete temp->m_pNext; temp->m_pNext = ret.m_pNext; ret.m_pNext = nullptr; count--; return ret;}template<class T>void ForwardList<T>::Delete(const T& value) { ListNode<T>* temp; ListNode<T> ret; temp = m_pHead; while (m_pHead != nullptr && m_pHead->m_data == value) { m_pHead = m_pHead->m_pNext; delete temp; count--; temp = m_pHead; } while (temp != nullptr) { if (temp->m_pNext != nullptr && temp->m_pNext->m_data == value) { ret.m_pNext = temp->m_pNext; temp->m_pNext = temp->m_pNext->m_pNext; delete ret.m_pNext; count--; } else { temp = temp->m_pNext; } }}template<class T>ListNode<T>* ForwardList<T>::Find(const ListNode<T>* node){ ListNode<T>* pos = m_pHead; while (pos != nullptr && pos->m_data != node->m_data) { pos = pos->m_pNext; } return pos;}template<class T>ListNode<T>* ForwardList<T>::Find(int idx) { if (idx >= count || idx < 0) { cout << "索引溢出!\n"; return nullptr; } ListNode<T>* pos = m_pHead; int i = 0; while (i < idx) { pos = pos->m_pNext; i++; } return pos;}template<class T>void ForwardList<T>::PrintList(){ ListNode<T>* pos = m_pHead; while (pos != nullptr) { cout << pos->m_data << endl; pos = pos->m_pNext; }}#endif
测试代码:
#include <iostream>#include <string>#include "ForwardList.h"using namespace std;int main(){ ListNode<string> head{ "0000", nullptr }; ListNode<string> n1{ "0001", nullptr }; ListNode<string> n2{ "0002", nullptr }; ListNode<string> n3{ "0003", nullptr }; ListNode<string> n4{ "0004", nullptr }; ListNode<string> n5{ "0005", nullptr }; ForwardList<string> mfl(&head); mfl.PrintList(); cout << endl; mfl.Insert(mfl.Head(), &n1); mfl.Insert(mfl.Head(), &n2); mfl.Insert(mfl.Head(), &n3); mfl.Insert(mfl.Head(), &n4); mfl.PrintList(); cout << endl; cout << mfl.Find(2)->m_data << endl << endl; mfl.Insert(mfl.Find(&n2), &n5); mfl.PrintList(); cout << endl; mfl.Delete("0000"); mfl.Delete("0001"); mfl.Delete(mfl.Find(&n5)); mfl.PrintList(); cout << endl; system("pause"); return 0;}
~~