文章标题 原创 翻译 转载 文章内容 ``` // Chain.h #ifndef _CHAIN_H_ #define _CHAIN_H_ template<class T> class ChainNode { public: T data; ChainNode<T> *link; }; template<class T> class Chain { public: Chain(); ~Chain(); bool IsEmpty() const; int Length() const; bool Find(int index, T &value) const; int Search(T value) const; Chain<T>& Insert(int index, const T &value); Chain<T>& Delete(int index, T &value); Chain<T>& Reverse(void); void Output() const; private: ChainNode<T> *first; int len; }; #endif // _CHAIN_H_ ``` ``` // Chain.cpp #include "stdafx.h" #include "Chain.h" #include <iostream> using namespace std; template<class T> Chain<T>::Chain() { first = NULL; len = 0; } template<class T> Chain<T>::~Chain() { ChainNode<T> *next; while (first) { next = first->link; delete first; first = next; } } template<class T> bool Chain<T>::IsEmpty() const { return (first == NULL); } template<class T> int Chain<T>::Length() const { return len; } template<class T> bool Chain<T>::Find(int index, T &value) const { ChainNode<T> *cur = first; if (index < 1 || index > len + 1) { return false; } for (int i = 1; i < index && cur; i++) { cur = cur->link; } if (cur) { value = cur->data; return true; } return false; } template<class T> int Chain<T>::Search(T value) const { ChainNode<T> *cur = first; int pos = 1; while (cur && cur->data != value) { cur = cur->link; pos++; } if (cur) { return pos; } return 0; } template<class T> Chain<T>& Chain<T>::Insert(int index, const T &value) { ChainNode<T> *cur = first; if (index < 0 || index > len + 1) { cout << "Insert error" << endl; } for (int i = 1; i < index && cur; i++) { cur = cur->link; } if (index > 0 && !cur) { cout << "Insert Out bounds" << endl; } ChainNode<T> *newNode = new ChainNode<T>; newNode->data = value; if (index) { newNode->link = cur->link; cur->link = newNode; } else { newNode->link = first; first = newNode; } len++; return *this; } template<class T> Chain<T>& Chain<T>::Delete(int index, T &value) { ChainNode<T> *cur = first; if (index < 1 || index > len) { cout << "Delete Out bounds" << endl; } if (index == 1) { first = cur->link; } else { ChainNode<T> *prev = first; for (int i = 1; i < index - 1 && prev; i++) { prev = prev->link; } cur = prev->link; prev->link = cur->link; } value = cur->data; delete cur; len--; return *this; } template<class T> void Chain<T>::Output() const { ChainNode<T> *cur = first; while (cur) { cout << cur->data << ' '; cur = cur->link; } } template<class T> Chain<T>& Chain<T>::Reverse(void) { ChainNode<T> *p1 = first; ChainNode<T> *p2 = p1->link; ChainNode<T> *p3 = p2->link; p1->link = NULL; while (p3 != NULL) { p2->link = p1; p1 = p2; p2 = p3; p3 = p3->link; } p2->link = p1; first = p2; return *this; } ``` ``` // main.cpp #include "stdafx.h" #include "Chain.h" #include "Chain.cpp" #include <iostream> using namespace std; int main(int argc, char *argv[]) { Chain<int> chain; int value; /*************Insert**********/ for (int i = 0; i < 10; i++) { chain.Insert(i, i + 1); } /*************Output**********/ chain.Output(); cout << endl; /************IsEmpty***********/ cout << "IsEmpty = " << chain.IsEmpty() << endl; /*************Length**********/ cout << "Length = " << chain.Length() << endl; /*************Find************/ chain.Find(4, value); cout << "value = " << value << endl; /*************Search**********/ cout << "search = " << chain.Search(3) << endl; /*************Delete**********/ chain.Delete(8, value); cout << "delete value = " << value << endl; /*************Output**********/ chain.Output(); cout << endl; /*************Reverse************/ chain.Reverse(); cout << "Reverse: "; chain.Output(); cout << endl; cin.get(); return 0; } ``` > 2011-08-12 文章类别 Python Mobile Android Java Shell Life Database Bug Windows IOS Tools Boost Node.js Mac Product Tips C/C++ Golang Javascript React Qt MQ MongoDB Design Web Linux LLM ChatGPT RAG AI 提交