单链表 C++实现

来源:互联网 发布:解题软件英语 编辑:程序博客网 时间:2024/06/06 02:01

重新修改了下,单链表C++实现,Ubuntu14下测试可运行。

List.h#include<stdlib.h>#include<string>using namespace std;template<class T>struct LinkNode{T data;LinkNode<T> * link;LinkNode(LinkNode<T> *ptr = NULL) { link = ptr; }LinkNode(const T& item, LinkNode<T> *ptr = NULL){data = item; link = ptr;}};template<class T>class List{public:List(){ first = new LinkNode<T>; }List(const T&x){ first = new LinkNode<T>(x); }List(List<T>&L);~List(){}void makeEmpty();LinkNode<T> *getHead() const { return first; }LinkNode<T> *Search(T x);LinkNode<T> *Locate(int i) const;bool getData(int i, T & x) const;void setData(int i, T &x);bool Insert(int i, T &x);bool Remove(int i, T&x);bool IsEmpty() const{return first->link == NULL ? true : false;}bool IsFull()const { return false; }void Show();LinkNode<T>* deleteDuplicates(LinkNode<T>* p);LinkNode<T>* first;};template<class T>void List<T>::makeEmpty(){LinkNode<T>*q;while (first->link != NULL){q = first->link;first->link = q->link;delete q;}};template<class T>LinkNode<T>*List<T>::Locate(int i) const{if (i < 0)return NULL;LinkNode<T> *current = first; int k = 0;while (current != NULL && k < i){current = current->link; k++;}return current;};template<class T>bool List<T>::getData(int i, T &x) const {if (i < 0) return NULL;LinkNode<T>  *current = Locate(i);if (current == NULL) return false;else { x = current->data; return true; }}template<class T>void List<T>::setData(int i, T &x)   {if (i <= 0) return;LinkNode<T>  *current = Locate(i);if (current == NULL) return;else { current->data = x; }}template<class T>bool List<T>::Insert(int i, T &x){if (first == NULL || i == 0){LinkNode<T> *newNode = new LinkNode<T>(x);newNode->link = first;first = newNode;}else{LinkNode<T> *current = first;for (int k = 1; k < i; k++)if (current == NULL) break;else current = current->link;if (current == NULL)return false;else{LinkNode<T> *newNode = new LinkNode<T>(x);newNode->link = current->link;current->link = newNode;}}return true;}template<class T>bool List<T>::Remove(int i, T&x){LinkNode<T> *current = Locate(i - 1);if (current == NULL || current->link == NULL) return false;LinkNode<T> *del = current->link;current->link = del->link;x = del->data; delete del;return  true;}template<class T>LinkNode<T>* List<T>::deleteDuplicates(LinkNode<T>* p) {if (p == NULL)return NULL;LinkNode<T> *cur = first;while (cur->link != NULL){if (cur->link->data != cur->data){cur = cur->link;}else{LinkNode<T> *del = cur->link;if (del->link == NULL){delete del;}else{cur->link = del->link;delete del;}}}return p;}template<class T>void List<T>::Show(){LinkNode<T>*current = first;while (current->link != NULL){cout << current->data << " ";current = current->link;}}


0 0