链表基础内容笔记

本文深入讲解了链表的概念,包括链表结点的构成,如何创建静态链表和动态链表,以及如何遍历动态单链表。同时,介绍了动态内存分配函数malloc的使用,并给出了创建带头结点动态链表的完整代码示例。文章还涵盖了链表的遍历方法以及内存释放的重要性。
摘要由CSDN通过智能技术生成

一、链表的概念

1.链表是什么?

链表是C语言中一种独特的数据结构,就是将若干个结构体变量,通过指针连接起来构成的数据结构

2.结点是什么?

链表中的结构体变量称为链表的结点

3.链表结点由什么构成?

在链表中既要存储数据,也要存储下一个结点的地址,因此链表结点通常由数据域和指针域组成

最简单的链表结点,只包含一个数据域和一个指针域

创建一个包含3个结点的简单链表,每个结点只包含一个整型数据成员和一个指针成员

首先定义一个链表结点结构体:

创建一个包含3个结点的简单链表,每个结点只包含一个整型数据成员和一个指针成员

首先定义一个链表结点结构体。

解释:指针域next的类型是struct node*(指向struct node类型的指针类型),因为next

要指向下一个结点(struct node类型)

4.有了链表结点,如何构成链表呢?

访问链表时总是从第一个结点开始顺序访问,因此需要定义一个专门的指针,用于指向

链表的第一个结点,并称之为头指针。


在上述程序中,我们采用定义变量(静态内存分配)的方式创建链表结点。这种链表称为静态链表

但是一般情况我们选择动态


二、关于动态内存的知识补充

1.动态内存分配函数malloc

#include<stdlib.h>//头文件

原型:

功能:

申请分配长度为n字节的连续内存,若成功返回分配内存的首地址,若失败,返回NULL

为了提高通用性,我们可以用sizeof运算符求出内存长度,例如:sizeof(int)

2.如何申请分配一个整型数据的内存?

malloc(sizeof(int));实现

找到动态分配的内存区

这个强转其实是没必要的,因为void*与所有的其他指针类型都是赋值兼容的。

一定要使用free释放内存


三、创建一个动态链表

因为链表是顺序访问,对链表来说只能从第一个结点开始依次访问

因此,需要将其第一个结点的地址保存起来。

如何保存第一个结点的地址呢?

分两种情况

情况1

不带头结点的链表

如果将第一个结点的地址存储到一个专门的指针变量中,那么这种链表称为不带头结点

的链表,这个专门的指针称为头指针。

情况2

带头头结点的链表

如果将第一个结点的地址存储到一个专门的结点的指针域中,那么这种链表称为带头结点的链表。

这个专门的结点称为头结点,头结点的数据域中不存储任何有效数据。

创建一个带头结点的动态链表

编写一个函数,创建一个带头结点的动态链表,用于存储从键盘输入的一批学生的高考总分(以任意负

数作为结束标志),并以链表的头指针作为函数的返回值。最后在主函数中调用该函数。

1.首先定义结点结构体类型
2.创建一个新的链表(主要包括两个步骤:创建新结点;将新结点连接到链表中的当前末结点之后)

故:需定义三个指针变量

头指针head

末结点p

新结点指针q

3.动态创建一个新结点,并使头指针指向头结点
4.使末结点指针p指向头结点(相当于空链表的末结点)
5.输入一个成绩并暂存,若是负数则将末结点的指针域赋值为空指针NULL,作为链表的结束标志。
6.动态创建一个新结点,并使q指向它,将已输入的数据存入新结点的数据域中。
7.将新节点连接到链表中,使得当前末结点的指针域指向新结点。
8.调整末结点指针,使其指向新节点
9.转向第五步(循环)
10.将末结点的指针域赋值为空指针NULL,作为链表的结束标志。

动态链表创建的完整可运行代码如下:

四、遍历一个动态单链表

带头结点的单向链表的遍历步骤:

  1. 通过头指针找到头结点

  1. 若头结点的指针域为NULL,则为空链表

  1. 否则,跟踪链表结点的指针域,找到下一个结点并输出其数据域的值

  1. 直到遇到链表的结束标志为止

例题:

现在有一个单向链表,要求编写一个函数,输出每个链表结点中数据域的值。最后在主函数中调用该函数

要遍历,我们需要创建一个动态单链表creat()函数创建;然后我们遍历链表print()函数遍历

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Is_Qinna

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值