C语言链表详解(通俗易懂)

article/2025/10/5 22:11:14

文章目录

  • 前言
  • 一、什么是线性表?
  • 二、顺序表:
  • 三、链表:
  • 四、顺序表和链表对比:
  • 总结


前言

线性表是实际中广泛应用的重要数据结构,本文用通俗易懂的方法讲解它。


一、什么是线性表?

首先,我们了解下“线性表”的基本概念:

  • 全名为“线性存储结构”,使用线性表存储数据的方式可以这样理解,即“把所有数据用一根线儿串起来,再存储到物理空间中”。
  • 是n个具有相同特性的数据元素的有限序列。线性表是一种在实际中广泛使用的数据结构,常见的线性表有:顺序表、链表、队列…

二、顺序表:

顺序表是用一段物理地址连续的存储单元依次存储数据元素的线性结构,一般情况下采用数组存储。在数组上完成数据的增删查改。
在这里插入图片描述
顺序表一般可以分为:

  1. 静态顺序表:使用定长数组存储数据。
    在这里插入图片描述

  2. 动态顺序表:使用动态开辟的数组存储。
    在这里插入图片描述

扩容方法:动态开辟一块新的空间(一般为原空间的两倍),将原空间的数据拷贝到新的空间,然后让array指针指向新的空间并且释放旧空间。

对比以上两者:

区别:

  • 静态顺序表和动态顺序表唯一不同的是,静态顺序表在创建顺序表的时候容量已经确定,不可以更改,而动态顺序表的容量是由malloc函数动态开辟,当容量不够用时可以增加容量capacity。

优缺点:

  • 静态顺序表创建空间时为静态开辟,不用malloc函数,代码相对简单(一点点),不存在内存泄露问题。
  • 动态顺序表,动态开辟空间,使用相对灵活,相比于静态开辟空间也可以少空间浪费。

动态顺序表代码演示:初始化、插入数据和检查容量

//初始化顺序表
void SeqList_Init(SeqList* ps)
{SLDataType* tmp = (SLDataType*)malloc(5 * sizeof(SLDataType));if (tmp == NULL){perror(malloc);exit(-1);}ps->arr = tmp;ps->size = 0;ps->capacity = 5;
}
//检查容量
void Check_Capacity(SeqList* ps)
{assert(ps);if (ps->size == ps->capacity){SLDataType* tmp = (SLDataType*)realloc(ps->arr, 2*ps->capacity* sizeof(SLDataType));if (tmp == NULL){perror(realloc);exit(-1);}ps->arr = tmp;ps->capacity = 2 * ps->capacity;printf("扩容成功\n");}
}
//插入数据
void SeqList_Insert(SeqList* ps, SLDataType pos)
{assert(ps);Check_Capacity(ps);//检查容量SLDataType num = 0;printf("请输入需要写入的值:>");scanf("%d", &num);if (ps->size == 0 || pos == ps->size){ps->arr[pos] = num;}	SLDataType end = ps->size - 1;while (end >= pos){ps->arr[end + 1] = ps->arr[end];end--;}ps->arr[pos] = num;ps->size++;
}
//头部插入数据
void SeqList_PushFront(SeqList* ps)
{SeqList_Insert(ps, 0);
}
//尾部插入数据
void SeqList_PushBack(SeqList* ps)
{SeqList_Insert(ps, ps->size);
}

三、链表:

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

下图为单链表的逻辑结构类型:
在这里插入图片描述
注意:

  1. 链式结构在逻辑上是连续的,但在物理上不一定连续
  2. 现实中结点一般都是在堆上申请出来的
  3. 从堆上申请的空间,是按照一定的策略来分配的,两次申请的空间可连续,也可能不连续

链表的分类

实际中链表的结构非常多样,以下情况组合起来就有8种链表结构:

  1. 单向或者双向:

在这里插入图片描述

  1. 带头和不带头:
    在这里插入图片描述

  2. 循环和不循环:
    在这里插入图片描述
    经过以上三种可以有2^3=8种类型。

虽然有这么多的链表的结构,但是我们实际中最常用还是两种结构:

  • 无头单向链表和带头双向循环链表:
    在这里插入图片描述

这边通过单链表头部和尾部插入数据代码帮大家理解过程:

//创建结点
SListNode* BuySListNode(SLTDataType x)
{SListNode* newnode = (SListNode*)malloc(sizeof(SListNode));assert(newnode);newnode->data = x;newnode->next = NULL;return newnode;
}
//头插数据
void SListPushFront(SListNode** pphead, SLTDataType x)
{SListNode* newnode = BuySListNode(x);//读取新建的结点newnode->next = *pphead;*pphead = newnode;
}
//尾插数据
void SListPushBack(SListNode** pphead, SLTDataType x)
{SListNode* newnode = BuySListNode(x);//读取新建的结点if (*pphead == NULL){*pphead = newnode;return;}SListNode* tail = *pphead;while (tail->next != NULL){tail = tail->next;}tail->next = newnode;
}

四、顺序表和链表对比:

不同点顺序表链表
存储空间上物理上一定连续逻辑上连续,但物理上不一定连续
随机访问支持不支持
任意位置插入或删除元素可能搬移元素,效率低只需修改指针指向
插入动态顺序表,空间不够需要扩容没有容量概念
应用场景元素高效存储+频繁访问任意位置插入和删除
缓存利用率

总结

以上就是今天要讲的顺序表和链表的内容啦,如果本篇博客对你有所帮助的话,请给博主一个三连哦!


http://chatgpt.dhexx.cn/article/vM547kIf.shtml

相关文章

C语言——链表

C语言——链表 链表是一种基础的数据结构类型,一种能够动态维护数据的线性数据表。链表的数据以结点形式存储信息,并通过结点之间的指针实现结点之间的衔接。 为什么要用链表? 链表和数组类似,但是功能比数组强大得多&#xff0c…

在?您的rsyslog日志管理手册到了,请查收

rsyslog日志管理和logrotate日志存储轮转 前言: 系统日志是记录服务器系统运行和软件运行状况的记录程序,如果系统和软件在运行中出错,我们就可以在日志中获取到问题发生时的记录,并以此寻求解决问题的方法。 一.rsyslog 系统日…

日志审计与分析实验三(rsyslog服务器端和客户端配置)(Linux日志收集)

文章目录 Linux日志收集一、实验目的:1、掌握rsyslog配置方法2、配置rsyslog服务收集其他Linux服务器日志: 二、实验步骤:1、前期配置2. rsyslog的三种传输协议1、udp传输方式2、tcp传输方式3、relp传输方式 Linux日志收集 一、实验目的: 1…

Linux系统之rsyslog配置

目录 Rsyslog简介 Linux配置rsyslog 配置实验: 实验环境: 实验步骤: 实验准备: 针对UDP: 针对TCP: 针对RELP: 结果验证: 1、UDP: 2、TCP: 3、RE…

rSyslog日志

日志服务管理 系统日志管理 系统日志介绍 日志的作用: 软件的运行记录软件运行排错运行分析 日志记录的内容包括: 历史事件:时间,地点,人物,事件日志级别:事件的关键性程度,Lo…

Linux rsyslog详细介绍

转自:http://llei623.blog.163.com/blog/static/852075042010111482731766/ 作者:llei WEB服务器多的时候检查日志是一件痛苦的事情,用 perl 脚本登录到服务器上grep一些错误信息两次之后就觉得是纯体力活,想办法偷懒。 准备弄…

Linux系统日志rsyslogd

Linux系统日志rsyslogd Linux系统日志 Linux上使用rsyslogd守护进程接收用户进程输出的日志和接收内核日志。 用户进程是通过syslogd函数生成系统日志。该函数将日志输出到一个UNIX本地域socket类型(AF_UNIX)的文件/dev/log中,rsyslogd则监听该文件以…

Linux之 rsyslog、日志轮转

1.rsyslog 1.1rsyslog介绍 Rsyslog的全称是 rocket-fast system for log,它提供了高性能,高安全功能和模块化设计。rsyslog能够接受从各种各样的来源,将其输入,输出的结果到不同的目的地。rsyslog可以提供超过每秒一百万条消息给…

rsyslog日志服务简介

1、简介 rsyslog是一个linux系统日志服务的工具,主要用来监控收集系统从开机运行之后所发生的所有日志,包括内核日志,服务日志,应用日志等等;记录的日志全部都写到/var/log下面,常用的有dmsg(内…

Linux 日志管理 Rsyslog Loganalyzer

Syslog常被称为系统日志或系统记录,是一种用来在互联网协议(TCP/IP)的网上中传递记录档消息的标准。这个词汇常用来指涉实际的syslog 协议,或者那些提交syslog消息的应用程序或数据库。 syslog协议属于一种主从式协议&#xff1a…

建立 rsyslog 日志服务器

文章目录 1. rsyslog 介绍2. 实验目的3. 实验环境4. 配置服务端5. 配置客户端6. 在服务端验证效果 1. rsyslog 介绍 rsyslog 是一个快速处理收集系统日志的开源程序,提供了高性能、安全功能和模块化设计。rsyslog 是 syslog 的升级版,它将多种来源输入输…

rsyslog配置

rsyslog配置文件详解: #### MODULES #### #定义日志的模块。 $ModLoad imuxsock #imuxsock为模块名,支持本地系统日志的模块。 $ModLoad imjournal #imjournal为模块名,支持对系统日志的访问。 #$ModLo…

syslog 和 rsyslog

1. 介绍 rsyslog可以简单的理解为syslog的超集,在老版本的Linux系统中,Red Hat Enterprise Linux 3/4/5默认是使用的syslog作为系统的日志工具,从RHEL 6 开始系统默认使用了rsyslog。 其特性包括: 支持输出日志到各种数据库&…

rsyslog日志服务详解

rsyslog日志服务详解 原文出处:http://blog.51cto.com/6638225/1862902 内容: 1、rsyslog日志服务简介 2、rsyslog的配置详解 3、实现日志服务器收集日志及last、lastb、dmseg命令的使用 4、实现日志存储在mysql中 一、rsyslog日志服务简介 ​ 日…

【Linux】rsyslog日志服务(配置,测试、日志转储)

一、rsyslog简介 Rsyslog的全称是 rocket-fast system for log ,可用于接受来自各种来源的输入,转换 它们,并将结果输出到不同的目的地。 它提供了高性能、强大的安全功能和模块化设计。虽然rsyslog最初是一个常规的系 统日志,但它已经发展…

Linux原生日志系统Rsyslog详解

一、概述 Rsyslog 是一个 syslogd 的多线程增强版,依然基于Syslog协议(linux6之前默认使用syslog程序,centos6用rsyslog所取代)完成系统日志的处理转发,官方形容它是一个极速(如火箭般快速)的日…

N皇后问题-回溯法-C语言

关于对N皇后问题和回溯法的理解 个人非常推荐下面这个视频:算法与数据结构,回溯法求解八皇后,最经典的递归问题_哔哩哔哩_bilibili八皇后问题是计算机科学中最为经典的问题之一,该问题由国际西洋棋棋手马克斯贝瑟尔于1848年提出。…

Java——N皇后问题

题目链接 leetcode在线oj题——N皇后 题目描述 按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff…

N 皇后问题

n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上,并且使皇后彼此之间不能相互攻击。 给你一个整数 n ,返回所有不同的 n 皇后问题 的解决方案。 每一种解法包含一个不同的 n 皇后问题 的棋子放置方案,该方案中 Q 和 . 分别代表了皇后和…

N皇后问题(C++)

n−皇后问题是指将 n 个皇后放在 nn 的国际象棋棋盘上,使得皇后不能相互攻击到,即任意两个皇后都不能处于同一行、同一列或同一斜线上。 现在给定整数 n,请你输出所有的满足条件的棋子摆法。 输入格式 共一行,包含整数 n。 输出…