
如何用c++来建立一个完整的链表类?
1个回答
2012-03-30
展开全部
#include<iostream>
using namespace std;
class List
{
public:
List(void):m_pHead(NULL),m_pTail(NULL){}
~List(void)
{
for(Node* pNode=m_pHead,*pNext;pNode;pNode=pNext)
{
pNext=pNode->m_pNext;
delete pNode;
}
}
//接口:追加
void Append(int nData)
{
Node* pNode=new Node(nData,m_pTail);
if(pNode->m_pPrev)
pNode->m_pPrev->m_pNext=pNode;
else
m_pHead=pNode;
m_pTail=pNode;
}
//接口:插入
void Insert(size_t uIndex,int nData)
{
for(Node* pFind=m_pHead;pFind;pFind=pFind->m_pNext)
if(uIndex--==0)
{
Node* pNode=new Node(nData,pFind->m_pPrev,pFind);
if(pNode->m_pPrev)
pNode-> m_pPrev->m_pNext=pNode;
else
m_pHead=pNode;
if(pNode->m_pNext)
pNode->m_pNext->m_pPrev=pNode;
else
m_pTail=pNode;
return;
}
throw OverBound();
}
//接口:删除
void Delete(size_t uIndex)
{
for(Node* pFind=m_pHead;pFind;pFind=pFind->m_pNext)
if(uIndex--==0)
{
if(pFind->m_pPrev)
pFind->m_pPrev->m_pNext=pFind->m_pNext;
else
m_pHead=pFind->m_pNext;
if(pFind->m_pNext)
pFind->m_pNext->m_pPrev=pFind->m_pPrev;
else
m_pTail=pFind->m_pPrev;
delete pFind;
return;
}
throw OverBound();
}
//接口:伪随机访问/按下标访问
int operator[](size_t uIndex)
{
for(Node* pFind=m_pHead;pFind;pFind=pFind->m_pNext)
if(uIndex--==0)
return pFind->m_nData;
throw OverBound();
}
//接口:遍历
void Travel(void)
{
for(Node* pNode=m_pHead;pNode;pNode=pNode->m_pNext)
cout<<pNode->m_nData<<" ";
cout<<endl;
}
private:
//异常越界
class OverBound:public exception
{
public:
const char* what(void) const throw()
{
return "链表越界!";
}
};
class Node
{
public:
Node(int nData=0,Node* pPrev=NULL,Node* pNext=NULL):m_nData(nData),m_pPrev(pPrev),m_pNext(pNext){}
int m_nData; //数据
Node* m_pPrev; //前指针
Node* m_pNext; //后指针
};
Node* m_pHead; //头节点
Node* m_pTail; //尾节点
};
int main()
{
try
{
List list;
list.Append(10);
list.Append(20);
list.Append(30);
cout<<list[0]<<endl;
cout<<list[1]<<endl;
cout<<list[2]<<endl;
// cout<<list[6]<<endl; //越界测试
list.Insert(1,15);
cout<<list[1]<<endl;
list.Delete(2);
for(size_t i=0;i<3;i++)
cout<<list[i]<<endl;
list.Travel();
}
catch(exception& ex)
{
cout<<ex.what()<<endl;
return -1;
}
return 0;
}
这是我四天前和老师一起写的,供你参考一下,有问题的话可以一起讨论一下,希望对你有所帮助
using namespace std;
class List
{
public:
List(void):m_pHead(NULL),m_pTail(NULL){}
~List(void)
{
for(Node* pNode=m_pHead,*pNext;pNode;pNode=pNext)
{
pNext=pNode->m_pNext;
delete pNode;
}
}
//接口:追加
void Append(int nData)
{
Node* pNode=new Node(nData,m_pTail);
if(pNode->m_pPrev)
pNode->m_pPrev->m_pNext=pNode;
else
m_pHead=pNode;
m_pTail=pNode;
}
//接口:插入
void Insert(size_t uIndex,int nData)
{
for(Node* pFind=m_pHead;pFind;pFind=pFind->m_pNext)
if(uIndex--==0)
{
Node* pNode=new Node(nData,pFind->m_pPrev,pFind);
if(pNode->m_pPrev)
pNode-> m_pPrev->m_pNext=pNode;
else
m_pHead=pNode;
if(pNode->m_pNext)
pNode->m_pNext->m_pPrev=pNode;
else
m_pTail=pNode;
return;
}
throw OverBound();
}
//接口:删除
void Delete(size_t uIndex)
{
for(Node* pFind=m_pHead;pFind;pFind=pFind->m_pNext)
if(uIndex--==0)
{
if(pFind->m_pPrev)
pFind->m_pPrev->m_pNext=pFind->m_pNext;
else
m_pHead=pFind->m_pNext;
if(pFind->m_pNext)
pFind->m_pNext->m_pPrev=pFind->m_pPrev;
else
m_pTail=pFind->m_pPrev;
delete pFind;
return;
}
throw OverBound();
}
//接口:伪随机访问/按下标访问
int operator[](size_t uIndex)
{
for(Node* pFind=m_pHead;pFind;pFind=pFind->m_pNext)
if(uIndex--==0)
return pFind->m_nData;
throw OverBound();
}
//接口:遍历
void Travel(void)
{
for(Node* pNode=m_pHead;pNode;pNode=pNode->m_pNext)
cout<<pNode->m_nData<<" ";
cout<<endl;
}
private:
//异常越界
class OverBound:public exception
{
public:
const char* what(void) const throw()
{
return "链表越界!";
}
};
class Node
{
public:
Node(int nData=0,Node* pPrev=NULL,Node* pNext=NULL):m_nData(nData),m_pPrev(pPrev),m_pNext(pNext){}
int m_nData; //数据
Node* m_pPrev; //前指针
Node* m_pNext; //后指针
};
Node* m_pHead; //头节点
Node* m_pTail; //尾节点
};
int main()
{
try
{
List list;
list.Append(10);
list.Append(20);
list.Append(30);
cout<<list[0]<<endl;
cout<<list[1]<<endl;
cout<<list[2]<<endl;
// cout<<list[6]<<endl; //越界测试
list.Insert(1,15);
cout<<list[1]<<endl;
list.Delete(2);
for(size_t i=0;i<3;i++)
cout<<list[i]<<endl;
list.Travel();
}
catch(exception& ex)
{
cout<<ex.what()<<endl;
return -1;
}
return 0;
}
这是我四天前和老师一起写的,供你参考一下,有问题的话可以一起讨论一下,希望对你有所帮助
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询