如何创建带头结点的双链表

深度

在创建带头结点的双链表前我们需要先了解什么是双链表:

双链表是在单链表的基础上多了一个 指向其直接前驱的指针初始状态因为只有一个头结点所以,L->next=NULL;L-.prior=NULLL;这样在任何一个结点都可以很方便的访问其前驱结点和后继结点

在访问其前驱和后继是时间复杂度都为O(1)

创建头结点的双链表可以使用头插法和尾插法来实现

下面依次讲解:

#include<stdio.h>
#include<stdlib.h>
typedef struct LNode
{
	int data;
	LNode *prior;
	LNode *next;
}LNode, *LinkList;


void CreateListtail(LinkList &L)
{
	L = (LNode *)malloc(sizeof(LNode));
	L->next = NULL;//初始化前驱后继指向空
	L->prior = NULL;
	LNode *r, *s;
	r = L;
	int x;
	scanf_s("%d", &x);
	while (x!=9999)
	{
		LNode *s = (LNode *)malloc(sizeof(LNode));
		s->data = x;
		r->next = s;//尾指针指向新节点
		s->prior = r;//新节点的前驱指向尾指针
		r = s;//尾指针后移
		scanf_s("%d", &x);


	}
	r->next = NULL;
}
void CreateListHead(LinkList &L)
{
	L = (LNode *)malloc(sizeof(LNode));
	L->next = NULL;//初始化前驱后继指向空
	L->prior = NULL;
	LNode  *s;
	int x;
	scanf_s("%d", &x);
	while (x != 9999)
	{
		s = (LNode *)malloc(sizeof(LNode));
		s->data = x;//新节点赋值
		s->next = L->next;//新节点的后继等于头结点的后继
		if (L->next != NULL)//为空的时候特殊处理因为双链表的尾结点是始终指向空的
		{
			L->next->prior = s;//让新节点变成变成其后继的前驱
		}
		L->next = s;//头结点的后继赋值新节点
		s->prior = L;//新节点的前驱赋值为头结点
		scanf_s("%d", &x);
	}

}
void printL(LinkList L)//打印数据
{
	LNode *p = L->next;
	while (p)
	{

		printf("%d\n", p->data);
		p = p->next;

		

	}

}
int main()
{

	LinkList L;
	LinkList L1;
//	CreateListtail(L);
	CreateListHead(L1);
	printL(L1);
}

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
头结点的单链表是指在链表的头部增加一个额外的结点,该结点不存储具体的数据,而是用来作为链表的头指针的前驱。这样做的好处是在进行插入和删除操作时不需要特殊处理链表为空的情况,因为头结点始终存在。 双链表是指每个结点都有两个指针,一个指向直接后继结点,一个指向直接前驱结点。这样可以方便地从任意一个结点开始访问它的前驱结点和后继结点。与单链表相比,双链表的操作更加灵活,但是相应地需要多维护一个指针域。 所以,头结点的单链表双链表的区别在于双链表每个结点都有指向前驱结点的指针,而头结点的单链表只有指向后继结点的指针。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [C语言使用非循环双向链表实现队列](https://download.csdn.net/download/weixin_38704565/13757045)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [链表(一) -- 单链表与双向链表](https://blog.csdn.net/JeremyIverson/article/details/104282271)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [数据结构之单链表双链表](https://blog.csdn.net/guyuanxiang1995/article/details/76927042)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值