一、链表的基本概念
- 链表是一种物理上不连续、非顺序的存储结构,数据元素之间通过指针关联在一起。
链表有一系列的节点构成,每个节点至少包含两部分信息:元素数据、指向下一个节点的指针。
链表的特点:
1)空间开销大(物理空间不连续)
2)可以动态添加新的节点
3)查找元素只能按顺序查找
2-> 双向链表在单链表的基础上增加了一个指向上一个元素的指针。本篇幅不再分块介绍双向链表。单链表位置:单链表
二、双向链表
- 图示
- 代码
class Node{//节点
public:
int data;
Node *pPre,*pNext;
};
class DoubleLinkList{//双向链表
Node *head;
public:
DoubleLinkList(){
head =new Node;
head->data=0;
head->pPre=NULL;
head->pNext=NULL;
}
~DoubleLinkList(){
delete head;
}
void CreatLinkList(int n);
void InsertNode(int position,int d);
void DeleteNode(int position);
void TraverseLinkList();
bool isEmpty();
int getLength();
void DeleteLinkList();
}
void DoubleLinkList::CreatLinkList(int n){//创建链表
if(n<=0)
{
cout<<"error";
exit(EXIT_FAILURE);
}
Node *tmp,*pnew;
tmp=head;
for(int i=1;i<=n;i++)
{
pnew=new Node;
cout<<"请输入第"<<i<<"个节点的值"<<endl;
cin>>pnew->data;
pnew->pNext==NULL;
pnew->pPer=tmp;
tmp->pNext=pnew;
tmp=pnew;
}
}
void DoubleLinkList::InsertNode(int position,int d)//插入节点
{
if(position<1||position>getLength+1)
{
cout<<"error";
exit(EXIT_FAILURE);
}
Node *tmp,*pnew;
pnew->data=d;
tmp=head;
for(int i=1;i<position;i++)
tmp=tmp->pNext;
if(tmp->pNext!=NULL)
tmp->pNext->pPer=pnew;
pnew->pNext=tmp->pNext;
pnew->pPer=tmp;
tmp->pNext=pnew;
tmp=pnew;
}
void DoubleLinkList::DoubleLinkList(int position)//删除节点
{
if(position<1||position>getLength+1)
{
cout<<"error";
exit(EXIT_FAILURE);
}
Node *tmp,*del;
tmp=head;
for(int i=1;i<position;i++)
tmp=tmp->pNext;
del=tmp->pNext;
if(del->pNext!=NULL)
del->pNext->pPer=tmp;
tmp->pNext=del->pNext;
delete del;
}
bool DoubleLinkList::isEmpty()//判断是否为空
{
Node *tmp=head;
if(tmp->pNext=NULL)
return true;
return false;
}
int DoubleLinkList::getLength()//获取链表长度
{
int count=0;
Node *tmp=head;
if(tmp->pNext==NULL)
return 0;
while(tmp->pNext!=NULL)
{
count++;
tmp=tmp->pNext;
}
}
void DoubleLinkList::DeleteLinkList()//删除链表
{
if(position<1||position>getLength+1)
{
cout<<"error";
exit(EXIT_FAILURE);
}
Node *tmp,*del;
tmp=head;
while(tmp!=NULL)
{
del=tmp;
tmp=tmp->pNext;
if(tmp!=NULL)
tmp->pPer=head;
head->pNext=tmp;
delete del;
}
}