数据结构与算法——单链表的使用

本文详细介绍了单链表的存储结构,包括带头结点和不带头结点的情况,并展示了C语言实现单链表的各种操作,如查找、插入和删除。接着探讨了单链表的变形,包括循环单链表、带尾指针的循环单链表、双向链表以及静态链表,分析了它们各自的特点和应用场景。

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

1. 单链表

用一组地址任意的存储单元存放线性表中的数据元素,其中其数据元素由一系列的结点构成。结点又包含数据域和指针域:

数据域 (数据元素) + 指针域 (指示后继元素存储位置) = 结点

以“结点的序列” 表示的线性表称作链表

1.1 单链表的存储结构

1.不带头结点:


不带头结点的的单链表

以线性表中第一个数据元素a1的存储地址作为线性表的地址,称作线性表的头指针(head)。

  • 链表指针存放链表第一个数据元素结点的地址
  • 空链表时该指针域为NULL

2.带头结点 :

在这里插入图片描述
带头结点的的单链表(箭头所指表示头结点)

有时为了操作方便,在第一个结点之前虚加一个“头结点”,并用链表的头指针指向头结点,称为带头结点的单链表。

  • 一个专门的结点,称为头结点
  • 该头结点永远存在
  • 该头结点指针域存放第一个数据元素结点的地址
  • L.next = NULL

用法举例:已知指针p指向单链表L的第i个结点,则访问第i个数据和第i+1个数据的方法分别是p->datap->next->data

1.2 单链表的C语言实现

简单链表示例:

在这里插入图片描述
具有两个节点的单链表

代码实现:

// 类型定义
typedef struct Node
{
   
   
	ElemType elem;
	struct Node *next;
}Node,*Ptr;
typedef Ptr *SqListPtr;

//变量的定义和使用
Node n1, n2;/* 定义2个结点变量*/
Ptr p = &n1;/* 定义一个指向结点的指针变量p, 并存放n1的地址(指针) */
n1.next = &n2; /* 结点n1的指针域存放结点n2的地址*/
SqListPtr L = p; //定义一个单链表L
N2.next = NULL;

1.2.1 查找——按位置查找

代码实现:

//寻找位于 pos 的结点,并将数据存储到 *elem 中。
Status List_Retrieve(SqListPtr L, int pos, ElemType *elem)
{
   
   
	Status s = range_error;
	Ptr p = (*L)->next;; /* 带头结点,移动p指向第一个元素结点*/
	int i = 1;/*计数器*/
	while (p && i < pos)){
   
    /* p指向的结点存在,且未到达指定位置*//*条件1 防止pos>表长;条件2 控制取第pos个, 防pos<1 */
	{
   
   
		i++;
		p = p->next;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值