C高级编程 第九天(链表)

2024-08-27 08:52
文章标签 链表 编程 高级 第九天

本文主要是介绍C高级编程 第九天(链表),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.数组

2.链表

3.链表的分类

3.1静态链表(栈)

3.2 动态链表(堆)

3.3单向链表、双向链表、单向循环链表、双向循环链表

4.带头节点的链表

5.链表的操作

①初始化链表

②插入节点

③删除节点

④释放链表

⑤销毁链表


1.数组

优点:

  • 访问速度快;
  • 每个元素占用空间少。

缺点:

  • 一旦分配内存,不可以动态扩展;
  • 分配过多内存,会造成资源浪费;
  • 头部插入,删除效率低。

2.链表

struct LinkNode
{int num;struct LinkNode* next;
}

结点是由数据域指针域构成的

3.链表的分类

3.1静态链表(栈)

//静态链表,在栈上
void test_staticLinkNode()
{//声明好每个节点struct LinkNode node1 = { 10,NULL };struct LinkNode node2 = { 20,NULL };struct LinkNode node3 = { 30,NULL };struct LinkNode node4 = { 40,NULL };struct LinkNode node5 = { 50,NULL };//建立节点之间的关系node1.next = &node2;node2.next = &node3;node3.next = &node4;node4.next = &node5;node5.next = NULL;//链表的首节点struct LinkNode* begin = &node1;//遍历链表while (begin != NULL){printf("%d\n", begin->num);begin = begin->next;}
}

3.2 动态链表(堆)

//动态链表在堆上
void test_dynamicLinkNode()
{//创建节点struct LinkNode* node1 = malloc(sizeof(struct LinkNode));struct LinkNode* node2 = malloc(sizeof(struct LinkNode));struct LinkNode* node3 = malloc(sizeof(struct LinkNode));struct LinkNode* node4 = malloc(sizeof(struct LinkNode));struct LinkNode* node5 = malloc(sizeof(struct LinkNode));//给节点赋值,并创建关系node1->num = 10;node1->next = node2;node2->num = 20;node2->next = node3;node3->num = 30;node3->next = node4;node4->num = 40;node4->next = node5;node5->num = 50;node5->next = NULL;//链表的首节点struct LinkNode* begin = node1;//遍历链表while (begin != NULL){printf("%d\n", begin->num);begin = begin->next;}
}

3.3单向链表、双向链表、单向循环链表、双向循环链表

4.带头节点的链表

头节点只维护指针域,不维护数据域

5.链表的操作

①初始化链表
void initLinkList()
{//头节点struct LinkNode* pheader = malloc(sizeof(struct LinkNode));//尾节点struct LinkNode* ptail = malloc(sizeof(struct LinkNode));pheader->num = -1;pheader->next = NULL;ptail = pheader;while (1){int number = -1;scanf("%d", &number);if (-1 == number){//以-1作为结束标志break;}struct LinkNode* node = malloc(sizeof(struct LinkNode));node->num = number;node->next = NULL;//尾结点向后移动ptail->next = node;ptail = node;}
}
②插入节点
//在oldValue后插入newVal
void insert_LinkList2(struct LinkNode* pHeader, int oldValue, int newVal)
{if (NULL == pHeader){return;}struct LinkNode* pPrev = pHeader;struct LinkNode* pCurrent = pHeader->next;while (pCurrent != NULL){if (pCurrent->num == oldValue){break;}//两个辅助指针向后移动pPrev = pCurrent;pCurrent = pCurrent->next;}struct LinkNode* newNode = malloc(sizeof(struct LinkNode));newNode->num = newVal;newNode->next = NULL;newNode->next = pCurrent;pPrev->next = newNode;
}
③删除节点
void delete_LinkList(struct LinkNode* pHeader, int delue)
{while (NULL != pHeader){//要删除节点的前置节点struct LinkNode* pPrev = pHeader;//要删除的当前节点struct LinkNode* pCurrent = pHeader->next;if (NULL != pCurrent){if (delue == pCurrent->num){pPrev->next = pCurrent->next;}//两个辅助指针向后移动pPrev = pCurrent;pCurrent = pCurrent->next;}else{printf("没有找到要删除的节点");}}return;
}
④释放链表
void clear_LinkList(struct LinkNode* pHeader)
{while (NULL == pHeader){return;}struct LinkNode* node = pHeader->next;if (NULL != node){//先记录下一个节点的位置struct LinkNode* nodeNew = node->next;//释放当前节点free(node);//当前节点向后移动node = nodeNew;}pHeader->next = NULL;free(pHeader);
}
⑤销毁链表
void destroy_LinkList(struct LinkNode* pHeader)
{if (NULL == pHeader){return;}clear_LinkList(pHeader);free(pHeader);pHeader = NULL;
}

这篇关于C高级编程 第九天(链表)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1111210

相关文章

Python中你不知道的gzip高级用法分享

《Python中你不知道的gzip高级用法分享》在当今大数据时代,数据存储和传输成本已成为每个开发者必须考虑的问题,Python内置的gzip模块提供了一种简单高效的解决方案,下面小编就来和大家详细讲... 目录前言:为什么数据压缩如此重要1. gzip 模块基础介绍2. 基本压缩与解压缩操作2.1 压缩文

Go语言数据库编程GORM 的基本使用详解

《Go语言数据库编程GORM的基本使用详解》GORM是Go语言流行的ORM框架,封装database/sql,支持自动迁移、关联、事务等,提供CRUD、条件查询、钩子函数、日志等功能,简化数据库操作... 目录一、安装与初始化1. 安装 GORM 及数据库驱动2. 建立数据库连接二、定义模型结构体三、自动迁

Java中的for循环高级用法

《Java中的for循环高级用法》本文系统解析Java中传统、增强型for循环、StreamAPI及并行流的实现原理与性能差异,并通过大量代码示例展示实际开发中的最佳实践,感兴趣的朋友一起看看吧... 目录前言一、基础篇:传统for循环1.1 标准语法结构1.2 典型应用场景二、进阶篇:增强型for循环2.

C++链表的虚拟头节点实现细节及注意事项

《C++链表的虚拟头节点实现细节及注意事项》虚拟头节点是链表操作中极为实用的设计技巧,它通过在链表真实头部前添加一个特殊节点,有效简化边界条件处理,:本文主要介绍C++链表的虚拟头节点实现细节及注... 目录C++链表虚拟头节点(Dummy Head)一、虚拟头节点的本质与核心作用1. 定义2. 核心价值二

使用Python进行GRPC和Dubbo协议的高级测试

《使用Python进行GRPC和Dubbo协议的高级测试》GRPC(GoogleRemoteProcedureCall)是一种高性能、开源的远程过程调用(RPC)框架,Dubbo是一种高性能的分布式服... 目录01 GRPC测试安装gRPC编写.proto文件实现服务02 Dubbo测试1. 安装Dubb

Linux链表操作方式

《Linux链表操作方式》:本文主要介绍Linux链表操作方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、链表基础概念与内核链表优势二、内核链表结构与宏解析三、内核链表的优点四、用户态链表示例五、双向循环链表在内核中的实现优势六、典型应用场景七、调试技巧与

Apache 高级配置实战之从连接保持到日志分析的完整指南

《Apache高级配置实战之从连接保持到日志分析的完整指南》本文带你从连接保持优化开始,一路走到访问控制和日志管理,最后用AWStats来分析网站数据,对Apache配置日志分析相关知识感兴趣的朋友... 目录Apache 高级配置实战:从连接保持到日志分析的完整指南前言 一、Apache 连接保持 - 性

mysql中的group by高级用法详解

《mysql中的groupby高级用法详解》MySQL中的GROUPBY是数据聚合分析的核心功能,主要用于将结果集按指定列分组,并结合聚合函数进行统计计算,本文给大家介绍mysql中的groupby... 目录一、基本语法与核心功能二、基础用法示例1. 单列分组统计2. 多列组合分组3. 与WHERE结合使

PyTorch高级特性与性能优化方式

《PyTorch高级特性与性能优化方式》:本文主要介绍PyTorch高级特性与性能优化方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、自动化机制1.自动微分机制2.动态计算图二、性能优化1.内存管理2.GPU加速3.多GPU训练三、分布式训练1.分布式数据

Spring Boot集成SLF4j从基础到高级实践(最新推荐)

《SpringBoot集成SLF4j从基础到高级实践(最新推荐)》SLF4j(SimpleLoggingFacadeforJava)是一个日志门面(Facade),不是具体的日志实现,这篇文章主要介... 目录一、日志框架概述与SLF4j简介1.1 为什么需要日志框架1.2 主流日志框架对比1.3 SLF4