数据结构模板之三:双链表

①基本定义

双链表的许多操作与单链表类似,有关单链表的内容可以点此查看

与单链表不同的是,双链表中的每个结点既包含一个指向后继结点的指针,还包含一个指向前驱结点的指针


②存储方式与结构

和单链表类似,只是每个结点都有可以访问前驱结点的指针,因此和单链表相比,双链表在访问前驱结点时会更方便。


③实现

#include <iostream>
#include <cstdlib>
using namespace std;
typedef int ElemType;

typedef struct DNode
{
	ElemType data;
	struct DNode * prior;         //指向前驱结点
	struct DNode * next;          //指向后继结点
}DLinkNode;                       //双链表结点类型

/*****建立双链表*****/

/***头插法***/

void CreateListF(DLinkNode * &L,ElemType a[],int n)
{
	DLinkNode *s;
	L=(DLinkNode *)malloc(sizeof(DLinkNode));       //创建头结点
	L->prior=L->next=NULL;                          //前后指针域置于NULL 
	for(int i=0;i<n;i++)                            //循环建立数据结点
	{
		s=(DLinkNode *)malloc(sizeof(DLinkNode));
		s->data=a[i];
		s->next=L->next;                            //将s结点插入到头结点后
		if(L->next != NULL)                         //若L存在数据结点,修改L->next的前驱指针
			L->next->prior=s;
		L->next=s;
		s->prior=L;
	}
}

/*****尾插法*****/

void CreateListR(DLinkNode * &L,ElemType a[],int n)
{
	DLinkNode *s,*r;
	L=(DLinkNode *)malloc(sizeof(DLinkNode));	//创建头结点
	r=L;                                        //r始终指向尾结点,开始时指向头结点
	for(int i;i<n;i++)
	{
		s=(DLinkNode *)malloc(sizeof(DLinkNode));
		s->data=a[i];
		r->next=s; s->prior=r;                  //将s结点插入到r结点之后
		r=s;
	}
	r->next=NULL;
}

/*****双链表中,大多数运算和单链表中的操作是相同的,但插入和删除结点是不同于单链表的*****/

/*****插入*****/

bool ListInsert(DLinkNode * &L,int i,ElemType e)
{
	int j=0;
	DLinkNode *p=L,*s;         //p指向头结点,j设置为0
	if(i<=0)
		return false;
	while(j<i-1 && p!=NULL)    //查找第i-1个结点
	{
		j++;
		p=p->next;
	}
	if(p==NULL)                //未找到第i-1个结点返回false
		return false;
	else
	{
		s=(DLinkNode *)malloc(sizeof(DLinkNode));
		s->data=e;              //创建新结点s
		s->next=p->next;        //在p结点之后插入s结点
		if(p->next != NULL)     //若p结点之后存在后继结点,修改其前驱指针
			p->next->prior=s;
		s->prior=p;
		p->next=s;
		return true;
	}
}

/*****删除*****/

bool ListDelete(DLinkNode * &L,int i,ElemType &e)
{
	int j=0;
	DLinkNode *p=L,*q;         //p指向头结点,j设为0
	if(i<=0)
		return false;
	while(j<i-1 && p!=NULL)     //查找第i-1个结点
	{
		j++;
		p=p->next;
	}
	if(p==NULL)
		return false;
	else
	{
		q=p->next;         //q指向第i个结点
		if(q==NULL)
			return false;
		e=q->data;
		p->next=q->next;   //删除结点q
		if(p->next !=NULL)  //若p结点存在后继结点,修改其前驱指针
			p->next->prior=p;
		free(q);
		return true;
	}
}

int main()
{
	DLinkNode *L;
	int n,a[100];
	cin >> n;
	for(int i=0;i<n;i++)
		cin >> a[i];
	CreateListF(L,a,n);
	return 0;
}

---代码和部分内容参考自《数据结构教程》

猜你喜欢

转载自blog.csdn.net/gsdxiaohei/article/details/80793893