《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

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

相关文章
|
安全 编译器 C语言
C++入门1——从C语言到C++的过渡
C++入门1——从C语言到C++的过渡
368 2
|
存储 NoSQL 编译器
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
指针是一个变量,它存储另一个变量的内存地址。换句话说,指针“指向”存储在内存中的某个数据。
590 7
【C语言】指针的神秘探险:从入门到精通的奇幻之旅 !
|
存储 编译器 C语言
【C语言程序设计——入门】C语言入门与基础语法(头歌实践教学平台习题)【合集】
本文档介绍了C语言环境配置和编程任务,主要内容包括: - **C语言环境配置**:详细讲解了在Windows系统上配置C语言开发环境的步骤。 - **第1关:程序改错**:包含任务描述、相关知识(如头文件引用、基本语法规则)、编程要求、测试说明及通关代码。 - **第2关:scanf函数**:涉及`scanf`和`printf`函数的格式与使用方法,提供编程要求、测试说明及通关代码。 文档结构清晰,涵盖从环境搭建到具体编程任务的完整流程,适合初学者学习和实践。
546 4
|
C语言
【C语言程序设计——入门】基本数据类型与表达式(头歌实践教学平台习题)【合集】
这份文档详细介绍了编程任务的多个关卡,涵盖C语言的基础知识和应用。主要内容包括: 1. **目录**:列出所有关卡,如`print函数操作`、`转义字符使用`、`数的向上取整`等。 2. **各关卡的任务描述**:明确每关的具体编程任务,例如使用`printf`函数输出特定字符串、实现向上取整功能等。 3. **相关知识**:提供完成任务所需的背景知识,如格式化输出、算术运算符、关系运算符等。 4. **编程要求**:给出具体的代码编写提示。 5. **测试说明**:包含预期输入输出,帮助验证程序正确性。 6. 文档通过逐步引导学习者掌握C语言的基本语法和常用函数,适合初学者练习编程技能。
459 1
|
存储 C语言
【数据结构】手把手教你单链表(c语言)(附源码)
本文介绍了单链表的基本概念、结构定义及其实现方法。单链表是一种内存地址不连续但逻辑顺序连续的数据结构,每个节点包含数据域和指针域。文章详细讲解了单链表的常见操作,如头插、尾插、头删、尾删、查找、指定位置插入和删除等,并提供了完整的C语言代码示例。通过学习单链表,可以更好地理解数据结构的底层逻辑,提高编程能力。
1815 4
C语言------程设设计入门
这篇文章是C语言程序设计的入门教程,涵盖了C程序的实现过程、VC集成开发环境的使用、基本数据类型的使用、格式控制字符的作用,以及通过示例代码演示了如何使用printf()函数输出不同类型的数据。
C语言------程设设计入门
|
C语言
无头链表再封装方式实现 (C语言描述)
如何在C语言中实现无头链表的再封装,包括创建节点和链表、插入和删除操作、查找和打印链表以及销毁链表的函数。
198 0
|
测试技术 C语言
单链表之无头链表(C语言版)
本文详细介绍了使用C语言实现无头单链表的方法,包括节点和链表结构的定义、链表的创建与销毁、节点的插入与删除,以及链表的打印等功能。文章通过具体的代码示例,展示了如何在无头链表中进行头插法、尾插法、自定义位置插入和删除,以及如何清空和销毁链表。
496 0
单链表之无头链表(C语言版)
|
存储 Java 编译器
初识C语言1——C语言入门介绍
初识C语言1——C语言入门介绍
310 1
|
存储 Java C语言
【C语言入门】初识C语言:掌握编程的基石
【C语言入门】初识C语言:掌握编程的基石
【C语言入门】初识C语言:掌握编程的基石