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

C++学习(三十四)(C语言部分)之 链表

1、栈和队列 操作 增查改删
重点 插入删除
先进先出 -->队列
先进后出 -->栈
2、链表 写之前先画图
存储数据的方式 通过指针将所有的数据链在一起
数据结构的目的 管理存储数据 方便快速查找使用

链表定义 链式存储的线性表 一对一的关系
结构体 指针 函数 循环

结构体复习:
struct 点运算符(结构体变量) 箭头运算符(结构体指针)
结构体变量.成员 的方式访问成员
字符数组 gets strcpy

链表操作
刚开始只有一个结构体
增 插入一个节点 需要申请内存
删 删除一个节点 需要释放内存

链表 需要插入的时候申请节点 需要删除的时候直接释放节点 会节约内存

静态数组 1.栈区大小 放不了态度数据
2.数组大小不能改变
动态数组 1.如果有一个数据 插入 重新申请内存 所有数据都要移动一次
2.插入删除不便
3.申请大的空间可能会申请失败

链表 有一个数据 申请一个 删除时只需要删除节点 不会影响其他节点
每次一个结构体大小 所以空间比较小 会比较节省内存 申请失败的可能性小
插入和删除比较简单不需要大规模的移动

 

测试的代码笔记如下:

  1 #include<stdio.h>
  2 #include<stdlib.h>
  3 
  4 typedef struct node  //定义结构体
  5 {
  6     //数据  数据域
  7     int data;
  8     //指针  指针域  存放下一个节点的地址
  9     struct node*next;
 10 }NODE, *PNODE;  //别名
 11 //结构体的类型里面不能放数据  变量里面放数据
 12 //PNODE就是struct node*  结构体指针类型  就好比int和int*
 13 
 14 void insert(PNODE head,int data)  //
 15 {
 16     //准备要插入的节点
 17     PNODE p = (PNODE)malloc(sizeof(NODE));
 18     p->data = data;
 19     p->next = NULL;
 20     //开始插入
 21 #if 0    
 22     //头插法  head->A(没有数据)->C->D->NULL 指向要插入的节点B
 23     p->next = head->next;  //B 去保留C的地址
 24     head->next = p;  //A保留的是B的首地址
 25     //head->A(没有数据)->B->C->D->NULL
 26 #else
 27     //尾插法
 28     PNODE temp;
 29     temp = head;  //找到第一个节点的位置
 30     while (temp->next!=NULL)  //判断是不是最后的节点 next是NULL
 31     { 
 32         temp = temp->next;
 33     }
 34     //循环退出之后 temp指向它的最后一个节点
 35     temp->next = p;
 36 
 37 #endif
 38 }
 39 
 40 void findData(PNODE head, int data)  //
 41 {
 42     //查找
 43     PNODE temp = head->next;  //从第二个元素开始
 44     while (temp!=NULL)  //从头到尾一个一个找
 45     {
 46         if (temp->data == data)
 47         {
 48             //数据匹配
 49         }
 50         temp = temp->next;
 51     }
 52     
 53     //PNODE temp = head;
 54     //while (temp->next!=NULL)
 55     //{
 56     //    if (temp->next->data == data)  //temp指向第一个节点
 57     //    {
 58 
 59     //    }
 60     //    temp = temp->next;
 61     //}
 62 }
 63 
 64 void changeNode(PNODE head, int data, int newData)  //
 65 {
 66     //修改
 67     PNODE temp = head->next;  //从第二个元素开始
 68     while (temp != NULL)  //从头到尾一个一个找
 69     {
 70         if (temp->data == data)
 71         {
 72             //数据匹配
 73             temp->data = newData;  //修改数据
 74         }
 75         temp = temp->next;
 76     }
 77 }
 78 
 79 void deleNode(PNODE head, int data)  //
 80 {
 81     //删除
 82     PNODE p = head;
 83     while (p->next!=NULL)
 84     {
 85         if (p->next->data == data)  //下一个节点的data
 86         {
 87             //要删除的节点 p->next
 88             PNODE temp = p->next;
 89             p->next = p->next->next;  //连接成功
 90             free(temp);  //释放掉temp  内存
 91         }
 92     }
 93 }
 94 
 95 void deleAllNode(PNODE head)  //释放所有节点
 96 {
 97     PNODE temp;  //临时的指针作为辅助
 98     while (head != NULL)
 99     {
100         temp = head;
101         head = head->next;
102         free(temp);
103     }
104 }
105 
106 void print(PNODE head)//打印全部节点
107 {
108     PNODE temp = head->next;//从第二个元素开始   打印内容
109     while (temp != NULL)
110     {
111         printf("%d->", temp->data);
112         temp = temp->next;
113     }
114     printf("NULL)");
115 }
116 //链表 所有的节点都在堆区 用一个指针去管理这个链表 每次插入一个数据 重新申请节点
117 //事先申请好空间 数组/动态数组 临时申请
118 
119 int main()
120 {
121     PNODE head;  //指针 结构体类型的指针
122     head = (PNODE)malloc(sizeof(PNODE)); //申请一个空的节点 为了后面的增查改删
123     //第一个节点可以窜数据但是不存 以浪费空间的代价 换取后面操作的简单
124     head->next = NULL;  //表示后面没有其他节点
125     for (int i = 0; i < 10; ++i)
126     {
127         insert(head, i);
128     }
129     print(head);
130     deleAllNode(head);
131 
132     getchar();
133     return 0;
134 }

 

2019-04-01  08:31:37

 

转载于:https://www.cnblogs.com/Yuuki-/p/10634384.html

相关文章:

  • RIpng配置(GNS3)(第九组)
  • halcon预处理函数
  • [博弈论]
  • 一个正在读本科的计院学生
  • 排序算法之快速排序QuickSort
  • CSS中一个冒号和两个冒号有什么区别
  • MSF内网渗透 扫描模块
  • [转帖]安德斯·海尔斯伯格
  • [转帖]Linux分页机制之概述--Linux内存管理(六)
  • Linux的远程连接工具:SSH的安装
  • Spring Reference
  • 【大数据应用技术】作业七|爬取全部的校园新闻
  • leetcode 958. Check Completeness of a Binary Tree 判断是否是完全二叉树 、222. Count Complete Tree Nodes...
  • 力扣——二叉树的层次遍历
  • vue工程 使用滚动组件 vue2-better-scroll 实现上拉加载 下拉刷新
  • @jsonView过滤属性
  • 【React系列】如何构建React应用程序
  • 【跃迁之路】【699天】程序员高效学习方法论探索系列(实验阶段456-2019.1.19)...
  • gf框架之分页模块(五) - 自定义分页
  • java正则表式的使用
  • jQuery(一)
  • Linux下的乱码问题
  • React的组件模式
  • Spark学习笔记之相关记录
  • 从伪并行的 Python 多线程说起
  • 简析gRPC client 连接管理
  • 使用docker-compose进行多节点部署
  • 文本多行溢出显示...之最后一行不到行尾的解决
  • 智能合约Solidity教程-事件和日志(一)
  • scrapy中间件源码分析及常用中间件大全
  • 大数据全解:定义、价值及挑战
  • 扩展资源服务器解决oauth2 性能瓶颈
  • ​​​​​​​​​​​​​​汽车网络信息安全分析方法论
  • ​sqlite3 --- SQLite 数据库 DB-API 2.0 接口模块​
  • #android不同版本废弃api,新api。
  • #多叉树深度遍历_结合深度学习的视频编码方法--帧内预测
  • #前后端分离# 头条发布系统
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • $jQuery 重写Alert样式方法
  • %3cscript放入php,跟bWAPP学WEB安全(PHP代码)--XSS跨站脚本攻击
  • (solr系列:一)使用tomcat部署solr服务
  • (webRTC、RecordRTC):navigator.mediaDevices undefined
  • (笔试题)合法字符串
  • (附表设计)不是我吹!超级全面的权限系统设计方案面世了
  • (附源码)springboot宠物管理系统 毕业设计 121654
  • (附源码)ssm高校实验室 毕业设计 800008
  • (牛客腾讯思维编程题)编码编码分组打印下标题目分析
  • (全注解开发)学习Spring-MVC的第三天
  • (四)Android布局类型(线性布局LinearLayout)
  • (一)认识微服务
  • (原創) 是否该学PetShop将Model和BLL分开? (.NET) (N-Tier) (PetShop) (OO)
  • .equals()到底是什么意思?
  • .NET C#版本和.NET版本以及VS版本的对应关系
  • .NET Core 版本不支持的问题
  • .net 简单实现MD5