【王道数据结构笔记】不带头节点的单链表(代码分析)

在这里插入图片描述

🎈个人主页:豌豆射手^
🎉欢迎 👍点赞✍评论⭐收藏
🤗收录专栏:数据结构
🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进步!

@TOC

在这里插入图片描述

引言

一代码

#define _CRT_SECURE_NO_WARNINGS

#include<stdio.h>
typedef struct LNode {
	int data;
	struct LNode* next;
}LNode,*Linklist;
//初始化一个空的单链表
bool InitList(Linklist& L)
{
	L = NULL;
	return true;

}

void test() 
{
	Linklist L;
	InitList(L);
}
//判断单链表是否为空
bool Empty(Linklist L)
{
	if (L == NULL)
		return true;
	else
		return false;
}
bool Empty1(Linklist L)
{
	return(L == NULL);
}

二 代码分析

#define _CRT_SECURE_NO_WARNINGS

分析:这行代码定义了一个预处理宏,用于在编译时消除Microsoft编译器中关于某些函数(如scanfstrcpy等)的安全警告。这通常是因为这些函数可能会导致缓冲区溢出,但在此代码中并未直接用到这些函数,所以这个宏可能并不是必需的。

#include<stdio.h>

分析:这行代码包含了标准输入输出库的头文件stdio.h。虽然代码中并没有直接使用到这个库中的函数,但在C++中,通常会使用#include <iostream>来替代#include <stdio.h>,因为iostream是C++标准库的一部分,并且与C++的流操作更兼容。

typedef struct LNode {
	int data;
	struct LNode* next;
}LNode,*Linklist;

分析:这部分代码定义了一个名为LNode的结构体,用于表示单链表的一个节点。每个节点包含一个整型数据data和一个指向下一个节点的指针next。然后,使用typedef为这个结构体以及指向该结构体的指针分别定义了别名LNodeLinklist,以便在后续代码中更方便地使用。

//初始化一个空的单链表
bool InitList(Linklist& L)
{
	L = NULL;
	return true;
}

分析:这个函数用于初始化一个空的单链表。它接受一个Linklist类型的引用参数L,并将其设置为NULL,表示链表为空。函数返回true,表示初始化成功。这里使用了引用传递,可以确保对L的修改会影响到函数外部的变量。

void test() 
{
	Linklist L;
	InitList(L);
}

分析:这个test函数用于测试InitList函数。它首先声明了一个Linklist类型的变量L,然后调用InitList函数来初始化这个链表。由于InitList函数是通过引用传递参数的,所以L会被成功初始化为NULL

//判断单链表是否为空
bool Empty(Linklist L)
{
	if (L == NULL)
		return true;
	else
		return false;
}

分析:这个函数用于判断单链表是否为空。它接受一个Linklist类型的参数L,如果LNULL,则返回true表示链表为空;否则返回false表示链表不为空。这个函数的逻辑很直接,但也可以使用更简洁的写法。

bool Empty1(Linklist L)
{
	return(L == NULL);
}

分析:这个函数Empty1Empty函数的功能相同,也是用来判断链表是否为空。但它的实现更加简洁,直接返回了表达式L == NULL的结果。这种写法在C++中很常见,它使代码更加紧凑且易于阅读。

三 注意

。初始化一个不带头节点的空单链表实际上是创建一个指针变量(通常命名为head),并将它设置为NULL。这个head指针用来指向链表的第一个节点,但在初始化时,因为链表是空的,所以head指向NULL

你不需要生成一个节点来初始化一个空链表,因为空链表没有任何节点。当你向链表中添加第一个节点时,这个节点才会被创建,并且head指针会指向这个节点。这个节点的next指针会设置为NULL,表示它是链表的最后一个节点。

所以,初始化一个不带头节点的空单链表,你只需要设置头指针headNULL即可。下面是一个简单的示例:

#include <stdio.h>
#include <stdlib.h>

// 定义单链表的节点结构
typedef struct ListNode {
    int data;
    struct ListNode *next;
} ListNode;

// 初始化一个不带头节点的空单链表
void initList(ListNode **head) {
    *head = NULL; // 设置头指针为NULL,表示链表为空
}

// 其他链表操作函数...

int main() {
    ListNode *head = NULL; // 声明头指针并初始化为NULL
    initList(&head); // 初始化链表,这一步实际上是多余的,因为head已经是NULL了

    // 后续可以向链表中添加节点等操作...

    return 0;
}

在这个例子中,initList函数接受一个指向头指针的指针ListNode **head,并将它指向的head设置为NULL。但是请注意,在main函数中,我们直接声明了headNULL,所以调用initList(&head)实际上是不必要的,因为head已经是NULL了。初始化链表的主要目的是确保链表在使用前处于一个已知和一致的状态。

总结来说,初始化一个不带头节点的空单链表只是简单地将头指针设置为NULL,并不涉及创建任何节点。

总结

这篇文章到这里就结束了

谢谢大家的阅读!

如果觉得这篇博客对你有用的话,别忘记三连哦。

我是豌豆射手^,让我们我们下次再见

在这里插入图片描述

在这里插入图片描述

  • 25
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值