双链表及其基本操作


前言

单链表无法逆向检索,而双链表可进可退,相比较而言存储密度更低一些


一、初始化(带头结点)

typedef struct DNode{
	ElemType data;
	struct DNode *prior,*next;
}DNode,*DLinklist;
bool InitDLinklist(DLinklist &L){
	L=(DNode *)malloc(sizeof(DNode));
	if(L==NULL)
		return false;
	L->prior=NULL;	//头结点的prior永远指向NULL
	L->next=NULL;
	return ture;
}
//判断双链表是否为空
bool IsEmpty(DLinklist L){
	return(L->next==NULL)
}
void testDLinklist(){
	DLinklist L;
	InitDlinklist();
	//后续代码省略
}

二、插入

//双链表的插入
bool InsertNextDNode(DNode *p,DNode *s){
	if(p==NULL&&s==NULL)
		return false;
	s->next=p->next;
	if(p->next!=NULL)	//如果p结点有后继结点
		p->next->prior=s;
	s->prior=p;
	p->next=s;
	return ture;
}

三、删除和销毁


//双链表的删除
bool DeleteNextDNode(DNode *p){
	if(p==NULL)
		return false;
	DNode *q=p->next;	//找到p的后继结点q
	if(q==NULL) return false;	//p没有后继结点
	p->next=q->next;
		if(q->next!=NULL)
		   q->next->prior=p;
	free(q);
	return ture;
}	
//双链表的销毁
void DestoryList(DLinklist &L){
	//循环释放各个结点
	while(L->next!=NULL){
		DeleteNextDNode(L);
	}
	free(L);	//释放头结点
	L=NULL;	//头指针指向NULL
}

四、遍历

//双链表的遍历
		   //后向遍历
while(p!=NULL){
	p=p->next;	//针对按位查找只需要加一个计数器,按值查找需要进行对比
}
		   //前向遍历
while(p!=NULL){
	p=p->prior;
}
		   //前向遍历(跳过头结点)
while(p->prior!=NULL){
	p=p->prior;
}

总结

注意边界处理,对于最后一个结点需要进行特殊处理,对于双链表也需要顺序遍历进行查找

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值