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

相关文章

JavaScript中的高级调试方法全攻略指南

《JavaScript中的高级调试方法全攻略指南》什么是高级JavaScript调试技巧,它比console.log有何优势,如何使用断点调试定位问题,通过本文,我们将深入解答这些问题,带您从理论到实... 目录观点与案例结合观点1观点2观点3观点4观点5高级调试技巧详解实战案例断点调试:定位变量错误性能分

从基础到高级详解Python数值格式化输出的完全指南

《从基础到高级详解Python数值格式化输出的完全指南》在数据分析、金融计算和科学报告领域,数值格式化是提升可读性和专业性的关键技术,本文将深入解析Python中数值格式化输出的相关方法,感兴趣的小伙... 目录引言:数值格式化的核心价值一、基础格式化方法1.1 三种核心格式化方式对比1.2 基础格式化示例

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

AOP编程的基本概念与idea编辑器的配合体验过程

《AOP编程的基本概念与idea编辑器的配合体验过程》文章简要介绍了AOP基础概念,包括Before/Around通知、PointCut切入点、Advice通知体、JoinPoint连接点等,说明它们... 目录BeforeAroundAdvise — 通知PointCut — 切入点Acpect — 切面

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

Java集合中的链表与结构详解

《Java集合中的链表与结构详解》链表是一种物理存储结构上非连续的存储结构,数据元素的逻辑顺序的通过链表中的引用链接次序实现,文章对比ArrayList与LinkedList的结构差异,详细讲解了链表... 目录一、链表概念与结构二、当向单链表的实现2.1 准备工作2.2 初始化链表2.3 打印数据、链表长

C#异步编程ConfigureAwait的使用小结

《C#异步编程ConfigureAwait的使用小结》本文介绍了异步编程在GUI和服务器端应用的优势,详细的介绍了async和await的关键作用,通过实例解析了在UI线程正确使用await.Conf... 异步编程是并发的一种形式,它有两大好处:对于面向终端用户的GUI程序,提高了响应能力对于服务器端应

MySQL数据类型与表操作全指南( 从基础到高级实践)

《MySQL数据类型与表操作全指南(从基础到高级实践)》本文详解MySQL数据类型分类(数值、日期/时间、字符串)及表操作(创建、修改、维护),涵盖优化技巧如数据类型选择、备份、分区,强调规范设计与... 目录mysql数据类型详解数值类型日期时间类型字符串类型表操作全解析创建表修改表结构添加列修改列删除列

Python 函数详解:从基础语法到高级使用技巧

《Python函数详解:从基础语法到高级使用技巧》本文基于实例代码,全面讲解Python函数的定义、参数传递、变量作用域及类型标注等知识点,帮助初学者快速掌握函数的使用技巧,感兴趣的朋友跟随小编一起... 目录一、函数的基本概念与作用二、函数的定义与调用1. 无参函数2. 带参函数3. 带返回值的函数4.