链表是一种常见的数据结构,用于存储和组织数据。它由一系列节点组成,每个节点包含一个数据元素和一个指向下一个节点的指针。
在本期算法通关村中我主要解答第 1 个问题
C 语言里是如何构造出链表的?
一、C 语言里是如何构造出链表的?
话不多说,先上代码
//定义一个链表结点
struct ListNode {
int val; //代表数据
struct ListNode *next; //代表指针
};
在这串代码中我们可以看到
该结构体中包含了两个成员变量:
val
:表示当前结点所存储的数据。next
:表示指向下一个链表结点的指针。
那这串代码有啥用?
该代码片段的作用是定义了一个链表结点的结构,你可以使用这个结构来创建链表,
进行插入、删除、查找等链表操作。
接下来,我们就来创建链表。
举个算法村里的例子,我们创建一个值为 0 1 2 3 4 的链表
//初始化链表
struct ListNode* initLink() {
int i;
//1、创建头指针,初始时置为NULL,方便后面判断链表是否为空
struct ListNode* p = NULL;
//2、创建头结点,数据域置为0,表示该结点不存储有效数据,且指向空
struct ListNode* temp = (struct ListNode*)malloc(sizeof(struct ListNode));
temp->val = 0;
temp->next = NULL;
//头指针指向头结点,类比于数组的第一个元素
p = temp;
//3、每创建一个结点,都令其直接前驱结点的指针指向它,以形成链表
for (i = 1; i < 5; i++) {
//创建一个结点,数据域为 i
struct ListNode* a = (struct ListNode*)malloc(sizeof(struct ListNode));
a->val = i;
a->next = NULL;
//每次 temp 指向的结点就是 a 的直接前驱结点
temp->next = a;
//temp指向下一个结点(也就是a),为下次添加结点做准备
temp = temp->next;
}
//返回头指针
return p;
}
上面有两个地方用到了 malloc 函数可能一些初学的小伙伴会跟我一样,
不太懂 malloc 函数的作用以及它的语法。
在《大话数据结构》上作者讲的很通俗,原话是这么讲的
在这段算法代码中,我们用到了 C 语言的 malloc 函数,它的作用就是生成一个新的节点,其类型与 ListNode 是一样的,其本质就是在内存中找了一小块空地,准备用来存放数据 val 的 temp 和 a 节点。
总之,流程是这样的
创建头指针->创建头结点->接着用循环来依次创建节点,通过指针将他们连接起来。