双链表的相关操作
上一篇博客浅谈了一下顺序表和单链表
这一篇博客简单介绍一下双链表的相关操作
所谓双向链表激素和相对于单链表增加了一个prior(前驱)指向该节点的直接前驱
经过这样处理后的链表会更加方便操作但是同时这也增加了空间复杂度
Tips:整个数据结构系列的博客是为了复习一下大二没学好的内容,因为是转专业到计算机所以大二才开始学计算机。没有C语言和离散数学基础直接就学了数据结构,所以感觉学的不好,于是寒假决定写博客复习下。内容可能比较浅,或者说没有深入探讨原理,仅简单给出代码。如果希望更好的学习可以不必阅读我的博客,以免耽误时间,这一系列博客是为了给自己复习,所谓为了省时间可能写的简洁,确实时间有限。而且·想把更多的时间放到后面的内容。前面的线性表,栈和队列等会快速过一下。代码有问题的话可以私信探讨。
#include <iostream>
using namespace std;
//双链表节点类型定义
typedef struct DLNode
{
int data;//数据域
struct DLNode *prior;//指向前驱
struct DLNode *next;//指向后继
}DLNode,*DLinkList;
//创建双向链表
void CreatList_DL(DLinkList &L)
{
L=new DLNode;
L->prior=NULL;
L->next=NULL;
int x;
cin>>x;
DLNode *s;
DLNode *r=L;//定义一个尾指针
while(x!=0)
{
s=new DLNode;
s->data=x;
s->next=NULL;//后插
r->next=s;
s->prior=r;
r=s;
cin>>x;
}
}
//双链表的插入
void ListInsert_DL(DLinkList &L,int index,int e)
{
int count=0;//计数器记录位置
DLNode *p;
p=L;
while(count<index-1)
{
p=p->next;
count++;
}
DLNode *s=new DLNode;
s->data=e;
s->next=p->next;
//考虑到一种特殊情况,如果是链表末尾的话,后面没有节点,则不用处理后面节点的prior域
if(p->next!=NULL)
p->next->prior=s;
s->prior=p;
p->next=s;
}
//双链表的删除
void ListDelete_DL(DLinkList &L, int i)
{
int num=0;
DLNode *temp;
temp=L;
while(num<i)//工作指针移动
{
temp=temp->next;
num++;
}
if(temp->next==NULL)//同样的特殊情况如果是最后一个节点,特殊处理
{
temp->prior->next=NULL;
}
else
{
temp->prior->next=temp->next;
temp->next->prior=temp->prior;
}
delete temp;
}
//双链表的打印
void ListPrint_DL(DLinkList L)
{
DLNode *p;
p=L->next;
while(p!=NULL)
{
cout<<p->data<<" ";
p=p->next;
}
}
int main()
{
DLinkList L;
CreatList_DL(L);
ListPrint_DL(L);
printf("\n");
//随便选了一个例子测试
int x;
cin>>x;
ListDelete_DL(L,x);
ListPrint_DL(L);
printf("\n");
ListInsert_DL(L,x,x);
ListPrint_DL(L);
return 0;
}