数据结构——双链表

1.1双向带头结点非循环链表

1.2双向带头结点循环链表

2.1创建节点信息的结构体

2.2初始化/创建头结点

2.3双链表节点的插入

2.4双链表的删除

        双链表的节点指针域有两个指针,一个指向前面,一个指向后面。不同于单链表,单链表的指针域只有一个指针指向后面,那么当需要寻找前面的指针时,就很不方便。

1.1双向带头结点非循环链表,双向链表一定要记得将前指针向前指

1.2双向带头结点循环链表

2.1创建节点信息的结构体

//双向链表结点设计
typedef struct node
{
	int data;//数据段
	struct node *next;//后向指针
	struct node *prev;//前向指针
}ND, *PND;

2.2初始化/创建头结点

a、双向带头结点非循环链表

/***********************************
功能:初始化/创建带头结点的双向非循环链表
参数:void
返回值:返回一个PND类型的头结点
*************************************/
PND init_double_link(void)
{
	PND phead;
	phead=(PND)malloc(sizeof(ND));
	if(phead == NULL)
	{
		printf("malloc fail\n");
		return NULL;
	}
	phead->next = NULL;
	phead->prev = NULL;
	return phead;
}

b、双向带头结点循环链表

/***********************************
功能:初始化/创建带头结点的双向循环链表
参数:void
返回值:返回一个PND类型的头结点
*************************************/
PND init_double_cir_link(void)
{
	PND phead;
	phead=(PND)malloc(sizeof(ND));
	if(phead == NULL)
	{
		printf("malloc fail\n");
		return NULL;
	}
	phead->next = phead;
	phead->prev = phead;
	return phead;
}

2.3双链表节点的插入

      1234的顺序中,其中34是不可以调换顺序的,因为如果先进行4,那么phead->next这个节点就无法表示。

/***********************************
功能:插入新结点都头结点后面
参数:phead 插入链表的头结点   d插入该结点的数据
返回值:true插入成功  false 插入失败
*************************************/
bool insert_node_head(PND phead, int d)
{
	//判断phead是否有效
	if(phead == NULL)
	{
		printf("disable reached!\n");
		return false;
	}
	PND pnew = (PND)malloc(sizeof(ND));
	//判断是否申请成功
	if(pnew == NULL)
	{ 
		printf("malloc pnew failed!\n");
		return false;
	}
	
	//判断插入的节点是否第一个
	if(phead->next == NULL)
	{
		pnew->prev = phead;
		pnew->next =NULL;
		phead->next = pnew;
 	}
	else
	{
		pnew->next = phead->next;
		pnew->prev = phead;
		phead->next->prev = pnew;
		phead->next = pnew;
	}  
	pnew->data = d;
	
	return true;
}

2.3双链表节点的删除

/***********************************
功能:删除数据域为d的节点
参数:phead 删除链表的头结点   d删除该结点的数据
返回值:true插入成功  false 插入失败
*************************************/
bool delete_node(PND phead, int d)
{
	//判断phead是否有效
	if(phead == NULL)
	{
		printf("disable reached!\n");
		return false;
	}
	PND pdel = phead->next;//由于phead随机,如刚好那么巧,头就被删掉了
	//查找要删除的那个结点
	while(pdel != NULL)
	{
		if(pdel->data== d)//找到了
		{
			if(pdel->next == NULL)
			{
				pdel->prev->next = NULL;
				pdel->next = NULL;
				pdel->prev = NULL;
				break;
			}
			pdel->prev->next = pdel->next;
			pdel->next->prev = pdel->prev;
			pdel->next = NULL;
			pdel->prev = NULL;
			break;
		}
		pdel = pdel->next;
	}
	return true;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值