linklist模版函数分析,与实现

来源:互联网 发布:手机购物软件大全 编辑:程序博客网 时间:2024/06/06 00:19
我想说什么来着呢,马上要去高伟达笔试面试,我复习复习数据结构,链表,明天复习冒泡,一下大家参考,转载请注明出处~,谢谢合作
#ifndef LINKLIST_H#define LINKLIST_Htemplate<class T>struct Node{T  data;Node * next;Node(){}Node(T data){this->data = data;}};/*@brief 链表@author boss@warning 请勿数组越界,或者输入不合法,因为没有检测+insertElement+removeElement+create+inverseCreate+release+printElement-move*/template<class T>class LinkList{public:LinkList();~LinkList();public:Node<T> * create(int n);Node<T> * inverseCreate(int n);void release();void remove(int pos);void print();void insert(Node<T> * data ,int pos);protected:Node<T> * move(int pos);Node<T> * head;Node<T> * tail;int len;};template<class T>LinkList<T>::LinkList():head(0),len(0){head = new  Node<T>();head->next = NULL;}template<class T>LinkList<T>::~LinkList(){}/*@brief 采用顺插法制作链表@param n 空链表节点个数n 没有初始化;@warning pre 永远指前一个节点 cur 永远指当前节点 顺插法要注意插入的最后一个节点->next 必须为NULL;*/template<class T>Node<T> * LinkList<T>::create(int n){Node<T> * pre = head;Node<T> * cur = head;len = (n) < 0 ? 0 : n;for(int i = 0; i < len; i++){cur = new Node<T>();pre->next = cur;pre = cur;}cur->next = NULL;tail = cur;return head;}/*@brief 采用倒插法制作链表@param n 空链表节点个数n 没有初始化;@warning pre 永远指前一个节点 cur 永远指当前节点 顺插法要注意插入的最后一个节点->next 必须为NULL;@warning 倒插法头和尾巴是相反的;*/template<class T>Node<T> * LinkList<T>::inverseCreate(int n){Node<T> * pre = head;Node<T> * cur = head;pre->next = NULL;len = (n) < 0 ? 0 : n;for(int i = 0 ;i < len; i ++){cur = new Node<T>();cur->next = pre;pre = cur;}//此时的尾巴,是倒插法的头tail = head;//此时的头呢,是倒插发的当前值head = cur;return head;}/*@brief 释放所有节点*/template<class T>void LinkList<T>::release(){while (head){Node<T> * pre = head;head = head->next;delete pre;}}/*@brief 移除特定的节点@param pos 特定的位置*/template<class T>void LinkList<T>::remove(int pos){Node<T> * pre = move(pos);Node<T> * cur = pre -> next;Node<T> * link = cur->next;delete cur;pre->next = link;len--;}template<class T>void LinkList<T>::insert(Node<T>  * data ,int pos){Node<T> * pre = move(pos);Node<T> * cur = pre -> next;pre->next = data;data->next = cur;len++;}/*@brief 打印@warning 需要子类重新实现*/template<class T>void LinkList<T>::print(){Node<T> * pre = head;while(pre->next){pre = pre->next;}}/*@brief 移动到特定的节点@param 位置@retern 反回节点*/template<class T>Node<T> * LinkList<T>::move(int pos){//_ASSERT(pos > 0,"error");Node<T> * pre = head; for(int i = 0; i < pos; i++)pre = pre -> next;return pre;}#endif

0 0