双链表的相关操作(定义,后插,删除,遍历)

双链表的定义

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 true;
}

双链表的插入(后插)

//在p结点之后插入s结点
bool InsertNextNode(DNode* p, DNode* s) {
	if (p == NULL || s == NULL)	//非法参数
		return false;
	s->next = p->next;	//①将结点*s插入到结点*p之后
	if (p->next != NULL)	//如果p结点有后继结点
		p->next->prior = s;	//②
	s->prior = p;	//③
	p->next = s;	//④
	return true;
}

请添加图片描述

按位序插入和前插操作都可以转化为后插操作

双链表的删除

bool DeleteNextNode(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结点不是最后一个结点
		q->next->prior = p;	//②
	free(q);	//释放结点空间
	return true;
}

请添加图片描述

销毁双链表

void DestoryList(DLinklist& L) {
	//循环释放各个数据结点
	while (L->next != NULL)
		DeleteNextNode(L);
	free(L);	//释放头结点
	L = NULL;	//头指针指向NULL
}

双链表的遍历

后向遍历

while (p != NULL) {
	//对结点p做相应处理,如打印
	p = p->next;
}

前向遍历

while (p != NULL) {
	//对结点p做相应处理
	p = p->prior;
}

跳过头结点

while (p->prior != NULL) {
	//对结点p做相应处理
	p = p->prior;
}

双链表不可随机存储,时间复杂度O(n)

主函数

void testLinkList() {
	//初始化双链表
	DLinklist L;
	InitDLinkList(L);
	......
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值