List--C++模板类
2015-12-30 12:29
483 查看
#ifndef _PACKAGE_H_ #define _PACKAGE_H_ //数组实现 namespace list_in_array { template<typename T> class List { private: enum { bad = -1 }; enum { MAX = 100 }; T elements[MAX]; int last; public: List() { last = -1; }; ~List() {} void Insert(T x, int p); void Delete(int p); int Locate(T x)const; T Retrieve(int p)const; int Previous(int p)const; int Next(int)const; int MakeNull(); int First()const; int End()const; void Travel()const; }; template<typename T> void List<T>::Insert(T x, int p) { int q; if (last >= MAX - 1) cout << "FULL!\n"; else if ((p > last + 1) || (p < 0)) cout << "NOT EXIST!\n"; else { for (q = last; q >= p; q--) elements[q + 1] = elements[q]; elements[p] = x; last++; } } template<typename T> void List<T>::Delete(int p) { int q; if ((p > last) || (p < 0)) cout << "NOT EXIST!\n"; else { for (q = p; q < last; q++) elements[q] = elements[q + 1]; last--; } } template<typename T> int List<T>::Locate(T x)const { int q; for (q = 0; q <= last; q++) if (elements[q] == x) return q; cout << "NOT EXIST!\n"; return bad; } template<typename T> T List<T>::Retrieve(int p)const { if (p > last) cout << "NOT EXIST!\n"; else return elements[p]; return bad; } template<typename T> int List<T>::Previous(int p)const { if (p<1 || p>last) cout << "NOT EXIST!\n"; else return p - 1; return bad; } template<typename T> int List<T>::Next(int p)const { if (p<0 || p>last - 1) cout << "NOT EXIST!\n"; else return p + 1; return bad; } template<typename T> int List<T>::MakeNull() { last = -1; return 0; } template<typename T> int List<T>::First()const { if (last < 0) cout << "EMPTY!\n"; else return 0; return bad; } template<typename T> int List<T>::End()const { if (last < 0) cout << "EMPTY!\n"; else return last; return -1; } template<typename T> void List<T>::Travel()const { for (int i = 0; i <= last; i++) cout << elements[i] << endl; } } //链表实现 namespace link_list { template<typename T> class List { public: struct Node { T data; struct Node *next; }; Node *head; int length; public: List() { length = 0; head = new Node{ 0,NULL }; } ~List() { delete head; } void Insert(T x, Node *p); void Delete(Node *p); Node * Locate(T x)const; T Retrieve(Node *p)const; Node* Previous(Node *p)const; Node* Next(Node *p)const; Node* MakeNull(); Node* First()const; Node* End()const; void Travel()const; }; template<typename T> void List<T>::Travel()const { Node *t = head->next; while (t != NULL) { cout << t->data << endl; t = t->next; } } template<typename T> typename List<T>::Node* List<T>::End()const { Node *t = head; while (t->next != NULL) t = t->next; return t; } template<typename T> typename List<T>::Node* List<T>::First()const { return head; } template<typename T> typename List<T>::Node* List<T>::MakeNull() { Node *t = head->next; while (t != NULL) { Node *t2 = t; t = t->next; delete t2; } head->next = NULL; length = 0; return head; } template<typename T> typename List<T>::Node* List<T>::Next(Node*p)const { if (p->next != NULL) return p->next; else cout << "NOT EXIST!\n"; return p->next; } template<typename T> typename List<T>::Node* List<T>::Previous(Node *p)const { Node *t; if (p == head) cout << "NOT EXIST!\n"; else { t = head; while (t->next != p) t = t->next; return t; } } template<typename T> T List<T>::Retrieve(Node *p)const { return p->data; } template<typename T> typename List<T>::Node* List<T>::Locate(T x)const { Node *t = head; while (t != NULL) if (t->data == x) return t; else t = t->next; return t; } template<typename T> void List<T>::Delete(Node *p) { Node *t; if (p->next != NULL) { t = p->next; p->next = t->next; delete t; } else { t = head; while (t->next->next != NULL) t = t->next; delete t->next; t->next = NULL; } length--; } template<typename T> void List<T>::Insert(T x, Node *p) { Node *t = new Node; t->data = x; if (p->next != NULL) { t->next = p->next; p->next = t; } else { p->next = t; t->next = NULL; } length++; } } //静态链表 namespace static_link_list { template<typename T> class List { private: struct Node { T data; int next; }; enum { maxsize = 100 }; Node space[maxsize]; int avail; int GetNode(); void FreeNode(int q); public: List() {} ~List() {} void Initialize(); void Insert(T x, int p); void Delete(int p); }; template<typename T> void List<T>::Delete(int p) { int q; if (space[p].next != -1) { q = space[p].next; space[p].next = space[q].next; FreeNode(q); } else cout << "NOT EXIST!\n"; } template<typename T> void List<T>::Insert(T x, int p) { int q; q = GetNode(); space[q].data = x; space[q].next = space[p].next; space[p].next = q; } template<typename T> void List<T>::FreeNode(int q) { space[q].next = space[avail].next; space[avail].next = q; } template<typename T> int List<T>::GetNode() { int p; if (space[avail].next == -1) { cout << "FULL!\n"; p = -1; } else { p = space[avail].next; space[avail].next = space[p].next; } return p; } template<typename T> void List<T>::Initialize() { int i; for (i = 0; i < maxsize - 1; i++) space[i].next = i + 1; space[i].next = -1; avail = 0; } } //双向链表 namespace double_link_list { template<typename T> class List { private: struct Node { T data; struct Node *next, *prior; }; Node *head; int length; public: List() { head = new Node{ 0,NULL,NULL }; } ~List() {} void Insert(T x, Node*p); void Delete(Node *p); }; template<typename T> void List<T>::Delete(Node *p) { if (p->prior != NULL) p->prior->next = p->next; if (p->next != NULL) p->next->prior = p->prior; delete p; length--; } template<typename T> void List<T>::Insert(T x, Node *p) { Node *s = new Node; s->data = x; s->prior = p; s->next = p->next; p->next->prior = s; p->next = s; length++; } } //循环链表 namespace ring_link_list { template<typename T> class List { private: struct Node { T data; struct Node *next; }; Node *head; public: void LInsert(T x); void RInsert(T x); }; template<typename T> void List<T>::RInsert(T x) { LInsert(x); head = head->next; } template<typename T> void List<T>::LInsert(T x) { Node *p = new Node; p->data = x; if (head == NULL) { p->next = p; head = p; } else { p->next = head->next; head->next = p; } } } //广义表 namespace general_list { template<typename T> class List { private: enum tag { ATOM, LIST }; struct Node { struct Node *link; bool tag; union { T data; struct Node *dlink; }; }; Node *head; public: bool Eaqual(List<T> &t)const; }; template<typename T> bool List<T>::Eaqual(List<T> &t)const { bool x, y; y = false; if (head == NULL && t.head == NULL) y = true; else if (head != NULL && t.head != NULL) { if (head->tag == t.head->tag) { if (head->tag == ATOM) { if (head->data == t.head->data) x = true; else x = false; if (x == true) y = head->link.Eaqual(t.head->link); } else { x = head->dlink.Eaqual(t.head->dlink); if (x == true) y = head->link.Eaqual(t.head->link); } } } return y; } } #endif
相关文章推荐
- C#中Ilist与list的区别小结
- C#中IList<T>与List<T>的区别深入解析
- C#对list列表进行随机排序的方法
- Vc++ 控件List Control用法总结
- C++实现的泛型List类分享
- C#使用IComparer自定义List类实现排序的方法
- C# Datagridview绑定List方法代码
- javascript radio list的实现细节(多浏览器兼容)
- c++ STL容器总结之:vertor与list的应用
- java实现List中对象排序的方法
- 大家注意vector, list, set, map成员函数erase
- ASP.NET―001:GridView绑定List、页面返回值具体实现
- List all the Databases on a SQL Server
- js Map List 遍历使用示例
- Java比较两个List的值是否相等的方法
- Java List双击事件实现方法
- velocity显示List与Map的方法详细解析
- 关于STL中list容器的一些总结
- 关于C#泛型列表List<T>的基本用法总结
- Java集合类中文介绍