1.单链表的局限性

-> 单链表是对数组的一个扩展,解决了数组的大小比较死板不容易扩展的问题。使用堆内存来存储数据,将数据分散到各个节点之间,其各个节点在内存中可以不相连,节点之间通过指针进行单向链接。链表中的各个节点内存不相连,有利于利用碎片化的内存。

-> 单链表各个节点之间只由一个指针单向链接,这样实现有一些局限性。局限性主要体现在单链表只能经由指针单向移动(一旦指针移动过某个节点就无法再回来,如果要再次操作这个节点除非从头指针开始再次遍历一次),因此单链表的某些操作就比较麻烦(算法比较有局限)。回忆之前单链表的所有操作(插入、删除节点、 遍历、从单链表中取某个节点的数·····),因为单链表的单向移动性导致了不少麻烦。

2.双向循环链表引入

单链表的节点 = 有效数据 + 指针(指针指向后一个节点)

双向链表的节点 = 有效数据 + 2个指针(一个指向后一个节点,另一个指向前一个节点)

3.双向链表结点的描述

即双链表的结点包含三个部分,两个指针域,一个数据域。

 4.描述双链表的结构体

// 双链表的节点
struct node
{int data;                  // 有效数据struct node *pPrev;          // 前向指针,指向前一个节点struct node *pNext;           // 后向指针,指向后一个节点
};

5.创建一个节点

struct node *create_node(int data)
{struct node *p = (struct node *)malloc(sizeof(struct node));if (NULL == p){printf("malloc error.\n");return NULL;}p->data = data;p->pPrev = NULL;p->pNext = NULL;     // 默认创建的节点前向后向指针都指向NULLreturn p;
}

6.双向循环链表的创建

dlistnode* dlist_create()
{dlistnode *H,*p,*r;int n;H = (dlistnode*)malloc(sizeof(dlistnode));if(NULL == H){printf("malloc failed\n");return NULL;}H ->prior = H;H ->next = H;r = H;while(1){printf("please input num(-1 exit):");scanf("%d",&n);if(n == -1){break;}p = (dlistnode*)malloc(sizeof(dlistnode));if(NULL == p){printf("malloc failed\n");return NULL;}p->data = n;p->prior = r;p->next = r->next;r->next = p;H->prior = p;r = p;}return H;
}

7.从尾部插入一个节点

// 将新节点new插入到链表pH的尾部
void insert_tail(struct node *pH, struct node *new)
{// 第一步先走到链表的尾节点struct node *p = pH;while (NULL != p->pNext){p = p->pNext;         // 第一次循环走过了头节点}// 循环结束后p就指向了原来的最后一个节点// 第二步:将新节点插入到原来的尾节点的后面p->pNext = new;              // 后向指针关联好了。新节点的地址和前节点的nextnew->pPrev = p;              // 前向指针关联好了。新节点的prev和前节点的地址// 前节点的prev和新节点的next指针未变动
}

8.从头部插入一个节点

// 将新节点new前插入链表pH中。
// 算法参照图示进行连接,一共有4个指针需要赋值。注意的是顺序。
void insert_head(struct node *pH, struct node *new)
{// 新节点的next指针指向原来的第1个有效节点的地址new->pNext = pH->pNext;// 原来第1个有效节点的prev指针指向新节点的地址if (NULL != pH->pNext)pH->pNext->pPrev = new;// 头节点的next指针指向新节点地址pH->pNext = new;// 新节点的prev指针指向头节点的地址new->pPrev = pH;
}

数据结构 - 双链表的头插法和后插法相关推荐

  1. 单链表的头插法和尾插法c语言实现

    /*单链表的头插法和尾插法c语言实现*/ #include <stdio.h> #include <stdlib.h> #include <string.h> #d ...

  2. 单链表建立——头插法和尾插法

    引言 当我们准备采用单链表形式实现线性表,第一步就是要建立单链表,即初始化.由于链表是一个动态结构,不需要预先分配空间,因此生成链表的过程就是"逐个插入"的过程,插入结点的位置可以 ...

  3. 链表的头插法和尾插法——头插尾插交替插入

    private static ListNode dummy = new ListNode(0);//头插法public static void headInsert(ListNode node){if ...

  4. 单链表的头插法和尾插法实现代码(无头结点)

    /*头指针,可以发现head是赋值为NULL,而不是head->next*/ //-----------------头插法------------------- node *head, *p; ...

  5. 关于单链表的头插法和尾插法

    #include<stdio.h> #include<stdlib.h>  typedef struct Node {         //        定义的链表类型    ...

  6. 数据结构学习(二)——单链表的操作之头插法和尾插法创建链表

    http://blog.csdn.net/abclixu123/article/details/8210109 链表也是线性表的一种,与顺序表不同的是,它在内存中不是连续存放的.在C语言中,链表是通过 ...

  7. 头插法和尾插法创建链表(有无头结点)

    头插法和尾插法创建链表(有无头结点) 文章目录 头插法和尾插法创建链表(有无头结点) 1 头插法 1.1头插法建表规则: 1.2 头插法建表代码实现 2 尾插法 2.1 尾插法建表规则: 2.2 尾插 ...

  8. 单链表的前插法和后插法创建

    根据结点插入位置的不同,链表的创建方法可分为前插法和后插法 前插法 前插法是通过将新节点逐个插入链表的头部(头节点之后)来创建链表,每次申请一个新节点,读入相应的数据元素值,然后将新节点插入到头节点之 ...

  9. c语言 链表建立头插法尾插法,单链表的创建(头插法和尾插法)

    单链表的创建分为头插法和尾插法,头插法是不断地向头结点插入新的结点.这样会使你所插入的结点值呈现逆序,所以头插法也可以实现单链表的逆置.尾插法是不断地向插入的新元素之后再插入新的元素.需要注意的是头插 ...

最新文章

  1. Python-map、reduce、filter、sorted函数
  2. 实践:大规模混合部署项目在字节跳动的落地
  3. 2019暑假第三周总结
  4. httpcline转发_如何实现Http请求报头的自动转发[应用篇]
  5. [BZOJ4027][HEOI2015]兔子与樱花(贪心)
  6. Trial SCN WebIDE版本下载
  7. Error: org.apache.hadoop.hdfs.BlockMissingException: Could not obtain block: BP-965200530-172.21.
  8. OSS音频编程概述(DSP部分)
  9. 音视频开发(23)---音视频直播技术--10分钟搭建好直播平台
  10. 【工具使用系列】一小时学会使用MATLAB OPC 工具箱(OPC Toolbox)
  11. java map映射_java8流操作之map映射
  12. 如何遮挡电影英汉字幕
  13. pd.read_csv处理含中文的文件
  14. 为 Macbook Pro 选择外接键盘
  15. vite按需引入 Ant Design Vue 3.0
  16. Java字符串反转函数reverse()
  17. MotionEvent 事件解读
  18. uni-app H5打包上线流程
  19. bs84c12引脚_最新BS84B12A-3.pdf
  20. python学习第十三节:模块

热门文章

  1. 巴比特 | 元宇宙每日必读:如何拥抱 Web3,与NFT 项目和社区建立合作关系?
  2. 亚马逊云科技 CTO对过去十年的经验总结 – 十条军规
  3. centos ntp日志_CentOS7下部署NTP Server
  4. 语料库————(二)
  5. HTML5 SVG可爱笑脸动画
  6. 项目案例:Flink1.14 SQL实现Window TOPN
  7. 复习Python的Day13
  8. 泰克示波器MD03012-一款高性能、高可靠性的仪器
  9. 一站式解决健身房经营的五大痛点
  10. 飞桨开源背后,AgentMaker的升级打怪之路