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

c++版链表实现

2014-07-02 21:13 176 查看
写在前面:小生纯业余选手,开此博仅仅是为了积累,纯当笔记来用。如有看官光临小生博客,请不要相信我的代码就是正确的。如果您发现了错误也恳请耽误您一点时间,请您在下面指出来,不胜感激!

关于链表的解释与数据结构课本一样,在实现的时候运用到了相关设计模式与模板技术,同时对于链表有些操作的实现模式比较清晰,有助于学习STL!

<pre name="code" class="cpp">#include <iostream>
#include <assert.h>
using namespace std;
template<typename E>
class List
{
private:
void operator =(const List&){}
List(const List&){}
public:
List(){};
virtual ~List(){};
virtual void clear() = 0;
virtual void insert(const E& item) = 0;
virtual void append(const E& item) = 0;
virtual E remove() = 0;
virtual void moveToStart() = 0;
virtual void moveToEnd() = 0;
virtual void prev()= 0;
virtual void next() = 0;
virtual int length()const = 0;
virtual int currPos()const = 0;
virtual void moveToPos(int pos) = 0;
virtual const E& getValue()const = 0;
//virtual void print()const = 0;
};

template <typename E>
class AList : public List<E>
{
private:
int maxSize;
int listSize;
int curr;
E* listArray;

public:
AList(int size = 0)
{
maxSize = size;
listSize = curr = 0;
listArray = new E[maxSize];
}
~AList()
{
delete[] listArray;
}
void clear()
{
delete[] listArray;
listSize = curr = 0;
listArray = new E[maxSize];
}
void insert(const E& it)
{
assert(listSize < maxSize);//,"List capacity exceeded"
for (int i = listSize;i > curr;i--)
{
listArray[i] = listArray[i-1];
}
listArray[curr] = it;
listSize++;
}
void append(const E& it)
{
assert(listSize < maxSize);//,"List capacity exceeded"
listArray[listSize++] = it;
}

E remove()
{
assert((curr > 0) && (curr < listSize));
E it = listArray[curr];
for (int i = curr;i<listSize - 1;i++)
{
listArray[i] = listArray[i+1];
}
return it;
}
void moveToStart()
{
curr = 0;
}
void moveToEnd()
{
curr = listSize;
}
void moveToPos(int pos)
{
assert((pos > 0) && (pos < listSize));
curr = pos;
}

void prev()
{
if (curr != 0)
{
curr--;
}
}

void next()
{
if(curr<listSize)
{
curr++;
}
}

int length()const
{
return listSize;
}

int currPos()const
{
return curr;
}
const E& getValue()const
{
assert((curr >= 0) && (curr < listSize));//,"No current element"
return listArray[curr];
}
/*
void print()const
{
cout<<"[";

for(moveToStart();;currPos() < length()-1;next())
{
cout<< getValue()<<" ";
}
cout<<getValue()<<"]";
}
*/
};

template <typename E>
class Link
{
public:
E element;
Link* next;

Link(const E& elemval,Link* nextval = NULL)
{
element = elemval;
next = nextval;
}
Link(Link* nextval = NULL)
{
next = nextval;
}
};

template<typename E>
class LList : public List<E>
{
private:
Link<E>* head;
Link<E>* tail;
List<E>* curr;
int cnt;

void init()
{
curr = tail = head = new Link<E>;
cnt = 0;
}

void removeall()
{
while (head != NULL)
{
curr = head;
head = head->next;
delete curr;
}
}
public:
LList(int size = defaultSize)
{
init();
}
~LList()
{
removeall();
}
void print()const
{
for (curr = moveToStart();curr < length()-1;next())
{
cout<<"["curr->element<<","
}
cout<<curr->next->element<<"]"<<endl;
}
void clear()
{
removeall();
init();
}

void insert(const E& it)
{
curr->next = new Link<E>(it,curr->next);
if(tail == curr )
{
tail = curr->next;
}
cnt++;
}

void append(const E& it)
{
tail = tail->next = new Link<E>(it,NULL);
cnt++;
}

E remove()
{
assert(curr->next != NULL);//,"NO Element"
E it = curr->next->element;
Link<E>* ltemp = curr->next;
if (tail == curr->next)
{
tail = curr;
}
curr->next = curr->next->next;
delete ltemp;
cnt--;
return it;
}

void moveToStart()
{
curr = head;
}
void moveToEnd()
{
curr = tail;
}

void prev()
{
if (curr == head)
{
return;
}
Link<E>* temp = head;
while (temp->next != curr)
{
temp = temp->next;
}
curr = temp;
}

void next()
{
if(curr != tail)
{
curr = curr->next;
}
}

int length()const
{
return cnt;
}

int currPos()const
{
Link<E>* temp = head;
int i = 0;
for (i = 0;curr != temp;i++)
{
temp = temp->next;
i++
}
return i;
}

void moveToPos(int pos)
{
assert((pos>0) && (pos <= cnt));//,"Position out of range"
curr = head;
for (int i = 0;i<pos;i++)
{
curr = curr->next;
}
}

const E& getValue()const
{
assert(curr->next != NULL);//,"No value"
return curr->next->element;
}
};




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