CPP双项链表

#include “List.h”
#include
using namespace std;
int main()
{
CList list;
list.AddTail(1);
list.AddTail(2);
list.AddTail(3);
list.AddHead(88);
list.AddHead(77);
list.AddHead(66);
cout << “正向输出” << endl;
POSITION pos= list.GetHeadPosition();
while (pos)
{
cout<< list.GetNext(pos)<<endl;
}

list.Delete(3);
list.Delete(66);
list.Delete(2);
cout << endl;
cout << "反向输出" << endl;
 pos = list.GetTailPosition();
while (pos)
{
	cout << list.GetPrev(pos) << endl;

}
cout <<"总共有:"<< list.GetCount()<<"条" << endl;
return 0;

}


#pragma once

typedef int DATA;
struct SNode
{
DATA data=0;
SNode * pPrev=nullptr;
SNode * pNext=nullptr;
};
typedef void* POSITION;
class CList
{
SNode *m_pHead, *m_pTail;
int m_nCount;
public:
CList();
~CList();
//清理堆空间
void RemoveAll();
//获得链表节点的个数
int GetCount();
//获得链表头节点
POSITION GetHeadPosition();
//获得链表的尾节点
POSITION GetTailPosition();
// 获取节点数据
DATA GetAt(POSITION pos);
// 获得当前节点的数据,并指针下移。
DATA GetNext(POSITION &pos);
// 获得当前节点的数据,并指针上移
DATA GetPrev(POSITION &pos);
// 向头部添加数据
void AddHead(DATA data);
// 从尾部添加数据
void AddTail(DATA data);
// 向指定的节点更新数据
void SetAt(POSITION pos, DATA data);
// 删除节点数据
void RemoveAt(POSITION pos);
// 删除指定的数据
void Delete(DATA data);
};


#include “List.h”

CList::CList()
{
m_pHead = m_pTail = nullptr;
m_nCount=0;
}

CList::~CList()
{//清理的是类对象之外额外申请的堆空间。
RemoveAll();
}
//清理堆空间
void CList::RemoveAll()
{
SNode *p = m_pHead,*p1;
while §
{
p1 = p;
p=p->pNext;
delete p1;
}

m_pHead = m_pTail = nullptr;
m_nCount = 0;

}
//获得链表节点的个数
int CList::GetCount()
{
return m_nCount;
}
//获得链表头节点
POSITION CList::GetHeadPosition()
{
return m_pHead;
}
//获得链表的尾节点
POSITION CList::GetTailPosition()
{
return m_pTail;
}
// 获取节点数据
DATA CList::GetAt(POSITION pos)
{
return ((SNode*)pos)->data;
}
// 获得当前节点的数据,并指针下移
DATA CList::GetNext(POSITION &pos)
{
DATA d = ((SNode*)pos)->data;
pos=((SNode*)pos)->pNext;
return d;
}
// 获得当前节点的数据,并指针上移
DATA CList::GetPrev(POSITION &pos)
{
DATA d = ((SNode*)pos)->data;
pos=((SNode*)pos)->pPrev;
return d;
}
// 向头部添加数据
void CList::AddHead(DATA data)
{
SNode *p = new SNode;
p->data = data;
if (m_pHead)//头有数据。
{
m_pHead->pPrev = p;
}
else
{
m_pTail = p;
}
p->pNext = m_pHead;
p->pPrev = nullptr;
m_pHead = p;
m_nCount++;
}
// 从尾部添加数据
void CList::AddTail(DATA data)
{
SNode p = new SNode;
p->data = data;
if (m_pTail)//尾有数据。
{
m_pTail->pNext = p;
}
else
{
m_pHead = p;
}
p->pNext = nullptr;
p->pPrev = m_pTail;
m_pTail = p;
m_nCount++;
}
// 向指定的节点更新数据
void CList::SetAt(POSITION pos, DATA data)
{
((SNode
)pos)->data = data;
}
// 删除节点数据
void CList::RemoveAt(POSITION pos)
{
SNode p = (SNode)pos;
if (p == m_pHead)
{
m_pHead = p->pNext;//头为空时执行
}
else
{
p->pPrev->pNext = p->pNext;
}
if (p == m_pTail)//尾为空时执行
{
m_pTail = p->pPrev;
}
else
{
p->pNext->pPrev = p->pPrev;//头为空时也执行
}
delete p;
m_nCount–;
}

// 删除指定的数据
void CList::Delete(DATA data)
{
POSITION pos = GetHeadPosition();
while (pos)
{
if (GetAt(pos)==data)
{
RemoveAt(pos);
break;
}
GetNext(pos);

}

}

猜你喜欢

转载自blog.csdn.net/weixin_43769045/article/details/84992298