您的位置:首页 > 理论基础 > 数据结构算法

数据结构c++实现----单链表

2013-10-09 15:45 393 查看
大二新开数据结构课了,我把我写的代码粘上来

我的代码会参考网上很多大神的代码,但绝不是抄袭,还有..........起名字是个很大的问题,我英语水平不高啊,所以各位不要纠结于各个函数的名字啊

单链表,错误处请指正,谢谢

// head.h

/***************************************
*这个node节点可以反复使用
*本来,我想用继承,但无法实现。又在类里定义node,但操作麻烦,前后指针操作都要使用函数
*最后确定用 友员
*修改时间: 2013 09 25 23:50
****************************************/

#ifndef HEAD

#define HEAD
#include<iostream>
using namespace std;
template<typename T> class SingleList;

template <typename T>
class LinkNode
{
public:
friend class SingleList<T>;
LinkNode();
LinkNode( const T &elem);
//~LinkNode();用不到
private:
T data;
LinkNode<T> *pPre;
LinkNode<T> *pNext;
};

template <typename T>
LinkNode<T>::LinkNode():pPre(NULL),pNext(NULL)
{
//用于初始化头结点,data用不到。
}
template <typename T>
LinkNode<T>::LinkNode( const T &elem):data(elem),pPre(NULL),pNext(NULL)
{
//初始化其余元素
}

#endi


// singlelist.cpp

#include"head.h"

template<typename T>
class SingleList
{
public:
SingleList();
~SingleList();

int Length();
bool IsEmpty();
bool Insert( const T &elem , int index);
bool InsertEnd( const T &elem);
bool Delete( const T &elem);
bool Updata( const T &elem, int index);
int Select( const T &elem);     //查找失败返回零
bool Get( int index ,T &elem);   // 若成功 有elem 带回索引值
void Clear();
private:
LinkNode<T> *pHead;
int Size;
};

template <typename T>
SingleList<T>::SingleList():Size(0)
{
pHead = new LinkNode<T>;
}

template <typename T>
SingleList<T>::~SingleList()
{
if( IsEmpty()){
delete pHead;
}
else{
Clear();
delete pHead;
}
}

template <typename T>
int SingleList<T>::Length()
{
return Size;
}
template <typename T>
bool SingleList<T>::IsEmpty()
{
if( 0 == Length()){
return true;
}
else{
return false;
}
}
template <typename T>
bool SingleList<T>::Insert(const T &elem, int index)
{
if( Length() < index ){
return false;
}
int i;
LinkNode<T> *q,*p = pHead;
for(i=1;i<index;i++){
p = p->pNext;
}
q = p->pNext;
p->pNext = new LinkNode<T>( elem );
p->pNext->pNext = q;
Size++;     //尺寸增加 勿忘

return true;
}

template <typename T>
bool SingleList<T>::InsertEnd(const T &elem)
{
LinkNode<T> *p = pHead;
while( p->pNext ){
p = p->pNext;
}
p->pNext = new LinkNode<T>( elem );
Size++;
return true;
}

template <typename T>
bool SingleList<T>::Delete(const T &elem)
{
LinkNode<T> *q,*p = pHead->pNext;
while( p && p->data != elem){   //防止访问超界,顺序判断顺序注意
q = p;
p = p->pNext;
}
if(!p){
return false;
}
q->pNext = p->pNext;
delete p;
Size--;
return true;
}

template <typename T>
bool SingleList<T>::Updata(const T &elem, int index)
{
if( Length() < index ){
return false;
}
int i;
LinkNode<T> *q,*p = pHead;
for( i=0;i<index;i++){
p = p->pNext;
}
p->data = elem;
}

template <typename T>
int SingleList<T>::Select(const T &elem)  //查找到返回位置,查找不到返回零
{
LinkNode<T> *p = pHead->pNext;
int i=1;
while( p && p->data != elem){
i++;
p = p->pNext;
}
if(!p){
return 0;
}
return i;
}

template <typename T>
bool SingleList<T>::Get( int index ,T &elem )
{
if( Length() < index ){
return false;
}
int i;
LinkNode<T> *p = pHead;
for(i=0;i<index;i++){
p = p->pNext;
}
elem = p->data;
return true;
}
template <typename T>
void SingleList<T>::Clear()
{
LinkNode<T> *q,*p = pHead->pNext;
pHead->pNext = NULL;
while( p ){
q = p;
p = p->pNext;
delete q;
}
Size = 0;
}


// mian.cpp   测试

#include"head.h"
#include"SingleList.cpp"

int main()
{
SingleList<int> slist;
slist.InsertEnd(44);
slist.InsertEnd(88);
slist.InsertEnd(11);
slist.InsertEnd(33);
slist.InsertEnd(22);
slist.Insert( 66,1);
cout<<slist.Select(66)<<endl;
cout<<slist.Select(44)<<endl;
int t;
slist.Get(1,t);
cout<<t<<endl;
cout<<slist.Length()<<endl;
//cout<<slist.Delete(99)<<endl;
//cout<<slist.Select(22)<<endl;
//cout<<slist.Select(44)<<endl;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: