《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

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

相关文章
|
20天前
|
存储 人工智能 算法
数据结构实验之C 语言的函数数组指针结构体知识
本实验旨在复习C语言中的函数、数组、指针、结构体与共用体等核心概念,并通过具体编程任务加深理解。任务包括输出100以内所有素数、逆序排列一维数组、查找二维数组中的鞍点、利用指针输出二维数组元素,以及使用结构体和共用体处理教师与学生信息。每个任务不仅强化了基本语法的应用,还涉及到了算法逻辑的设计与优化。实验结果显示,学生能够有效掌握并运用这些知识完成指定任务。
43 4
|
1月前
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
62 4
|
2月前
|
存储 编译器 C语言
【c语言】数组
本文介绍了数组的基本概念及一维和二维数组的创建、初始化、使用方法及其在内存中的存储形式。一维数组通过下标访问元素,支持初始化和动态输入输出。二维数组则通过行和列的下标访问元素,同样支持初始化和动态输入输出。此外,还简要介绍了C99标准中的变长数组,允许在运行时根据变量创建数组,但不能初始化。
42 6
|
2月前
|
存储 人工智能 BI
C语言:数组的分类
C语言中的数组分为一维数组、多维数组和字符串数组。一维数组是最基本的形式,用于存储一系列相同类型的元素;多维数组则可以看作是一维数组的数组,常用于矩阵运算等场景;字符串数组则是以字符为元素的一维数组,专门用于处理文本数据。
|
2月前
|
存储 算法 C语言
C语言:什么是指针数组,它有什么用
指针数组是C语言中一种特殊的数据结构,每个元素都是一个指针。它用于存储多个内存地址,方便对多个变量或数组进行操作,常用于字符串处理、动态内存分配等场景。
|
2月前
|
存储 C语言
C语言:一维数组的不初始化、部分初始化、完全初始化的不同点
C语言中一维数组的初始化有三种情况:不初始化时,数组元素的值是随机的;部分初始化时,未指定的元素会被自动赋值为0;完全初始化时,所有元素都被赋予了初始值。
|
2月前
|
存储 数据管理 编译器
揭秘C语言:高效数据管理之数组
揭秘C语言:高效数据管理之数组
|
2月前
|
存储 缓存 C语言
C语言:链表和数组有什么区别
C语言中,链表和数组是两种常用的数据结构。数组是一种线性结构,元素在内存中连续存储,通过下标访问,适合随机访问且大小固定的情况。链表由一系列不连续的节点组成,每个节点存储数据和指向下一个节点的指针,适用于频繁插入和删除操作的场景,链表的大小可以动态变化。
|
2月前
|
C语言 C++
保姆式教学C语言——数组
保姆式教学C语言——数组
19 0
保姆式教学C语言——数组
|
2月前
|
C语言
数组栈的实现(C语言描述)
本文介绍了如何在C语言中使用数组来实现栈的数据结构,包括栈的创建、入栈、出栈、获取栈顶元素、检查栈是否为空、获取栈的大小以及销毁栈等操作,并提供了相应的函数实现。
37 1