《C语言程序入门——链表基础知识》单、双向链表概念、链表与数组优缺点1.1.6

简介: {Type data;}Node;此处的Type data;是数据部分,用于保存该节点的实际数据。是地址部分,保存的是下一个节点的地址。

链表的概念

链表是常见的动态存储分布的数据结构。由若干个同一结构类型的“结点”依次串连而成。

image.gif编辑

链表变量一般用指针head表示,用来存放链表首结点的地址;每个结点由数据部分和下一个结点的地址部分组成,即每个结点都指向下一个结点

(图一单向链表头结点即23)

链表最后一个结点为表尾,其下一个结点的地址部分的值为NULL(表示空地址)(图一圆圈处)

拿到链表的第一个结点,就相当于拿到了整个链表,即只需拿起它的头,整个身也跟着连在一起

struct SinglyListNode {
    int val;
    SinglyListNode *next;
    SinglyListNode(int x) : val(x), next(NULL) {}
};                         //拿起x即可

image.gif

比对数组

1.内存中的存放


数组

一般事先定义好固定长度,在元素个数不确定时会造成内存空间浪费

(例如定义了100个长度,实际个数只有10个,而其他位置都被默认为了0值)


链表

各个结点在内存中可以是不连续存放,具体存放位置由系统分配,长度也可不加限定,根据需要动态开辟内存空间

2.增添元素/结点


数组必定是连续的,当添加或删减某个元素,势必会造成元素移动,当元素过多,想想,上百万的元素挪动,效率极低


链表可自由穿插新结点,节省内存,提高操作效率。

在这里就穿插一个知识点:链表的设计,是针对顺序表的缺陷做出的。顺序表空间不够时需要增容(和数组定义时[i]内存不够差不多)而为了避免频繁增容,基本会扩2倍,可能造成空间浪费

而且在某些位置插入数据,之前的数据就得进行挪动

(有点似曾相识是吧)嗯。。。没错,顺序表和数组都是数据结构

链表分类

类型 方向 状态
单向链表 静态链表
双向链表 动态链表
循环链表
单、双向循环链表

链表基本结构

定义链表:

typedef int Type;
typedef struct Node
{
    Type data;
    struct Node* next;
}Node;

image.gif

此处的Type data;是数据部分,用于保存该节点的实际数据。

struct Node* next;是地址部分,保存的是下一个节点的地址。

#include<stdio.h>
#include<stdlib.h>
typedef int Data;       //定义
typedef struct _Node
{
    Data data;
    struct _Node* next;
}Node;
int main()
{
    Node note1={1};     //数据赋值
    Node note2={2};
    Node note3={3};
    note1.next = &note2;    //连接结点2
    note2.next = &note3;    //连接结点3
    Node* p = &note1;
    for(int i=0;i<3;i++)
    {
        printf("%d\n",p->data);
        p = p->next;
    }
    system("pause");
    return 0;
}

image.gif

双链表

特点:双链表就是在单链表结点上增添了一个指针域,指向当前节点的前驱。相比于单链表,双链表能够从终端结点反向走到开始结点。

typedef struct Data
{
  Type data;//存放数据
  struct Data* next;        //下一个结点
  struct Data* prev;        //下一个结点
}Data;

image.gif

(学的不多,暂时在这里中断一下,等学习到此处时,再把单双向链表和循环链表补齐)

相关文章
|
7月前
|
存储 人工智能 程序员
一文彻底搞明白C语言的数组
本文详细介绍了C语言中的数组,包括定义、初始化(静态与动态)、存储方式、访问方法及常用操作,如遍历、修改元素和作为函数参数传递。数组是C语言中最基本的数据结构之一,掌握它对编程至关重要。下篇将介绍二维数组,敬请期待!
308 0
一文彻底搞明白C语言的数组
|
9月前
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
300 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
8月前
|
存储 编译器 C语言
【C语言程序设计——入门】C语言入门与基础语法(头歌实践教学平台习题)【合集】
本文档介绍了C语言环境配置和编程任务,主要内容包括: - **C语言环境配置**:详细讲解了在Windows系统上配置C语言开发环境的步骤。 - **第1关:程序改错**:包含任务描述、相关知识(如头文件引用、基本语法规则)、编程要求、测试说明及通关代码。 - **第2关:scanf函数**:涉及`scanf`和`printf`函数的格式与使用方法,提供编程要求、测试说明及通关代码。 文档结构清晰,涵盖从环境搭建到具体编程任务的完整流程,适合初学者学习和实践。
168 4
|
8月前
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
220 1
|
9月前
|
存储 算法 C语言
【C语言】深入浅出:C语言链表的全面解析
链表是一种重要的基础数据结构,适用于频繁的插入和删除操作。通过本篇详细讲解了单链表、双向链表和循环链表的概念和实现,以及各类常用操作的示例代码。掌握链表的使用对于理解更复杂的数据结构和算法具有重要意义。
2842 6
|
9月前
|
传感器 算法 安全
【C语言】两个数组比较详解
比较两个数组在C语言中有多种实现方法,选择合适的方法取决于具体的应用场景和性能要求。从逐元素比较到使用`memcmp`函数,再到指针优化,每种方法都有其优点和适用范围。在嵌入式系统中,考虑性能和资源限制尤为重要。通过合理选择和优化,可以有效提高程序的运行效率和可靠性。
645 6
|
10月前
|
存储 缓存 算法
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式
在C语言中,数据结构是构建高效程序的基石。本文探讨了数组、链表、栈、队列、树和图等常见数据结构的特点、应用及实现方式,强调了合理选择数据结构的重要性,并通过案例分析展示了其在实际项目中的应用,旨在帮助读者提升编程能力。
273 5
|
10月前
|
存储 程序员 编译器
C 语言数组与指针的深度剖析与应用
在C语言中,数组与指针是核心概念,二者既独立又紧密相连。数组是在连续内存中存储相同类型数据的结构,而指针则存储内存地址,二者结合可在数据处理、函数传参等方面发挥巨大作用。掌握它们的特性和关系,对于优化程序性能、灵活处理数据结构至关重要。
|
10月前
|
存储 NoSQL 编译器
C 语言中指针数组与数组指针的辨析与应用
在C语言中,指针数组和数组指针是两个容易混淆但用途不同的概念。指针数组是一个数组,其元素是指针类型;而数组指针是指向数组的指针。两者在声明、使用及内存布局上各有特点,正确理解它们有助于更高效地编程。
|
10月前
|
存储 C语言 计算机视觉
在C语言中指针数组和数组指针在动态内存分配中的应用
在C语言中,指针数组和数组指针均可用于动态内存分配。指针数组是数组的每个元素都是指针,可用于指向多个动态分配的内存块;数组指针则指向一个数组,可动态分配和管理大型数据结构。两者结合使用,灵活高效地管理内存。