初识链表(掌握链表的原理并用代码实现,附完整代码)

一.前言

  本篇博客将带大家走进链表的世界,首先理解链表的概念及结构然后在此基础上了解链表是如何实现的,最后能够独立编写代码来完成链表各功能的实现,那么开始我们的学习吧。

二.链表的概念及结构

概念:链表是一种物理存储结构上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链次序实现的 。

看概念有些同学可能会有些懵,那么我们来举一个例子,链表的结构跟火车车厢相类似,每节车厢都是独立存在的,我们对应到链表就可以画图演示一下

链表里的每节车厢都是独立申请下来的空间,我们称之为“节点/结点”

结点的组成主要有两个部分:当前结点要保存的数据和保存下一个结点的地址(指针变量)。链表中每个结点都是独立申请的(即需要插入数据时才去申请一块结点的空间),我们需要通过指针变量来保存下一个结点位置才能从当前节点找到下一个结点。

结合之前学的结构体知识我们就可以总结出每个结点对应的结构体代码:

假设当前保存的节点为整形

//定义节点的结构
struct SListNode {
	int data;//存储数据
	struct SListNode* next;//指向下一个节点的指针
};

 当我们想要保存一个整形数据时,实际上是向操作系统申请了一块内存,这个内存不仅要保存整形数据,也需要保存下一个结点的地址,当我们想要从第一个节点走到最后一个节点时,只需在前一个节点拿上下一个结点的地址就可以了。

三.链表的分类

实际中链表的结构非常多样,以下情况组合起来就有 8 种链表结构:
  1. 单向或者双向
2. 带头或者不带头
3. 循环或者非循环
今天我们主要来详谈单链表,因为单链表弊端比较多,相应的题也比较多,需要更好的去研究,对于平时的应用双向链表就有很多优势了,今天我们先不谈

四.链表的实现及代码编写

上面我们已经了解了结点是如何创立的,那么现在就跟着我一步步来实现单链表代码的编写

首先我们要创建SList.h  SList.c  test.c三个文件

上面我们已经实现了节点的结构体定义,那么我们来实现几个结点的打印,验证一下我们的代码是否正确,首先我们需要把我们的头文件编写好

#pragma once
#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
//定义节点的结构
typedef int SLTDataType;

typedef struct SListNode {
	SLTDataType data;//存储数据
	struct SListNode* next;//指向下一个节点的指针
}SLTNode;
void SLTPrint(SLTNode* phead);

 然后在我们的.c文件中通过#include " SList.h "调用我们定义的头文件

现在我们来编写一下我们打印函数的代码

void SLTPrint(SLTNode* phead)
{
	SLTNode* pcur = phead;
	while (pcur)
	{
		printf("%d->", pcur->data);
		pcur = pcur->next;
	}
	printf("NULL\n");
}

打印链表的实现简单理解就是将存入链表中的数据逐步打印出来,但我们就要考虑到第一个数据是否为空的情况,以及链表中一个节点next指针存储的是下一个节点的地址,考虑到这些因素,代码编写起来就相对容易很多了。

现在我们就可以想办法在test.c中来实现函数调用以及主函数的编写了,我们先附上完整代码

#define _CRT_SECURE_NO_WARNINGS
#include "SList.h"
void SListTest01()
{
	//创建节点
	SLTNode* node1 = (SLTNode*)malloc(sizeof(SLTNode));
	node1->data = 1;
	
	SLTNode* node2 = (SLTNode*)malloc(sizeof(SLTNode));
	node2->data = 2;

	SLTNode* node3 = (SLTNode*)malloc(sizeof(SLTNode));
	node3->data = 3;

	SLTNode* node4 = (SLTNode*)malloc(sizeof(SLTNode));
	node4->data = 4;
	//连结四个节点
	node1->next = node2;
	node2->next = node3;
	node3->next = node4;
	node4->next = NULL;

	//调用链表打印
	SLTNode* plist = node1;
	SLTPrint(plist);
}
int main()
{
	SListTest01();
	return 0;
}

 创建节点我们用到了malloc(动态内存开辟),这里我们不多赘述,C语言中有专门的内容讲过动态内存管理的知识,创建四个节点并存入数据,紧接着我们要将四个节点连接起来,这里就要理解我们前面所讲的链表的结构,然后给我们node1结点给到plist指针,这样调用函数传参时不会影响到原本的命名,最后在主函数中调用一下我们的测试板块SListTest01()看一下测试结果

显然我们成功了!但上面这是手动创建链表的方式,下一篇文章我将带大家实现链表的增删查改及各功能。

五.结语

链表的学习能够促进我们对C语言的理解,归根到底这只是一种算法的思想,在某些问题的解决上应用链表高效快捷的解决,学无止境,关注我,我会持续分享我在编程学习过程中的知识点,下一篇文章我将带大家通过做一些单链表的经典例题来深入学习单链表。

评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值