如何用尾插法建立双链表

其实本来是想完成汪队给的链表快排的作业,但是我写完建立双链表以后就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语言,非循环)的更多相关文章

  1. C实现头插法和尾插法来构建单链表(不带头结点)

    链表的构建事实上也就是不断插入节点的过程.而节点的插入能够分为头插法和尾插法. 头插法就是在头结点后插入该节点,始终把该节点作为第一个节点.尾插法就是在链表的最后一个节点处插入元素,作为最后一个节点. ...

  2. c语言——单链表分拆——头插法创建链表,尾插法生成链表

    #if 1 #include<stdio.h> #include<stdlib.h> #include<iostream> using namespace std; ...

  3. Java解释单链表中的头插法以及尾插法

    单链表属于数据结构中的一种基本结构,是一种线性结构,在此使用Java对其中的头插法以及尾插法进行解释. 首先定义好链表中的节点类: 其中,data代表节点所存放的数据,next代表指向下一节点 对于单 ...

  4. C实现头插法和尾插法来构建单链表(带头结点)

    我在之前一篇博客<C实现头插法和尾插法来构建单链表(不带头结点)>中具体实现了怎样使用头插法和尾插法来建立一个不带头结点的单链表,可是在实际使用中.我们用的最多的还是带头结点的单链表.今天 ...

  5. 7-19 求链式线性表的倒数第K项(20 分)(单链表定义与尾插法)

    给定一系列正整数,请设计一个尽可能高效的算法,查找倒数第K个位置上的数字. 输入格式: 输入首先给出一个正整数K,随后是若干正整数,最后以一个负整数表示结尾(该负数不算在序列内,不要处理). 输出格式 ...

  6. 尾插法-实现链表反转(有点bug,以后再来研究下)

    def func2(head): p = head.next while p.next: q = p.next p.next = q.next # 重点 head.next = q q.next = ...

  7. LinkedList 利用的是尾插法

  8. 20140502 static_cast和dynamic_cast的类型检查 双链表建立,删除,打印

    1.static_cast和dynamic_cast的类型检查 static_cast的类型检查:只检查无关类之间的转换 CBaseY* pY1 = static_cast<CBaseY*> ...

  9. HashMap 链表插入方式 → 头插为何改成尾插 ?

    开心一刻 一天,楼主在路上碰到了一个很久没见的朋友,找了个餐馆,坐下聊了起来 楼主:在哪上班了 ? 朋友:火葬场啊 楼主:在那上班,一个月多少钱啊 ? 朋友:两万多啊 楼主(不可思议):多少 ? 朋友 ...

随机推荐

  1. python正则表达式详解之Match类及其方法

    1.Match对象简介 match对象通常是由正则表达式对象的match 方法,search 方法等经过匹配之后而产生.可以直接当做bool值使用,如果匹配则相当于True, 如果不匹配,则返回Non ...

  2. PHP Callable强制指定回调类型的方法

    如果一个方法需要接受一个回调方法作为参数,我们可以这样写 <?php function dosth($callback){ call_user_func($callback); } functi ...

  3. 2019-2020-1 20199325《Linux内核原理与分析》第八周作业

    Linux内核如何装载和启动一个可执行程序 1.理解编译链接的过程和ELF可执行文件格式,详细内容参考本周第一节:​ 2.编程使用exec*库函数加载一个可执行文件,动态链接分为可执行程序装载时动态链 ...

  4. Linux操作系统进入单用户模式的方法

    单用户模式的作用 在使用Linux的过程中,维护人员经常会碰到一些问题,就是在拥有root账号权限和密码的用户中,总是会出现忘记root密码的情况. 遇到这种情况,一般情况下,维护人员就会通过最常用的 ...

  5. 每天认识几个HTTP 响应码

    HTTP 响应状态代码指示特定 HTTP 请求是否已成功完成. 1xx信息响应 1xx 的响应结果表明接收的请求正在处理 2xx成功响应 2XX 的响应结果表明请求被正常处理了 3xx重定向 3xx ...

  6. 负载均衡服务之HAProxy https配置、四层负载均衡以及访问控制

    前文我们聊了下haproxy的访问控制ACL的配置,回顾请参考https://www.cnblogs.com/qiuhom-1874/p/12817773.html:今天我们来聊一聊haproxy的h ...

  7. GCD-Euclidean Algorithm

    求解两个正整数的最大公约数(Greatest Common Devisor),可以采用循环进行遍历,不过效率很低.所以引入欧几里得算法(Euclid's algorithm). 欧几里得算法基于GCD ...

  8. ubuntu 15.04 的安装遇到的问题及其解决方法

    在Ubuntu15.04 的安装(U盘)中 遇到的问题1:安装后设置电脑从U盘启动,启动失败,屏幕上显示:Failed to load ldlinux.c32 解决方法:当时是参考这篇文章 http: ...

  9. Centos7.x 装机优化

    Linux 服务器装机后优化 参考 https://blog.csdn.net/u010133338/article/details/81055475 优化初始化脚本 vim init_optimiz ...

  10. Spring MVC的Controller接受请求方式以及编写请求处理方法

    Controller接受请求参数的常见方法: 1.通过Bean接受请求参数: 创建POJO实体类 创建pojo包,并在该包中创建实体类UserForm,代码: package pojo; public ...