用c语言写链表

article/2025/10/5 6:46:42

        链表是数据结构的一种,是其他三个数据结构栈,树,图的基础,只有将链表这一数据结构弄懂,才能理解其他三种数据结构。

        举一个例子,老师让你设计一个联系人系统,其中包括姓名,电话号,住址,对于联系人系统中可以进行插入删除修改等基本操作,那么你将如何设计。

一.首先需要了解单链表

        单链表是链表这一数据的基础,单链表顾名思义就是将各种信息如姓名电话号住址像小盒子一样封装起来,再用链条将每个小盒子串到一块,只不过这个链条是单向的,只能从前面的盒子到后面的盒子,这样就形成了单链表。但我们学会单链表以后,其他的链表也就易如反掌了。

二.单链表的c语言定义

        从单链表的定义中来看,需要用struct结构体将单链表封装起来,结构体就相当于上面说的小盒子,包含有各种信息以及一个结构体指针。这个指针就相当于上面说的单向的链子,指向下一个小盒子,那么我们就可以很简单的实现定义。

         我们习惯叫这个小盒子为结点,单向的链子为指针。

        其中Node,为这个结构体的名字,LinkList为这个结构体的头结点,即第一个盒子,也就是整个链表开始的地方。因为我们需要用一个结构体指针来确保函数中对于一个链表的插入删除等操作可以成功实现,毕竟如果没有指针的话,在函数中的操作结果是不会影响外界的。同时对于不同链表的操作不会弄混,因为我们给一个链表起的名字不一样。

三.单链表的初始化

        对于一个单链表的初始化来说非常简单,我们采用头指针的方法,利用malloc()函数申请出空间,将其next单向链指向NULL即完成了对于单链表头结点的初始化。头结点的作用是方便对链表的各种操作。

 四.输入链表的元素

1.头插法

        头插法顾名思义就是将新来的元素从头结点处插入到链表中,具体插入方法如下图。

        s为一个新盒子,先将新盒子的单向链指向头结点单向链指向的盒子,再将头结点单向链指向这个新盒子,以此类推,将全部元素以这样的方法放入链表中,就形成了一个完整的链表。具体代码如下图:

        其中L为头指针,s为分配出的新结点空间 ,让c的数据储存在s的空间中,将这个新空间与链表链接起来,即完成了对于链表的创建。

         

2.尾插法

        尾插法与头插法相似,作用都是将元素插入到链表中,不同之处在于尾插法是将新的元素从尾部插入到链表中,具体插入方法如图。

         如图所示,其中s为一个新盒子,直接让该链表的尾部与这个新盒子用单向链子链接起来,这样以此类推,将所有元素插入就完成了对于链表的创建。具体代码如下。

        如图,其中rear为Node*类型,其始终指向该链表的尾部,保证后续元素顺利的插入到链表中。

五.元素的插入与删除

1.元素的插入

        在链表的操作中,需要把某个元素插入到链表的第i个位置中去,这时候就需要进行元素的插入。与头插法相似,代码如下图。

        其中p为新的盒子用来储存插入进去的元素, malloc为申请空间的函数。其中while循环为寻找第i - 1个盒子的位置,将s指向第i - 1个盒子。利用头插法将新盒子p插入到链表中,实现对于元素的插入。

2.元素的删除

        元素的删除相较于元素的插入还是相对简单的,仅仅需要找到第i个盒子,将第i - 1个盒子的单向链链到i + 1个盒子,再将第i个盒子的空间释放即可。具体代码如下。

                其中while循环为寻找第i - 1个盒子,用s指向它,然后让p指向第i个盒子,将s的单向链指向p的下一个盒子,最后将p释放即可完成对于元素的删除。

六.元素的输出

       在实际调试过程中,需要一步步将链表上的元素打印出来,以检测是否代码正确。实际代码如下。

        其中s为指向头结点的指针,一步步让指针指向下一个盒子,输出其中的元素,直到下一个盒子为空,这样就完成了对于链表的输出。

七.单链表的拓展

1.循环链表

        循环链表是单链表的延申,也是让程序员更加便于运用链表所诞生出来的链表。循环链表顾名思义就是将该链表的最后一个结点的单向链子指向了头结点,从而形成了一个循环。循环链表的初始化如下。

s -> next = s;

             这样该链表的指针L就指向了最后一个盒子,其中头结点为L的单向链子指的那个盒子,了解完循环链表的远离之后。其他的各种算法就可以很方便的实现了。

2.双向链表 

        双向链表就是在单向链的基础上加一个反方向的单向链,相当于相邻两个盒子是相通的可以互相到达的。对于双向链表的代码定义如下。

         其中prior为指向前一个的盒子的结点,与next的操作相似,需要进行初始化。循环链表增加了对于前一个盒子的可访问性,这样就能很容易的完成单向链表的某些操作。

八.其他

        链表是四大数据结构的基础,栈、树、图都需要以链表为基础进行编写,所以学好单链表是非常重要的。

#include<stdio.h>
#include<stdlib.h>/*@author Lifan@function 链表的实现*/ typedef struct Node{char data;            //各种信息 struct Node *next;    //指针指向下一个结点 
}Node, *LinkList;/*-----------函数声明---------------*/
void InitList(LinkList &L);            //初始化链表 
void CreateFromHead(LinkList &L);      //头插法插入数据 
void PrintList(LinkList &L);           //打印数组 
void CreateFromRear(LinkList &L);      //尾插法插入数据 
Node *FindElement(LinkList &L, char c); //查找元素 
int FindListLength(LinkList &L);        //求链表长度 
void InsertListElem(LinkList &L, int i, char c); //把元素c插入到第i个位置上 
void DeleteListElem(LinkList &L, int i, char &c); //将第i个位置的元素删除,保存在c中
/*----------------------------------*/ 
int main()
{LinkList L;InitList(L);//CreateFromHead(L);       //头插法 CreateFromRear(L);       //尾插法 PrintList(L);
/*******元素c是否在链表中************/
//	Node *r;
//	r = FindElement(L, 'c');
//	if(r != NULL) printf("%c", r -> data);/*******元素c是否在链表中************/
//	printf("length:%d", FindListLength(L));/*********将元素插入**********/
//	InsertListElem(L, 5, 's');
//	PrintList(L);/*********将元素删除**********/
//	char ch;
//	DeleteListElem(L, 5, ch);
//	PrintList(L);
//	printf("ch:%c", ch);return 0;
}void InitList(LinkList &L)
{L = (LinkList)malloc(sizeof(Node));L -> next = NULL;
}void CreateFromHead(LinkList &L)
{Node *s;char c;bool isEnd = true;while(isEnd){c = getchar();if(c != '.'){s = (Node *)malloc(sizeof(Node));s -> next = L -> next;L -> next = s;s -> data = c;}else isEnd = false;}
}void CreateFromRear(LinkList &L)
{Node *s, *rear;rear = L;char c;bool isEnd = true;while(isEnd){c = getchar();if(c != '.'){s = (Node *)malloc(sizeof(Node));s -> data = c;rear -> next = s;rear = s;}else {rear -> next = NULL;isEnd = false;}}
}void PrintList(LinkList &L)
{Node *s;s = L;while(s -> next != NULL){s = s -> next;printf("%c", s -> data);}printf("\n");
}Node *FindElement(LinkList &L, char c)
{Node *s;int i = 0;s = L -> next;while(s != NULL){if(s -> data != c) s = s -> next;else {return s;break; }i++;}return NULL;
}int FindListLength(LinkList &L)
{int length;Node *s;s = L -> next;while(s != NULL){length++;s = s -> next;}return length;
}void InsertListElem(LinkList &L, int i, char c)
{Node *s, *p;int j = 1;s = L -> next;p = (Node *)malloc(sizeof(Node));if(p == NULL) printf("空间请求错误!!!");else while(s != NULL && j < i - 1) {j++;s = s -> next;}p -> next = s -> next;s -> next = p;p -> data = c; }void DeleteListElem(LinkList &L, int i, char &c)
{Node *s, *p;int j = 1;s = L -> next;while(s != NULL && j < i - 1){j++;s = s -> next;}p = s -> next;c = p -> data;s -> next = p -> next;free(p); 
}


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

相关文章

C语言链表超详解

✅作者简介&#xff1a;嵌入式入坑者&#xff0c;与大家一起加油&#xff0c;希望文章能够帮助各位&#xff01;&#xff01;&#xff01;&#xff01; &#x1f4c3;个人主页&#xff1a;rivencode的个人主页 &#x1f525;系列专栏&#xff1a;玩转数据结构 &#x1f4ac;保持…

C语言——链表简单介绍

一、链表的引入 我们至少可以通过两种结构存储数据。 数组&#xff1a;数组是一个固定长度的存储相同数据类型的数据结构&#xff0c;数组中的元素被存储在一段连续的内存空间中。 优点&#xff1a;存取速度快。 缺点&#xff1a;需要一个连续的很大的内存&#xff1b; 插入和…

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…