如何用尾插法建立双链表(C语言,非循环)
如何用尾插法建立双链表
其实本来是想完成汪队给的链表快排的作业,但是我写完建立双链表以后就12点了龟龟,明天还要早起QAQ,我菜死了
一,为啥要有双链表
先说单链表吧
单链表长这样
他的一个结点结构就是
【元素域 | next指针域】
每次后插法进行单链表的建立时,上一个的结点里的指针域都会指向下一个结点,比如上图的第一个结点(e1元素所在结点,蓝色阴影结点为头结点)的指针域就指向了下一个结点
以此类推
我们就可以得到一个由指针链接的链表,这就叫单链表
我们可以看到,如果我有某元素所在结点的指针域是可以很轻松在这个元素所在结点的左右进行结点的插入的
但是!!!如果我想在这个元素的前一个元素进行前插的话,我必须又要将这个表从头开始遍历一遍,这就大大浪费了时间(就是在开车在单行线不能掉头)
所以我们引入了双链表
二,双链表的建立
双链表长下面这样
他的一个节点结构就是
【prior指针域 | 元素域 | next指针域】
双链表就比上面的单链表多了一个“prior指针域”,prior是指向前一个结点的针,next和上面的单链表一样都是指向后面的一个结点指针
回到上面的问题
如果我们还要进行在某个元素的前一个元素进行前插的话,用双链表就会快很多
因为我们不再需要去从头开始遍历整个表,双链表的每个结点都存着的上一个结点的地址
我们只需要将指针前移就能完成(单行线变双行线虚线!随时可以掉头回去)
下面就是如何建立双链表的步骤
1.双链表的结点类型定义
typedef struct DNode{
int data;
struct DNode *prior, *next;
}DNode, *DLinkList;
定义了一个元素域(我这里用的int类型,可更换),两个指针域*prior和*next,分别用来指向该结点的前一个结点和后一个结点
2.双链表的建立
DLinkList DList_Create(DLinkList &D)
{
int num;
scanf("%d",&num);
D = (DNode*)malloc(sizeof(DNode)); //定义头结点
DNode *s,*p = D;//s为待插入结点的指针
p->next = NULL;
while(num != -)//输入-1时停止
{
s = (DNode*)malloc(sizeof(DNode));//为待插入的s申请空间
s->data = num;
s->next = p->next;//s的next复制上一个结点p的next域
p->next = s;//上一个结点p的next指向s
s->prior = p;//s的prior指向前一个结点p
p = p->next;//p指针后移一位
scanf("%d",&num);//下个元素的值
}
return D;
}
while里的步骤如下
s = (DNode*)malloc(sizeof(DNode));//为待插入的s申请空间
s->next = p->next;//s的next复制上一个结点p的next域
p->next = s;//上一个结点p的next指向s
s->prior = p;//s的prior指向前一个结点p
p = p->next;//p指针后移一位
现在1.22了再不睡我就要猝死了,链表快排要不明天抄作业叭
嘿嘿
如何用尾插法建立双链表(C语言,非循环)的更多相关文章
- C实现头插法和尾插法来构建单链表(不带头结点)
链表的构建事实上也就是不断插入节点的过程.而节点的插入能够分为头插法和尾插法. 头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点. ...
- c语言——单链表分拆——头插法创建链表,尾插法生成链表
#if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...
- Java解释单链表中的头插法以及尾插法
单链表属于数据结构中的一种基本结构,是一种线性结构,在此使用Java对其中的头插法以及尾插法进行解释. 首先定义好链表中的节点类: 其中,data代表节点所存放的数据,next代表指向下一节点 对于单 ...
- C实现头插法和尾插法来构建单链表(带头结点)
我在之前一篇博客<C实现头插法和尾插法来构建单链表(不带头结点)>中具体实现了怎样使用头插法和尾插法来建立一个不带头结点的单链表,可是在实际使用中.我们用的最多的还是带头结点的单链表.今天 ...
- 7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)
给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...
- 尾插法-实现链表反转(有点bug,以后再来研究下)
def func2(head): p = head.next while p.next: q = p.next p.next = q.next # 重点 head.next = q q.next = ...
- LinkedList 利用的是尾插法
- 20140502 static_cast和dynamic_cast的类型检查 双链表建立,删除,打印
1.static_cast和dynamic_cast的类型检查 static_cast的类型检查:只检查无关类之间的转换 CBaseY* pY1 = static_cast<CBaseY*> ...
- HashMap 链表插入方式 → 头插为何改成尾插 ?
开心一刻 一天,楼主在路上碰到了一个很久没见的朋友,找了个餐馆,坐下聊了起来 楼主:在哪上班了 ? 朋友:火葬场啊 楼主:在那上班,一个月多少钱啊 ? 朋友:两万多啊 楼主(不可思议):多少 ? 朋友 ...
随机推荐
- Python软件定时器APScheduler使用【软件定时器,非操作系统定时器,软件可控的定时器】【用途:定时同步数据库和缓存等】【刘新宇】
APScheduler使用 APScheduler (advanceded python scheduler)是一款Python开发的定时任务工具. 文档地址 https://apscheduler. ...
- php微信公众号开发curl返回false
最近刚接触温馨公众号开发,在自定义菜单用curl请求时,碰到了一个小坑.一时半会没有解决,便去问度娘,谷歌.发现都是说$url里面有空格导致的失败. 然而我的并没有空格,一直返回false,这个时候我 ...
- Nginx安装、多域名访问
nginx web服务 apache iis django web框架 lvs 负载均衡 章文嵩博士 vue 尤雨溪 Tengine F5 硬件负载 A10 安装 ``` wget http://ng ...
- 使用Reactor响应式编程
介绍 响应式编程 响应式编程不同于我们熟悉的命令式编程,我们熟悉的命令式编程即代码就是一行接一行的指令,按照它们的顺序一次一条地出现.一个任务被执行,程序就需要等到它执行完了,才能执行下一个任务.每一 ...
- redis的5种数据类型
卸载服务:redis-server --service-uninstall 开启服务:redis-server --service-start 停止服务:redis-server --service- ...
- 2019-2020-1 20199303《Linux内核原理与分析》第五周作业
系统调用的三层机制 API:第一层是指Libc中定义的API,这些API封装了系统调用,使用int 0x80触发一个系统调用中断:当然,并非所有的API都使用了系统调用,如完成数学加减运算的API就没 ...
- java并发中ExecutorService的使用
文章目录 创建ExecutorService 为ExecutorService分配Tasks 关闭ExecutorService Future ScheduledExecutorService Exe ...
- 在Spring Boot中使用内存数据库
文章目录 H2数据库 HSQLDB Apache Derby SQLite 在Spring Boot中使用内存数据库 所谓内存数据库就是可以在内存中运行的数据库,不需要将数据存储在文件系统中,但是相对 ...
- Zookeeper之Error contacting service. It is probably not running.
安装ZooKeeper时,无论是修改zoo.cfg:还是myid,都检查了几遍都没有错误.但是开启Zookeeper服务时出现: Error contacting service. It is pro ...
- 正则表达式(grep,awk,sed)和通配符
1. 正则表达式 1. 什么是正则表达式? 正则表达式就是为了处理大量的字符串而定义的一套规则和方法. 通过定义的这些特殊符号的辅助,系统管理员就可以快速过滤,替换或输出需要的字符串. Linux正则 ...