双链表与单链表的比较

双链表在一定程度上就是单链表的的基础上加上了一个指针域,在一些情况下能够使程序更加健壮和速率更加高效。

  双链表的结点定义

  typedef struct node

{

  int data;

  struct node *next;

  struct node *prior;

}node;

双链表的定义

  typedef struct doublelist

{

  node *head;

  node *tail;

  size_t size;

}doublelist;

链表的初始化

doublelist *list;

list = (doublelist *)malloc(sizeof(doublelist));

list->head = NULL;

list->tail = NULL;

list->size = 0;

头插:

1.在每次插入新结点是进行一次该双链表是否为空的判断,若为空则头结点为创建的新结点。

 list->head = newnode;

 list->tail = newnode;

2.若链表不为空:

 newnode->next = list->head;//当链表为空时插入头结点时,头结点等于尾结点

 list->head->prior = newnode;

 list->head = newnode;

尾插:

在插入之前进行一次判断

1.链表为空链表时:

 list->tail = newnode;

 list->head = newnode;

2.链表不为空时:

 newnode->prior = list->tail;

 list->tail->next = newnode;

 list->tail = newnode;

双链表的遍历

1.正向遍历

node *tmp;

tmp = list->head;

while(tmp){

  printf("%d\n",tmp->data);

  tmp = tmp->next;

}

2.反向遍历

node *tmp;

tmp = list->tail;

while(tmp){

printf("%d\n",tmp->data);

tmp = tmp->next;

}

具体的代码实现:github中zou-ting-rong/sample

原文地址:https://www.cnblogs.com/zoutingrong/p/12180416.html

时间: 2024-10-08 14:41:53

双链表与单链表的比较的相关文章

数据结构 链表_单链表的接口定义

链表可以说是一种最为基础的数据结构.链表由一组元素以一种特定的顺序组合或链接而成,在维护数据的集合时很有用.这一点同我们常用的数组很相似.然而,链表在很多情况下比数组更有优势.特别是在执行插入和删除操作时链表拥有更高的效率.链表需要动态的开辟存储空间,也就是存储空间是在程序运行时分配的.由于在很多应用中数据的大小在编译时并不能确定,因此这种动态分配空间的特性也是链表的一个优点. 单链表介绍 单链表(简称为链表)由各个元素之间通过一个指针彼此链接起来而组成.每个元素包含两个部分:数据成员和一个称为

(单链表)单链表的整体逆序和局部逆序

题目一:将单链表翻转. 思路:有三种方式. 一:用数组存储单链表的值,然后重新逆序赋值,效率较低. 二:利用三个指针,在原来的基础上进行逆序.这种方法比较实用,效率也高. 三:从第2个节点到第N个节点,依次逐节点插入到第1个节点(head节点)之后,最后将第一个节点挪到新表的表尾.需要新建一个链表,这种方法和第二种差不多. 这里我就写出第二种方法,比较实用. 代码(方法二): struct ListNode { int val; ListNode *next; ListNode(int x) :

【数据结构-链表】单链表

链表 特点 链表是通过任意的存储单元来存储线性表中的数据元素 链表组成 链表是由很对节点组成 带有头结点的单链表 typedef struct{ struct node *head;//链表的头结点 }LinkList; 节点结构 typedef struct node{ int data; struct node *next; }Node; 链表的插入操作 首先得到插入位置的节点n 得到插入位置的前一个节点pre 讲新插入的节点的next指针指向n pre节点的next指向n /** * 在p

【算法设计-链表】单链表与双向循环链表

1.单链表代码:包含了尾插法,插入,删除操作. 有头结点的单链表也是为了在第一个位置插入和删除时候容易,不需要另外讨论 #include<stdio.h> #include<stdlib.h> typedef struct Linklist { int key; Linklist *next; }Linklist; Linklist* create_end() { Linklist *head=(Linklist *)malloc(sizeof(Linklist)); Linkli

Python与数据结构[0] -&gt; 链表[0] -&gt; 单链表与带表头单链表的 Python 实现

单链表 / Linked List 目录 单链表 带表头单链表 链表是一种基本的线性数据结构,在C语言中,这种数据结构通过指针实现,由于存储空间不要求连续性,因此插入和删除操作将变得十分快速.下面将利用Python来完成单链表的实现. 1 单链表 不带表头的单链表通常形式如下, node_1 -> node_2 -> node_3 -> node_4 完整代码 1 class Node: 2 def __init__(self, val=None, nxt=None): 3 self.v

数据结构:链表(单链表)

一.链表 概念:链表[Linked List]是由一组不必相连(可连续可不连续)的内存结构(节点),按照特定的顺序链接在一起的抽象数据类型: 分类:链表常用的大概有三类:单链表.双向链表.循环链表(这篇文章主要讲单链表) 操作:链表的核心操作主要有三个(查找遍历.插入.删除) 二.单链表 上图就是一个单链表的数据结构了,从上图可以看出,每个节点包含两个重要的元素(data.next),那么什么是单链表呢? 概念:各个内存结构通过一个Next指针链接在一起,每个内存结构都存在后续的内存结构(链尾除

[程序员代码面试指南]链表问题-单链表的选择排序(选择排序)

题意 给定一个无序单链表的头节点head,实现单链表的选择排序. 题解 按选择排序方法:每次从原链表找出最小值,从原链表删除,插入新的有序链表. 时间复杂度O(n^2) 额外空间复杂度O(1) 代码 public class Main { public static void main(String args[]) { Node n1=new Node(2); Node n2=new Node(1); Node n3=new Node(3); n1.next=n2; n2.next=n3; No

【转】单向链表(单链表)的Java实现

最近被问到链表,是一个朋友和我讨论Java的时候说的.说实话,我学习编程的近一年时间里,学到的东西还是挺少的.语言是学了Java和C#,关 于Web的学了一点Html+css+javascript.因为比较偏好,学习WinForm时比较认真,数据库操作也自己有所研究.但链表这个东西我 还真没有学习和研究过,加上最近自己在看WPF,而课程也到了JSP了,比较紧. 但是我还是抽了一个晚上加半天的时间看了一下单向链表.并且使用Java试着写了一个实例出来.没有接触过链表的朋友可以作为参考,希望大家多提

链表——将单链表从m到n的结点位置翻转

题目:反转链表从m-n位置的结点 For example: Given1->2->3->4->5->NULL, m = 2 and n = 4, return1->4->3->2->5->NULL. 从第二到第四的结点被反转了. 其中m和n满足条件: 1 ≤ m ≤ n ≤ length of list. 思路: 仍是逆序,仍考虑到用辅助空间stack. 将m-n的结点依次入栈,并标记与入栈结点相邻的前后两个结点pfirst和psecond (若