不带头结点的单向链表实现

本文介绍了链表的概念及其分类,重点讨论了不带头结点的单链表与带头结点的单链表的区别,包括初始化和操作上的差异。不带头结点的链表在处理第一个节点时需要特殊操作,而带头结点的链表则能简化这些操作,并有利于统一空表和非空表的处理。文章还概述了不带头结点单向链表的基本操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一. 什么是链表,链表的分类?

链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针连接次序实现的。
分类:
1.单链表
不带头节点
在这里插入图片描述
带头结点
在这里插入图片描述
循环单链表
在这里插入图片描述
2.双向链表
不带头节点
在这里插入图片描述
带头结点的
在这里插入图片描述
循环双链表
在这里插入图片描述
最后总结如下:
在这里插入图片描述

二. 链表带头结点和不带头结点的区别?

初始化不同:不带头结点的单链表对于第一个节点的操作与其他节点不一样,需要特殊处理,这增加了程序的复杂性和出现bug的机会,因此,通常在单链表的开始结点之前附设一个头结点。 带头结点的单链表,初始时一定返回的是指向头结点的地址,所以一定要用二维指针,否则将导致内存访问失败或异常。
引入头结点虽然会使链表变得复杂,但会有以下优势:
1.可以更快删除/插入第一个结点
2.能够统一空表和非空表的处理
注:链表是否有头结点,头指针始终指向链表的第一个结点。如果有头结点,头指针就指向头结点。

三、 单链表的基本操作(不带头结点单向链表)
#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
typedef int SDataType;

typedef struct SListNode
{
   
   
	SDataType _data;
	struct SListNode* _pNext;
}Node,*PNode;

typedef struct SList
{
   
   
	PNode _pHead;
}SList,*PSList;

//链表初始化
void SListInit(SList *s)
{
   
   
	assert(s);
	s->_pHead = NULL;
}
//创建一个节点
Node *BuyNode(SDataType data)
{
   
   
	Node* pNewNode = (Node *)malloc(sizeof(Node));
	pNewNode->_data = data;
	pNewNode->_pNext = NULL;
	return pNewNode;
}
//销毁节点
void SListDstoryNode(Node *node)
{
   
   
	assert(node);
	<
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值