当前位置: 首页 > news >正文

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;
}

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 回顾MVC
  • 关于 Vue/React 的 cli 中运用 webpack 打包的原理简单解析
  • 网络安全售前入门02——产品了解
  • es相关概念、索引操作(相当于mysql中的数据库操作)
  • 致远OA OCR票据识别组件
  • 手算神经网络MAC和FLOP
  • pve(‌Proxmox Virtual Environment)-修改时区
  • 模型 7S分析法(麦肯锡)
  • 线程同步方式
  • Pytorch封装简单RNN模型,进行中文训练及文本预测
  • Python 爬虫爬取豆瓣电影列表信息,爬虫的原理,应用领域介绍学习
  • 回归预测|基于北方苍鹰优化核极限学习机的数据预测Matlab程序NGO-KELM 多特征输入单输出
  • 强大的 solidity 框架:Foundry 之命令行工具 — Cast
  • php-fpm 如何查看哪个正在执行死循环 并终止
  • Redis 的 主从复制
  • 03Go 类型总结
  • C语言笔记(第一章:C语言编程)
  • eclipse(luna)创建web工程
  • emacs初体验
  • Java 实战开发之spring、logback配置及chrome开发神器(六)
  • JavaScript 事件——“事件类型”中“HTML5事件”的注意要点
  • JavaScript设计模式与开发实践系列之策略模式
  • Java面向对象及其三大特征
  • JAVA之继承和多态
  • miaov-React 最佳入门
  • Vue ES6 Jade Scss Webpack Gulp
  • 给github项目添加CI badge
  • 扫描识别控件Dynamic Web TWAIN v12.2发布,改进SSL证书
  • 删除表内多余的重复数据
  • 专访Pony.ai 楼天城:自动驾驶已经走过了“从0到1”,“规模”是行业的分水岭| 自动驾驶这十年 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • ​十个常见的 Python 脚本 (详细介绍 + 代码举例)
  • #etcd#安装时出错
  • (01)ORB-SLAM2源码无死角解析-(56) 闭环线程→计算Sim3:理论推导(1)求解s,t
  • (2024.6.23)最新版MAVEN的安装和配置教程(超详细)
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (带教程)商业版SEO关键词按天计费系统:关键词排名优化、代理服务、手机自适应及搭建教程
  • (附源码)spring boot北京冬奥会志愿者报名系统 毕业设计 150947
  • (附源码)springboot家庭装修管理系统 毕业设计 613205
  • (附源码)计算机毕业设计SSM疫情社区管理系统
  • (附源码)计算机毕业设计SSM在线影视购票系统
  • (接上一篇)前端弄一个变量实现点击次数在前端页面实时更新
  • (三)docker:Dockerfile构建容器运行jar包
  • (四十一)大数据实战——spark的yarn模式生产环境部署
  • (源码分析)springsecurity认证授权
  • (转)创业家杂志:UCWEB天使第一步
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • (轉貼) 蒼井そら挑戰筋肉擂台 (Misc)
  • (自适应手机端)响应式新闻博客知识类pbootcms网站模板 自媒体运营博客网站源码下载
  • ***原理与防范
  • .NET CF命令行调试器MDbg入门(三) 进程控制
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net 怎么循环得到数组里的值_关于js数组
  • .NET 自定义中间件 判断是否存在 AllowAnonymousAttribute 特性 来判断是否需要身份验证
  • .NET高级面试指南专题十一【 设计模式介绍,为什么要用设计模式】