【C语言】 链表 超详细解析

article/2025/9/14 12:36:27

目录

一:静态存储和动态存储   

二:存储类别

三:malloc函数

四: free函数

五:内存初始化函数memset

六:calloc函数

七:realloc函数

八:线性表

九:链式存储结构

十:线性表的基本操作

十一:链表的创建和链接

十二:链表的遍历

十三:链表的插入

十四:链表的删除

十五:链表实际应用


一:静态存储和动态存储   

变量从变量值存在的时间(即生存期)角度分:静态存储方式和动态存储方式

静态:在编译时确定了固定的内存地址与内存大小,如:函数里的static局部变量、全局变量等

动态:由程序控制,运行时主动性的向系统申请所需大小的内存段,并且每次分配到的内存地址不固定

在动态存储区存放一下数据:

1、函数形式参数

2、自动变量(未加static声明)

3、函数调用时的现场保护和返回地址

二:存储类别

三:malloc函数

malloc函数 如下

malloc函数示例

四: free函数

free函数 如下

free函数示例

五:内存初始化函数memset

memset函数 如下

memset函数示例

#include <stdio.h>
#include <string.h>
int main( ) 
{ char buffer[] = "This is a test of the memset function"; printf( "Before: %s\n", buffer ); memset( buffer, 0, 4 ); printf( "After: %s\n", buffer ); return 0;
} 

六:calloc函数

calloc函数 如下

calloc函数示例

#include <stdio.h>
#include <stdlib.h> 
void main() {float *calloc1;int i;calloc1 = (float *) calloc(3, sizeof(float));if(calloc1!=NULL) {for(i = 0 ; i < 3 ; i++)printf("\ncalloc1[%d]holds%05.5f",  i,calloc1[i]);free(calloc1);}else {	printf("Not enough memory \n"); 	}
}

七:realloc函数

realloc函数 如下

realloc函数示例

#include<stdio.h>
#include <stdlib.h>
int main(){int *ptr , i;ptr = (int *)calloc(5, sizeof(int));if(ptr ==NULL) return 1;*ptr = 1;*(ptr+1) = 2;ptr[2] = 4;ptr[3] = 8;ptr[4] = 16;ptr = (int *)realloc(ptr,7*sizeof(int));if(ptr == NULL)	return 1;ptr[5] = 32; ptr[6] = 64;for(i = 0;i < 7;i++){printf(“ptr[%d]:%d\n", i, ptr[i]);}realloc(ptr,0); /* free(ptr);*/return 0;
}

八:线性表

线性表 如下

顺序存储结构以及特点

九:链式存储结构

链式存储结构 如下

单链表 如下

单链表状态图 如下

单链表节点数据结构定义 如下

单链表初始化 如下

循环单链表状态图 如下

双向链表状态图 如下

双向循环链表状态图 如下

十:线性表的基本操作

初始化

插入

删除

遍历(即访问每一个元素,如打印所有信息)

查找

排序

十一:链表的创建和链接

十二:链表的遍历

十三:链表的插入

1.插入链表头和链表尾

2.插入中间的位置 

十四:链表的删除

十五:链表实际应用

普通链表设计

通用链表设计

通用链表基本操作

初始化链表

  void *List_Init(void *data)

添加链表节点

  void List_Add(struct list *head,void *data)

获取链表节点个数

  int List_Count(struct list *head)

获取链表某个节点(返回链表节点的data)

  void *List_GetNode(struct list *head,int Index)

  Index---链表节点编号,head---链表头节点

删除链表的某个节点

  int List_Del(struct list *head,int Index)

释放链表

  void List_Free(struct list *head)

通用链表初始化

void *List_Init(void *data)
{struct list * head;head = (struct list *)malloc(sizeof(struct list));head->data=data;head->next=NULL;return head;
}

通用链表添加节点到尾部

void List_Add(struct list *head,void *data)
{struct list *pNode,p1=head;pNode=(struct list *)malloc(sizeof(struct list ));while(p1->next != NULL ){   p1=p1->next; }   //遍历链表,找到最末尾的节点p1->next=pNode;pNode->data=data;pNode->next=NULL;
}

通用链表获取链表节点个数

int  LIST_Count(struct list * head)
{struct list * p1;int nCount = 0;p1=head->next;while(p1 != NULL){nCount++;p1=p1->next;}return nCount;
}

通用链表释放链表

void *List_Free(struct list *head)
{struct list *ptr=head;while(ptr!=NULL){ptr=ptr->next;free(head->data);//先释放数据存储的内存空间free(head);//再释放链表节点的内存空间head=ptr;}return head;
}

通用链表示例    

void test()
{struct list *head;struct staff *people1,*people2;//初始化链表head=List_Init(NULL);//头节点不存储数据,参数为NULLpeople1=(struct staff *)malloc(sizeof(struct staff));people2=(struct staff *)malloc(sizeof(struct staff));people1->iStaffID=1001;strcpy(people1->acName,"张三");strcpy(people1->acPasswd,"123456");people2->iStaffID=1002;strcpy(people2->acName,"李四");strcpy(people2->acPasswd,"123456");//添加链表节点List_Add(head,people1);List_Add(head,people2);//员工信息打印函数Staff_Print(head);
}
//员工信息打印函数
void Staff_Print(struct list *head)
{struct list *p1=head->next;struct staff *people1;while(p1 != NULL){ people1=p2->data;printf("%5d%10s%10s\n",people1->iStaffID,people1->acName,people1->acPasswd);p1=p1->next;}
}

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

相关文章

C语言链表

C语言链表 链表的概念及结构概念结构 链表的分类单链表的实现&#xff08;无头&#xff09;双向链表的实现总结:链表和顺序表的区别 链表的概念及结构 概念 链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表中的指针链接次序实现的…

数据结构——C语言实现链表

目录 一. 链表的概念 二. 单链表的增删查改 1.单链表的定义 2.单链表的头插与头删 3.单链表的尾插与尾删 4.单链表的中间插入删除 5.单链表的查找 三. 带头循环双向链表的增删查改 1.带头循环双向链表的定义 2.带头循环双向链表的头插与头删 3.带头循环双向链表的尾…

C语言之链表详解

目录 一、链表定义 二、链表分类 三、链表操作 四、单向链表 1.链表定义 2.插入操作 3.删除操作 4.修改操作 5.查找操作 五、双向链表 1.链表定义 2.插入操作 3.删除操作 4.修改操作 5.查找操作 一、链表定义 链表是一种基本的数据结构&#xff0c;它由一系列节…

C语言 链表创建及操作

C语言 链表创建及操作 第一部分构建链表&#xff0c;定义结构体&#xff0c;分别用头插法、尾插法实现&#xff0c;这里封装了打印函数&#xff1a;printf();做练习方便后续使用&#xff1b;对链表进行查找&#xff0c;并将查找到的值构建一个新的链表&#xff1b;链表的转置&…

Netty权威指南 读书笔记

文档太大&#xff0c;PDF格式的存档已上传到百度网盘&#xff1a; 链接: https://pan.baidu.com/s/1QnUDWujGOXXCq5iWQBIRJg 提取码: q46s

Netty权威指南(第2版) pdf百度网盘下载

欢迎大家关注我的公众号【老周聊架构】&#xff0c;Java后端主流技术栈的原理、源码分析、架构以及各种互联网高并发、高性能、高可用的解决方案。 链接: https://pan.baidu.com/s/1DfxG9qKU2fshi6ha1a8NkA 提取码: bmt4

Netty权威指南带目录完整版.pdf

2019独角兽企业重金招聘Python工程师标准>>> Netty权威指南带目录完整版.pdf 转载于:https://my.oschina.net/xiaojianyu/blog/3011828

Netty权威指南总结(三)

五、Netty实战技巧&#xff1a; (一) 多线程编程实践&#xff1a; 1. Netty中使用多线程的技巧&#xff1a; 创建两个NioEventLoopGroup&#xff0c;用于逻辑隔离NIO Acceptor和NIO IO线程。 尽量不要在ChannelHandler中启动用户线程&#xff08;解码后用于将POJO消息派发到后端…

Netty权威指南(四)TCP粘包/拆包问题

TCP粘包/拆包问题解决之道 上一章一、介绍1.1 TCP粘包/拆包问题说明1.2 TCP粘包/拆包发生的原因1.3 粘包问题的解决策略 二、未考虑TCP粘包导致的功能异常案例2.1 TimeServerHandler的改造2.2 TimeClientHandler的改造2.3 运行 三、利用LineBasedFrameDecoder解决TCP粘包问题3.…

《Netty权威指南》

《Netty权威指南》 基本信息 作者&#xff1a; 李林锋 出版社&#xff1a;电子工业出版社 ISBN&#xff1a;9787121233432 上架时间&#xff1a;2014-5-29 出版日期&#xff1a;2014 年6月 开本&#xff1a;16开 页码&#xff1a;524 版次&#xff1a;1-1 所属分类&#xff…

Netty权威指南~第一章Java的I/O演进之路

本章内容如下&#xff1a; 5种网络I/O模型的介绍I/O多路复用的介绍 1、I/O基础入门 在Java1.4之前&#xff0c;Java对I/O的支持不完善&#xff0c;开发人员在开发高性能I/O的程序时&#xff0c;会面临以下问题&#xff1a; 没有数据缓冲区&#xff0c;I/O性能存在问题没有C…

Netty权威指南(第2版)

网站 更多书籍点击进入>> CiCi岛 下载 电子版仅供预览及学习交流使用&#xff0c;下载后请24小时内删除&#xff0c;支持正版&#xff0c;喜欢的请购买正版书籍 电子书下载(皮皮云盘-点击“普通下载”)购买正版 封页 编辑推荐 1、Hadoop、Storm、Spark、Facebook、…

Netty权威指南——WebSocket协议开发

一、简介 由于HTTP协议的开销&#xff0c;导致他们不适于用于低延迟应用&#xff0c;为了解决这些问题&#xff0c;WebSocket将网络套接字引入到了客户端和服务端&#xff0c;浏览器和服务器之间可以通过套接字建立持久的连接&#xff0c;双方随时可以互发数据给对方&#xff…

netty权威指南 微云_《Netty权威指南》(二)NIO 入门

2.1 BIO 采用 BIO 通信模型的服务器&#xff0c;通常由一个独立的 Acceptor 线程负责监听客户端的连接&#xff0c;它接收到客户端连接请求之后为每个客户端创建一个新的线程进行处理&#xff0c;处理完成后&#xff0c;通过输出流返回应答给客户端&#xff0c;线程销毁。 grap…

netty 权威指南~第11章——WebSoket协议开发

本章主要学习内容如下&#xff1a; 1、WebSocket入门 2、Netty WebSocket协议开发 第节一&#xff1a;WebSocket入门 WebSocket是HTML5开始提供的一种浏览器与服务器进行全双通信的网络技术&#xff0c;WebSocket通信协议与2011年被IEIF定位标准RFC6455&#xff0c;WebsSock…

Netty权威指南 第2版

https://www.cnblogs.com/plxz/p/9910493.html 第一章  Java的I/O演进之路 1.I/O基础入门 1.Linux网络I/O模型简介 1.阻塞I/O模型&#xff1a;最常用的I/O模型&#xff0c;缺省情况下&#xff0c; 所有文件操作都是阻塞的 2.非阻塞I/O模型&#xff1a;recvform从应用层到内…

Netty权威指南总结(一)

一、为什么选择Netty&#xff1a; API使用简单&#xff0c;开发门槛低&#xff0c;屏蔽了NIO通信的底层细节。 功能强大&#xff0c;预制了很多种编解码功能&#xff0c;支持主流协议。 定制能力强&#xff0c;可以通过ChannelHandler对通信框架进行灵活地拓展。 性能高、成熟、…

Netty权威指南

Chapter1.java I/O演进之路 1.1I/O基础入门 在java 1.4之前&#xff0c;java程序员在开发高性能I/O程序的时候&#xff0c;会面临的问题主要有&#xff1a; 1.没有数据缓冲区&#xff0c;I/O性能存在问题 2.没有c或者c中的Channel概念&#xff0c;只有输入和输出流 3.同步…

三维视觉传感器的类型

三角法测量原理 视觉传感器的坐标系统 单一摄像机二维传感器 点结构光视觉传感器 线结构光视觉传感器 条纹结构光视觉传感器 条纹编码三维视觉传感器 彩色编码视觉传感器 被动双目视觉传感器 编码照明双目视觉传感器

传感器sensor

传感器分类 转换原理 传感器名称 典型应用 转换形式 中间参量 电 参 数 电 阻 移动电位器角点 改变电阻 电位器传感器 位移 改变电阻丝或片尺寸 电阻丝应变传感器、半导体应变传感器 微应变、力、负荷 利用电阻的温度效应 热丝传感器 气流速度、液体流量 电阻…