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

数据结构--双链表的创建和操作

2015-06-26 14:12 501 查看

一、双向链表的定义

  双向链表也叫双链表,是链表的一种,它的每个数据结点中都有两个指针,分别指向直接后继和直接前驱。所以,从双向链表中的任意一个结点开始,都可以很方便地访问它的前驱结点和后继结点。一般我们都构造双向循环链表。

  注意:在实现的过程中,要分清前驱指针和后继指针,不要把他们当成一个指针。

//双向链表的实现
template<typename T>struct node{
T data;
node<T> *prior,*next;
};


二、双向链表的实现

template<typename T>class nLink
{
private:
node<T> *head;
public:
nLink()
{
head=new node<T>;
head->next=head->prior=NULL;
}
~nLink()
{

}
//清空双链表
void clearLink()
{
node<T> *p=head->next,*q=NULL;
while(p)
{
q=p->next;
delete p;
p=q;
}
head->next=NULL;
}
//销毁双链表
void destoryLink()
{
clearLink();
if (head)
{
delete head;
head=NULL;
}
}
//打印双链表
void printLink()
{
node<T> *p=head->next;
while(p)
{

cout<<p->data<<" ";
p=p->next;
}
cout<<endl;
}
//在双链表末尾添加结点
bool appendLink(T e)
{
node<T> *p=head,*s=NULL;
s=new node<T>;
if (s==NULL)
return false;
s->data=e;
s->next=s->prior=NULL;
while(p->next)
{
p=p->next;
}
p->next=s;
s->prior=p;
return true;
}
//获取链表的长度
int length()
{
node<T> *p=head;
int lenth=0;
if (p==NULL)
return 0;
while(p)
{
p=p->next;
lenth++;
}
return lenth;
}
//在第pos个位置插入新节点
bool insertLink(int pos,T e)
{
node<T> *p=head;
int posflag=0;
while(p&&posflag<pos-1)
{
p=p->next;
++posflag;
}
node<T> *s=new node<T>;
if (s==NULL)
return false;
s->data=e;
s->next=s->prior=NULL;
if (p==NULL||posflag>pos-1)
{
return false;
}
s->next=p->next;
if(p->next!=NULL)
p->next->prior=s;
p->next=s;
s->prior=p;
return true;
}

//删除第i个位置上的节点
bool deleteLink(int pos)
{
node<T> *p=head;
if (pos>length()||pos<1)
{
return false;
}
int posflag=0;
while(p && posflag<pos-1)
{
p=p->next;
++posflag;
}
if (p && p->next==NULL)
{
p->prior->next=NULL;
delete p;
p=NULL;
}
else{
p->prior->next=p->next;
p->next->prior=p->prior;
delete p;
p=NULL;
}
return true;
}

//删除制定元素的节点
bool deleteLink(T e)
{
node<T> *p=head;
while (p)
{
if (p->data==e)
{
break;
}
p=p->next;
}
if(p==NULL)
{
cout<<"can not find the elem:"<<e<<endl;
return false;
}
//判断要删除的是不是尾节点
if (p->next==NULL)
{
p->prior->next=NULL;
delete p;
p=NULL;
}
else{
p->prior->next=p->next;
p->prior=p->next->prior;
delete p;
p=NULL;
}
return true;
}
};


测试工作

int main()
{
nLink<char> link;
for (int i=0;i<10;i++)
{
link.appendLink('a'+i);
}
link.insertLink(11,'s');
cout<<"Length:"<<link.length()<<endl;
link.printLink();
link.deleteLink('s');
link.printLink();
cout<<"Length:"<<link.length()<<endl;
system("pause");
return 0;
}


参考地址:http://www.oschina.net/code/snippet_250934_12063
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: