(C/C++学习)18.C语言双向链表
说明:数组提供了连续内存空间的访问和使用,而链表是对内存零碎空间的有效组织和使用。链表又分为单向链表和双向链表,单向链表仅提供了链表的单方向访问,相比之下,双向链表则显得十分方便。
一.单向链表的节点
如下代码所示,双向链表的节点包含两个指向关系和一个数据空间,两个指向分别连接该节点的上一个和下一个节点,数据类型可以是一个结构体类型,也可以是其他类型。
1 typedef struct node
2 {
3 int data;
4 struct node *pre;
5 struct node *next;
6 }Node;
二.双向链表的创建
头插法和尾插法只看代码比较难以与理解,建议画出插入节点时的链表变化图则会非常容易理解,另外,个人认为头插法较优,因为其插入逻辑一步到位,不像尾插法还需在后面完成双向链表的环状连接。
1.头插法
1 Node * creatList()
2 {
3 Node * head = (Node*)malloc(sizeof(Node));
4 Node * cur = NULL;
5 head->next = head;
6 head->pre = head;
7 int data;
8 scanf("%d",&data);
9 while(data)
10 {
11 cur = (Node*)malloc(sizeof(Node));
12 cur->data = data;
13 cur->next = head->next;
14 cur->pre = head;
15 head->next = cur;
16 cur->next->pre = cur;
17 scanf("%d",&data);
18 }
19 return head;
20 }
2.尾插法
1 Node * creatList()
2 {
3 Node * head = (Node*)malloc(sizeof(Node));
4 Node * phead = head;
5 Node * cur = NULL;
6 phead->next = NULL;
7 phead->pre = NULL;
8 int data;
9 scanf("%d",&data);
10 while(data)
11 {
12 cur = (Node*)malloc(sizeof(Node));
13 cur->data = data;
14 phead->next = cur;
15 cur->pre = phead;
16 phead = cur;
17 scanf("%d",&data);
18 }
19 //完成回环
20 cur->next = head;
21 head->pre = cur;
22 return head;
23 }
三.双向链表的元素插入(头插法)
插入方法:先让插入的节点有所指向,再考虑指向它的指针,具体插入如下:
1 void insertList(Node * head)
2 {
3 printf("intsert new node:");
4 int data;
5 scanf("%d",&data);
6 Node * cur;
7 cur = (Node*)malloc(sizeof(Node));
8 cur->data = data;
9 cur->next = head->next;
10 cur->pre = head;
11 head->next = cur;
12 cur->next->pre = cur;
13 }
四.双向链表的查找
既然是双向链表,其查找方式也应该是是双向查找,比起单向链表的单向查找,双向查找同时从两个方向进行查找,加快了查找的速度。
1 Node * searchList(Node * head,int find)
2 {
3 Node * pClock = head->next;
4 Node * pAntiClock = head->pre;
5 while (pAntiClock != pClock->pre)
6 {
7 if(pClock->data == find)
8 return pClock;
9 if(pAntiClock->data == find)
10 return pAntiClock;
11 if(pClock == pAntiClock)
12 return NULL;
13 pClock = pClock->next;
14 pAntiClock = pAntiClock->pre;
15 }
16 return NULL;
17 }
五.删除某个节点
1 void deleteList(Node * pfind)
2 {
3 if(pfind == NULL)
4 return;
5 else
6 {
7 pfind->pre->next = pfind->next;
8 pfind->next->pre = pfind->pre;
9 free(pfind);
10 }
11 }
六.链表排序(按值排序)
1 void sortList(Node * head,int n)
2 {
3 Node * p,*q;
4 for(int i=0; i<n-1; i++)
5 {
6 p = head->next;
7 q = p->next;
8 for(int j=0; j<n-1-i; j++)
9 {
10 if(p->data > q->data)
11 {
12 p->data = p->data ^ q->data;
13 q->data = p->data ^ q->data;
14 p->data = p->data ^ q->data;
15 }
16 p = p->next;
17 q = q->next;
18 }
19 }
20 }
七.链表的销毁
1 void destroyList(Node * head)
2 {
3 head->pre->next = NULL;
4 Node * pre = head;
5 while(head != NULL)
6 {
7 head = head->next;
8 free(pre);
9 pre = head;
10 }
11 }
说明:链表的操作还有如求长度、打印以及交换指针排序等,由于相对较为简单,此处就不再例举。重要提醒:链表的某些操作较难理解,最好画图加以辅助理解。
(C/C++学习)18.C语言双向链表的更多相关文章
- GO学习-(18) Go语言基础之并发
Go语言基础之并发 并发是编程里面一个非常重要的概念,Go语言在语言层面天生支持并发,这也是Go语言流行的一个很重要的原因. Go语言中的并发编程 并发与并行 并发:同一时间段内执行多个任务(你在用微 ...
- c语言学习书籍推荐《C语言学习路线图•C语言必须知道的300个问题》下载
下载地址:点我 <C语言学习路线图•C语言必须知道的300个问题>以基础知识为框架,介绍了c语言各部分知识所对应的常见开发疑难问题,并作了透彻地解析.<C语言学习路线图•C语言必须知 ...
- GO学习-(19) Go语言基础之网络编程
Go语言基础之网络编程 现在我们几乎每天都在使用互联网,我们前面已经学习了如何编写Go语言程序,但是如何才能让我们的程序通过网络互相通信呢?本章我们就一起来学习下Go语言中的网络编程. 关于网络编程其 ...
- 值得学习的C语言开源项目
值得学习的C语言开源项目 - 1. Webbench Webbench是一个在linux下使用的非常简单的网站压测工具.它使用fork()模拟多个客户端同时访问我们设定的URL,测试网站在压力下工 ...
- [java学习笔记]java语言核心----面向对象之this关键字
一.this关键字 体现:当成员变量和函数的局部变量重名时,可以使用this关键字来区别:在构造函数中调用其它构造函数 原理: 代表的是当前对象. this就是所在函数 ...
- [java学习笔记]java语言核心----面向对象之构造函数
1.构造函数概念 特点: 函数名与类名相同 不用定义返回值类型 没有具体的返回值 作用: 给对象进行初始化 注意: 默认构造函数 多个构造函数是以重载出现的 一个类中如果 ...
- Java学习笔记:语言基础
Java学习笔记:语言基础 2014-1-31 最近开始学习Java,目的倒不在于想深入的掌握Java开发,而是想了解Java的基本语法,可以阅读Java源代码,从而拓展一些知识面.同时为学习An ...
- IOS学习笔记07---C语言函数-printf函数
IOS学习笔记07---C语言函数-printf函数 0 7.C语言5-printf函数 ------------------------- ----------------------------- ...
- IOS学习笔记06---C语言函数
IOS学习笔记06---C语言函数 -------------------------------------------- qq交流群:创梦技术交流群:251572072 ...
随机推荐
- ionic2 在执行ionic serve后报 build dev failed: Cannot set property 'fileSystem' of null
ionic2 真是烦人,因为环境依赖的问题还有网络的问题,不知砸的,项目放一段事件不运行就会出问题. 我一开始是 用 cnpm install安装的依赖,其中也报了错, 然后执行 ionic serv ...
- 【转】React 常用面试题目与分析
作者:王下邀月熊链接:https://zhuanlan.zhihu.com/p/24856035来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处. 本文有一定概率为水文,怕 ...
- mybatis写当天 当月的数据 时间段数据
1 数据库字段pk_time(Varchar) 当天的数据 SELECT * FROM 表 WHERE date(fk_time) = curdate(); 当月的数据 SELECT *FROM 表 ...
- 深入理解JMM(Java内存模型) --(六)final
与前面介绍的锁和volatile相比较,对final域的读和写更像是普通的变量访问.对于final域,编译器和处理器要遵守两个重排序规则: 在构造函数内对一个final域的写入,与随后把这个被构造对象 ...
- 基于Spark和Tensorflow构建DCN模型进行CTR预测
实验介绍 数据采用Criteo Display Ads.这个数据一共11G,有13个integer features,26个categorical features. Spark 由于数据比较大,且只 ...
- 使用printf和String.format格式化输出
格式化输出 在哪些情况下使用格式化输出: 异常打印到日志中使用格式化输出有利于排查错误原因: printf格式化 示例: public class PrintfTest { public static ...
- mysql——免安装配置
1.下载 (1)下载地址:https://dev.mysql.com/downloads/mysql/ (2)选择下载 2.配置环境变量 (1)解压目录:D:\mysql-8.0.16-winx64 ...
- jQuery——表单应用(4)
HTML: <!--复选框应用--> <!DOCTYPE html> <html> <head> <meta charset="UTF- ...
- 构造+暴力 Codeforces Round #283 (Div. 2) B. Secret Combination
题目传送门 /* 构造+暴力:按照题目意思,只要10次加1就变回原来的数字,暴力枚举所有数字,string大法好! */ /************************************** ...
- hbase本地调试环境搭建
1,前言 想要深入的了解hbase,看hbase源码是必须的.以下描述了搭建hbase本地调试环境的经历 2,安装步骤 2.1,启动hbase 1,安装java和IDE IntelliJ,下载源码等. ...