您的位置:首页 > 其它

//链表的模板实现

2013-08-13 20:53 288 查看
//链表的模板实现

//By KiRa 07/08/28

#include <iostream>

using namespace std;

/*

Length = 0

IsEmpty = 1

List is 2 6

IsEmpty = 0

First element is 2

Length = 2

Deleted element is 2

List is 6

*/

class OutOfBounds {

public:

OutOfBounds() {}

};

template <class T> class ChainIterator;

template <class T> class Chain;

template <class T> class KeyedChain;

template <class T> class LinkedStack;

template <class T>

class ChainNode {

friend class Chain<T>;

friend class ChainIterator<T>;

friend class KeyedChain<T>;

friend class LinkedStack<T>;

private:

T data;

ChainNode<T> *link;

};

template<class T>

class Chain {

friend class ChainIterator<T>;

public:

Chain() {first = 0;}

~Chain();

bool IsEmpty() const {return first == 0;}

int Length() const;

bool Find(int k, T& x) const;

int Search(const T& x) const;

Chain<T>& Delete(int k, T& x);

Chain<T>& Insert(int k, const T& x);

void Output(ostream& out) const;

private:

ChainNode<T> *first;

};

template<class T>

Chain<T>::~Chain()

{

ChainNode<T> *next;

while (first) {

next = first->link;

delete first;

first = next;

}

}

template<class T>

int Chain<T>::Length() const

{

ChainNode<T> *current = first;

int len = 0;

while (current) {

len++;

current = current->link;

}

return len;

}

template<class T>

bool Chain<T>::Find(int k, T& x) const

{

if (k < 1) return false;

ChainNode<T> *current = first;

int index = 1;

while (index < k && current) ...{

current = current->link;

index++;

}

if (current) {x = current->data;

return true;}

return false;

}

template<class T>

int Chain<T>::Search(const T& x) const

{

ChainNode<T> *current = first;

int index = 1;

while (current && current->data != x) {

current = current->link;

index++;

}

if (current) return index;

return 0;

}

template<class T>

Chain<T>& Chain<T>::Delete(int k, T& x)

{

if (k < 1 || !first)

throw OutOfBounds();



ChainNode<T> *p = first;

if (k == 1)

first = first->link;

else {

ChainNode<T> *q = first;

for (int index = 1; index < k - 1 && q;

index++)

q = q->link;

if (!q || !q->link)

throw OutOfBounds();

p = q->link;

q->link = p->link;}

x = p->data;

delete p;

return *this;

}

template<class T>

Chain<T>& Chain<T>::Insert(int k, const T& x)

{

if (k < 0) throw OutOfBounds();

ChainNode<T> *p = first;

for (int index = 1; index < k && p;

index++)

p = p->link;

if (k > 0 && !p) throw OutOfBounds();

ChainNode<T> *y = new ChainNode<T>;

y->data = x;

if (k) {

y->link = p->link;

p->link = y;}

else {

y->link = first;

first = y;}

return *this;

}

template<class T>

void Chain<T>::Output(ostream& out) const

{

ChainNode<T> *current;

for (current = first; current;

current = current->link)

out << current->data << " ";

}

template <class T>

ostream& operator<<(ostream& out, const Chain<T>& x)

{x.Output(out); return out;}





int main(void)

{

try {

Chain<int> L;

cout << "Length = " << L.Length() << endl;

cout << "IsEmpty = " << L.IsEmpty() << endl;

L.Insert(0,2).Insert(1,6);

cout << "List is " << L << endl;

cout << "IsEmpty = " << L.IsEmpty() << endl;

int z;

L.Find(1,z);

cout << "First element is " << z << endl;

cout << "Length = " << L.Length() << endl;

L.Delete(1,z);

cout << "Deleted element is " << z << endl;

cout << "List is " << L << endl;

}

catch (...) {

cerr << "An exception has occurred" << endl;

}



cin.get();

return EXIT_SUCCESS;

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