C语言——基础链表详解

article/2025/10/5 22:23:36

敢于向黑暗宣战的人,心里必须充满光明。

 


 

一、链表的构成

1.构成

链表是由一连串的结构(称为结点)组成的。

(1)结点的构成:

数据(要储存的数据)+指针(指向下一个结点的指针)

(2)关于几个定义

头结点:链表首结点前的一个结点(不是必须的,但是如果有就可以在解决某些问题时候方便一些,通常可以用来储存链表的长度等信息)

首结点:链表的第一个数据元素

头指针:必须要有的(而头结点可以没有,注意两者一个是指针一个是结点,一个必须有一个可以没有),指向头结点/首节点的指针(永远指向链表的第一个结点)

2.结点类型声明、创建结点

struct node{int value;struct node *next;//创建了一个指向一个node类型的指针,用于指向下一个结点
};
//至此声明了一个结点类型//头指针:
struct node *first = NULL;//结点创建:struct node *new_node;
new_node = (struct node *)malloc(sizeof(struct node));//给结点分配内存单元。注意:malloc返回的是void类型的指针,所以可以强制类型转换一下
new_node -> value = 10;//把数据存储到结点中

二、在链表开始处插入结点

struct node * first = NULL;struct node *new_node;
new_node =(struct node *)malloc(sizeof(struct node));
new_node ->value = 10;//将new_node结点插入链表开始处new_node->next = first;//new_node指向的node类型的next值为NULL,NULL可作为链表结尾(空指针)
first = new_node;//让first 指向 new_node指向的结点(其实就是刚才malloc出来的结点)//ok至此,现在就已经有了一个链表,它有一个结点,结点中储存的值是10new_node = (struct node*)malloc(sizeof(struct node));
new_node ->value = 2;
new_node->next = first;//又新创建了个结点并让next指向第一次创建的结点(因为first是指向第一次创建的结点的)
first = new_node;//可以理解为把头指针重置到头部

我们把它封装成函数

对于这样的函数我们传入一个链表list,和一个希望存入链表的数值n

struct node* add_to_list(struct node *list,int n)
{sturct noed *new_node;new_node = (struct node*)malloc(sizeof(struct node));if(new_node == NULL){printf("malloc error\n");exit(0);}new_node->value = n;new_node->next = list;//把新结点接到链表中return new_node;
}first = add_to_list(first,10);
first = add_to_list(first,20);
//需要注意的是add_to_list函数是没有办法修改指针的(因为这个相当于复制了一个指针传进去,能修改它指向的东西,但是没有办法对他本身进赋值存储)
//所以我们返回一个指向新结点的指针,让他作为返回值赋值储存给first

需要注意的是add_to_list函数是没有办法修改指针的(因为这个相当于复制了一个指针传进去,能修改它指向的东西,但是没有办法对他本身进赋值存储),所以我们返回一个指向新结点的指针,让他作为返回值赋值储存给first

三、搜索链表

while循环可以用,但是我们都知道for循环是很灵活的。这是一张访问链表中结点的习惯方法:

[惯用方法]
for (p = first; p !=NULL; p = p->next)

...

这里可以使用指针变量p来追踪结点,p = p->next 就能实现了让p从一个结点移动到下一个结点

第一种方法:

struct node* search_list(struct node *list,int n)
{struct node *p;for(p = list; p != NULL; p = p->next){if(p -> value == n)return list;}return NULL;}

第二种方法:

struct node *search_list(struct node *list,int n)
{for(;list != NULL;list = list->next){if(list->next == n)return list;}return NULL;
}

这里list是原始链表指针的副本,所以在函数中对他改变是没有损害的

四、从链表中删除结点

步骤:

1.定位要删除的结点(搜索链表)

2.改变前一个结点的指向,从而使链表“绕过”希望删除的结点

3.调用free函数收回期望删除的结点占用的内存空间

一种方法:“追踪指针”法,在搜索链表时总是保留一个指向前一个结点的指针(prev)还有一个指向当前指针的结点(cur)。

如下:(list是带搜索链表,n是要删除的整数)

for(cur = list,prev = NULL;cur != NULL && cur->value != n;prev = cur,cur = cur ->next);
prev->next = cur->next;//条件为假,结束循环,让prev指向cur的下一个结点从而完成“绕过”操作

注意:表达式3是每次循环中最后一次被执行的操作

然后在free掉cur,让prev指向next

封装成函数:

struct node *delete_list(struct node *list,int n){struct node *prev,*cur;for(cur = list,prev = NULL;cur != NULL && cur->value != n;prev = cur,cur = cur->next);//这个for循环只是为了找到希望删除的结点即value等于n的结点if(cur == NULL)//找到了最后也没找到要删除的结点,不用删除,返回listreturn list;if(prev == NULL)//条件为假,未执行for循环,即首结点为n,直接让list指向下一个结点来绕过即可list = list->next;//对于删除链表中的首结点是一种特殊情况,需要特殊判断特殊绕过他。elseprev->next = cur->next;//绕过要删除的结点free(cur);//释放掉被删除的结点的内存return list;
}

 


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

相关文章

C语言数据结构——链表

目录 前言 一、什么是链表 1.1链表的结构和概念 1.2 链表的分类 二、无头单向非循环链表 2.1 创建结构体 2.2 动态申请一个节点 2.3 单链表打印 2.4 单链表尾插/尾删 2.4.1 单链表尾插 2.4.2 单链表尾删 2.5 单链表头插/头删 2.5.1 头插 2.5.2 头删 2.6 单链表查…

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

文章目录 前言一、什么是线性表?二、顺序表:三、链表:四、顺序表和链表对比:总结 前言 线性表是实际中广泛应用的重要数据结构,本文用通俗易懂的方法讲解它。 一、什么是线性表? 首先,我们了解…

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…