您的位置:首页 > 编程语言 > C语言/C++

单链表 C++实现

2015-12-03 23:31 288 查看
重新修改了下,单链表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;
}

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: