c语言链表示例

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

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

链表都有一个头指针,一般以head来表示,存放的是一个地址。链表中的节点分为两类,头结点和一般节点,头结点是没有数据域的。链表中每个节点都分为两部分,一个数据域,一个是指针域。

说到这里你应该就明白了,链表就如同车链子一样,head指向第一个元素:第一个元素又指向第二个元素;……,直到最后一个元素,该元素不再指向其它元素,它称为“表尾”,它的地址部分放一个“NULL”(表示“空地址”),链表到此结束。


创建链表:

typedef struct Node
{int data;struct Node *next;
} Node;//创建链表
void createLink(Node *head, int size)
{Node *rear = head;int i;for (i = 0; i < size; ++i){Node *newnode = (Node *)malloc(sizeof(Node));newnode->next = NULL;scanf("%d", &newnode->data);rear->next = newnode;rear = newnode;}
}int mian()
{Node *head = (Node *)malloc(sizeof(Node));head->next = NULL;createLink(head, 10); //创建链表}

删除链表节点:

void delet(Node *head, int n)
{Node *in;int i = 0;while (i < n && head != NULL){in = head;head = head->next;i++;}if (head != NULL){in->next = head->next;free(head);}else{puts("节点不存在");}
}

插入链表节点:

void insertLink(Node *head, int n)
{int i = 0;while (i < n && head != NULL){head = head->next;i++;}if (head != NULL){Node *newnode = (Node *)malloc(sizeof(Node));printf("输入要插入的值:");scanf("%d", &newnode->data);newnode->next = head->next; head->next = newnode;       }else{printf("节点不存在");}
}


 

示例代码:

//链表创建、头插、尾插、删除、翻转、删除相同元素、遍历、判断链表是否为空
#include <stdio.h>
#include <stdlib.h>
typedef struct Node
{int data;struct Node *next;
} Node;//创建链表
void createLink(Node *head, int size)
{Node *rear = head;int i;for (i = 0; i < size; ++i){Node *newnode = (Node *)malloc(sizeof(Node));newnode->next = NULL;scanf("%d", &newnode->data);rear->next = newnode;rear = newnode;}
}
//遍历链表
void travelLink(Node *head)
{Node *p = head->next;while (p != NULL){printf("%d\t", p->data);p = p->next;}putchar('\n');
}
//头插法
void insertForward(Node *head, int data)
{Node *newnode = (Node *)malloc(sizeof(Node));newnode->next = NULL;newnode->data = data;newnode->next = head->next;head->next = newnode;
}
//尾插法
void insertBack(Node *head, int data)
{Node *newnode = (Node *)malloc(sizeof(Node));newnode->next = NULL;newnode->data = data;Node *p = head;while (p->next != NULL){p = p->next;}p->next = newnode;p = newnode;
}//在第N个元素后插入元素
void insertLink(Node *head, int n)
{int i = 0;while (i < n && head != NULL){head = head->next;i++;}if (head != NULL){Node *newnode = (Node *)malloc(sizeof(Node));printf("输入要插入的值:");scanf("%d", &newnode->data);newnode->next = head->next; //填充newnode节点的指针域,也就是说把in的指针域指向newnode的下一个节点head->next = newnode;       //填充t节点的指针域,把t的指针域重新指向in}else{printf("节点不存在");}
}//删除相同元素
void deleteSame(Node *head)
{Node *curr = head->next;while (curr != NULL){Node *pre = curr;Node *p = curr->next;while (p != NULL){//若有相同的元素,则删除;否则两个指针继续向下走if (curr->data == p->data){pre->next = p->next;free(p);p = pre->next;}else{pre = pre->next;p = p->next;}}curr = curr->next;}
}//删除第N个元素
void delet(Node *head, int n)
{Node *in;int i = 0;while (i < n && head != NULL){in = head;head = head->next;i++;}if (head != NULL){in->next = head->next;free(head);}else{puts("节点不存在");}
}//翻转链表
void reverseLink(Node *head)
{Node *curr;Node *pre = NULL;while (head->next != NULL){curr = head->next;head->next = curr->next;curr->next = pre;pre = curr;}head->next = pre;
}
//删除链表
void deleteLink(Node *head)
{Node *curr;while (head->next != NULL){curr = head->next;head->next = curr->next;free(curr);}
}
//判断链表是否为空
void isEmpty(Node *head)
{if (head->next == NULL){printf("链表为空!\n");}else{printf("链表不为空!\n");}
}int main()
{//主函数中不能指定一个头指针,应该定义一个头指针指向头结点Node *head = (Node *)malloc(sizeof(Node));head->next = NULL;printf("输入元素:\n");createLink(head, 10); //创建链表printf("遍历链表:");travelLink(head); //遍历链表printf("头插法:");insertForward(head, 100); //头插法travelLink(head);         //遍历链表printf("尾插法:");insertBack(head, 200); //尾插法travelLink(head);      //遍历链表printf("删除相同元素:");deleteSame(head); //删除相同元素travelLink(head); //遍历链表printf("删除第5个元素:");delet(head, 5);travelLink(head); //遍历链表printf("在第3个元素后插入元素,");insertLink(head, 3); //插入元素travelLink(head);    //遍历链表printf("翻转链表元素:");reverseLink(head); //翻转链表元素travelLink(head);  //遍历链表printf("删除链表:");deleteLink(head); //删除链表isEmpty(head);    //判断链表是否为空return 0;
}

测试结果:

 

参考文章:c语言链表详解(超详细)_Mr.Gzj的博客-CSDN博客_链表c语言


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

相关文章

反转链表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…

syslog 和 rsyslog

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