C语言——链表简单介绍

article/2025/10/5 19:39:31

 一、链表的引入

我们至少可以通过两种结构存储数据。

       数组:数组是一个固定长度的存储相同数据类型的数据结构,数组中的元素被存储在一段连续的内存空间中。

             优点:存取速度快。

             缺点:需要一个连续的很大的内存;

                                 插入和删除元素效率很低。

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

              优点:插入和删除元素效率高;

                        不需要一个连续很大的内存。

              缺点:查找某位置元素效率低。

二.链式存储结构——链表

        链表是一种常见的采用动态存储分配方式的数据结构。在链表中,每一个元素包含两个部分:数据部分(数据域)和指针部分(指针域)。数据部分用来存放元素所包含的数据,指针部分用来指向下一个元素。最后一个元素的指针指向NULL,表指向的地址为空。

                                                     链表结构示意图

1、链表相关专有名词

              首节点:存放第一个有效数据的节点。

              尾节点:存放最后一个有效数据的节点。

              头结点:头结点是首节点前的节点,头结点并不存放数据;

                            头结点的数据类型和首节点的数据类型一模一样;

                            头结点的设置是为了方便链表的使用。

             头指针:存放头结点地址的指针变量。

2、确定一个链表需要一个参数

             头指针    (可以通过头指针推算出链表其他所有的参数)

3、链表的分类

  1. 单链表
  2. 双向链表
  3. 循环链表
  4. 非循环链表

<1>单链表   

       在链表中,每个结点只有一个指针,所有的结点都是单线联系,除末尾结点指针为外,每个结点都指向下一个结点,一环扣一环形成一条线性链,称此链表为单向链表或简称为单链表。

                                             单链表结构示意图    

 <2>双向链表

        双向链表中的每个节点有两个链接:一个指向前一个节点,当此节点为第一个节点时,指向空值;而另一个指向下一个节点,当此节点为最后一个节点时,指向空值。所以,在这里一个节点包括了三部分,前驱、数据、后驱。

                                                   双向链表示意图

 <3>循环链表

        循环链表是一种头尾相接的链表。表中的最后一个结点的指针域指向头结点,整个链表形成环状结构。循环链表来源于单链表,所以结构与单链表相似。

<4> 非循环链表

三、链表的初始化、插入、删除、创建以及查询

1、链表的初始化(以单链表为例)

             单链表的初始化就是创建一个头结点,头结点的数据域可以不使用,头结点的指针域为空,表示空单链表。

/*单链表初始化*/
LinkList InitList()
{LinkList head;                     /*定义头指针变量*/head=(Node*)malloc(sizeof(Node));  /*头指针指向分配的头结点内存空间*/head->next=NULL;                   /*头结点的指针域为空*/return head;                       /*返回头结点的地址,即头指针*/
}

2、链表的插入

        链表的插入操作可以在链表头指针位置进行插入,也可以在链表中某个结点的位置进行插入,或者在链表的最后面添加结点。虽然有三种插入操作,但是操作的思想是一样的。

                                               单链表插入操作

/*单链表的插入操作*/
void Insert(LinkList head,int i)
{Node *p=head,*s;int j=0;while(j<i-1 && p)                       //找到第i-1个结点的地址p{p=p->next;j++;}if(p){s=(Node*)malloc(sizeof(Node));    //定义s指向新分配的空间scanf("%s",s->name);scanf("%d",&s->number);s->next=p->next;                  //新结点指向原来的第i个结点p->next=s;                        //新结点成为新链表的第i个结点}
}

      在该程序中,首先从链表的头结点开始,找到第i-1个结点的地址p。如果该结点存在,则可以在第i-1个结点后插入第i个结点。为插入的新结点分配内,然后向新结点输入数据。插入时,首先将新结点的指针s指向原来的第i个结点(s->next=p->next),然后将第i-1个结点指向新结点(p->next=s),这样就完成了插入结点的操作。

  3.链表的删除

        Delete函数中有两个参数,其中head表示链表的头指针,pos表示要删除结点在链表中的位置。定义整型变量j来控制循环的次数,然后定义指针变量p表示该结点之前的结点。接着利用循环找到要删掉结点之前的结点p,如果该结点存在并且待删除结点存在,则将指针变量q指向待删除结点(q=p->next),再连接要删除结点两边的结点(p->next=q->next),并使用free函数将q指向的内存空间进行释放。

                                            单链表删除操作

/*单链表的删除操作*/
void Delete(LinkList head,int pos)
{Node *p=head,*q;int j=0;while(j<pos-1 && p)          //通过循环,找到第pos-1个结点的地址{p=p->next;j++;}if(p==NULL || p->next==NULL)   //第pos个结点不存在printf("the pos is ERROR!");else{q=p->next;                //q指向第pos个结点p->next=q->next;          //连接删除结点两边的结点free(q);                  //释放要删除结点的内存空间}
}

<4>链表的创建

         创建链表前需要先创建结构体作为节点和头指针:

/*单链表的创建*/
typedef struct Node  //typedef方法函数可以对于struct Node进行重命名
{char name[20];int number;struct Node *next;}LNode,*LinkList;  //定义一个结构体指针方便后续的操作

<5>链表的查询

         Search函数有两个参数,其中head表示链表的头指针,name表示要查找的值。定义指针变量p,使其从首元结点开始到链表结束。如果某结点的成员和给定不等,则继续查找下一个结点(p=p->next)。如果查找成功,则返回结点的地址值;若查找失败,则打印提示信息,并返回NULL。

/*单链表的查询*/
Node *Search(LinkList head,char name[])   //在单链表head中找到值为name的结点
{Node *p=head->next;while(p){if(strcmp(p->name,name)!=0)p=p->next;elsebreak;                          //查找成功}if(p==NULL)printf("没有找到值为%s的结点!",name);return p;
}

 这里对单链表的插入等操作都是以创建一个链表表示班级,其中结点表示学生。   

四、小结               

       链表的操作很多以上仅为部分简单操作,其他内容可通过查找资料等进行学习。希望大家共同学习进步,不足之处望指出。


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

相关文章

c语言链表示例

链表是一种常见的基础数据结构&#xff0c;结构体指针在这里得到了充分的利用。链表可以动态的进行存储分配&#xff0c;也就是说&#xff0c;链表是一个功能极为强大的数组&#xff0c;他可以在节点中定义多种数据类型&#xff0c;还可以根据需要随意增添&#xff0c;删除&…

反转链表c语言

反转链表 初始化三个指针 循环执行 temp cur→next cur→next pre pre cur ; cur temp 对于单链表&#xff0c;所有操作都是从头指针开始 // An highlighted block struct ListNode* ReverseList(struct ListNode* pHead ) {// 三指针法struct ListNode* pre pHead;s…

链表C语言实现--单向链表

线性结构的链式存储也称为链表&#xff0c;相比于顺序表&#xff0c;链表能够解决顺序表中空间资源浪费问题以及空间不足的问题。链表的每一个结点包含数据域和指针域&#xff0c;而每一个结点在内存中的地址是不连续的&#xff0c;且能适应动态变化。在数据插入和数据删除操作…

循环链表C语言实现

本文介绍循环链表中的单向循环链表&#xff0c;双向循环链表两种 第一种&#xff1a;单向循环链表&#xff0c;是在单向链表的基础上&#xff0c;尾结点不再指向NULL&#xff0c;而是指向头结点从而构成循环。如下图&#xff1a; 所以相比单向链表最大的特点就是可以从尾快速循…

C语言基础入门:链表详解篇

链表概述 链表是一种常见的重要的数据结构。它是动态地进行存储分配的一种结构。它可以根据需要开辟内存单元。链表有一个“头指针”变量&#xff0c;以head表示&#xff0c;它存放一个地址。该地址指向一个元素。链表中每一个元素称为“结点”&#xff0c;每个结点都应包括两个…

C语言——基础链表详解

敢于向黑暗宣战的人&#xff0c;心里必须充满光明。 一、链表的构成 1.构成 链表是由一连串的结构&#xff08;称为结点&#xff09;组成的。 (1)结点的构成&#xff1a; 数据&#xff08;要储存的数据&#xff09;指针&#xff08;指向下一个结点的指针&#xff09; (2)关…

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语言链表详解(通俗易懂)

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

C语言——链表

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

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

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

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

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

Linux系统之rsyslog配置

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

rSyslog日志

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

Linux rsyslog详细介绍

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

Linux系统日志rsyslogd

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

Linux之 rsyslog、日志轮转

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

rsyslog日志服务简介

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

Linux 日志管理 Rsyslog Loganalyzer

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

建立 rsyslog 日志服务器

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

rsyslog配置

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