数据结构概述<2>链表的基本概念

一 链表的定义

讨论链表之前,先说线性表。

线性表是一种最常用且最简单的数据结构。一个线性表是n个数据元素的有限集合。对于一个非空的线性表,一般存在几个特征:(1)存在唯一的一个被称作“第一个”的数据元素;(2)存在唯一的一个被称为“最后一个”的数据元素;(3)除第一个之外,线性表中的每个数据元素均只有一个前驱;(4)除最后一个之外,集合中每个数据元素均只有一个后继.

最常见的线性表就是数组了。对于数组而言,每个元素的存储空间相邻,其逻辑关系上相邻的两个元素,在物理位置上也相邻,并且可以通过索引进行访问。这种存储结构的缺点是当进行插入或删除操作时,需要移动大量元素。并且当集合中元素数量很多的时候,需要一整块大的存储空间。

于是就有了链表。

链表的特点就是用一组任意的存储单元去存储线性表中的每个数据元素。那么逻辑上的两个相邻元素之间怎样联系呢?链表的解决方法是对于每一个存储单元来说,不仅要存储该数据元素,还要存储下一个元素的地址。每一个这样的存储空间,称为一个结点。一个结点包括两个部分:数据域存储该元素的值,指针域存储下一个元素的地址。当然,对于双向链表而言,指针域不仅要存储下一个元素的地址,还要存储上一个元素的地址。下图分别为数组和链表的存储结构简图,很容易看出各自的特点:数组为连续地址的存储,链表为分散的存储地址,相邻元素通过指针链接。

数组示意图

链表示意图

二链表的基本操作

1.结点

在讨论链表的操作之前,先看看怎么表示一个链表。我们知道链表的组成单元是结点,因此表示一个结点就基本把链表表示出来了。在C语言当中,可以用结构体来表示结点:

typedef struct node *link;
struct node {
    Item item;
    link next;
};

其中的Item就是表示数据类型,在C语言中,可能是int,char,double等基本类型,也有可能是一个结构体对象甚至是一个链表,总之,它表示结点的数据域。Link则表示指针域,它指向下一个结点。

在实际应用过程中,往往实现并不知道需要多少个这样的结点,所以肯定需要动态申请。需要一个结点的时候,就创建一个新的结点。C语言中一般通过malloc函数来完成。

link x = malloc(sizeof *x);

对应的,释放一个结点用free

free(x);

2.插入操作

在不考虑链表为空的情况下,将一个结点t插入到结点x后面,可以这样表示。

t->next = x->next;
x->next = t;

3.删除操作

同样,在不考虑链表为空的情况下,将一个结点x的后面一个结点删除,可以这样表示。

t = x->next;
x->next =t->next;
free(t);

4.遍历

在链表上执行的最常用的操作之一是遍历操作,即按照顺序遍历链表中的元素,对每个元素都执行某种操作。假如x是一个指向链表首结点的指针,尾结点中的指针为空,visit是一个元素为参量的函数,那么遍历操作可以用如下语句:

for(t = x;t != NULL;t = t->next)
    visit(t->item);

三 有哨兵的双向循环链表

如图,是一个带哨兵的双向循环链表。哨兵是一个哑元素,也就是其数据部分是没有意义的,只是为了占一个位置,让链表永远不为空,从而简化判断的边缘条件。图中黑色部分即为哨兵,位于链表头和尾之间。不同于上面介绍的单链表,双向链表的指针部分包括指向后继和前驱的地址。同样,我们按照上文中描述单链表的顺序,对双向循环链表的基本操作进行简单介绍。

1.结点

typedef struct node *link;
struct node {
    Item item;
    link next;
    link prev;
};

2.插入操作

假设nil为指向哨兵元素的指针,x为要插入的结点,插入的位置为表头,则操作步骤如下。

x->next = nil->next;
nil->next->prev = x;
nil->next = x;
x->prev = nil;

3.删除操作

假设要删除的结点地址为x,则删除操作步骤如下:

x->prev->next = x->next;
x->next->prev = x->prev;

4.遍历

for(t = nil->next;t != nil;t = t->next)
    visit(t->item);

带哨兵的循环双向链表涵盖了双向链表和循环链表,掌握了这种链表,也就基本上掌握了所有链表的基本知识。下一篇博客将会给出链表的几个应用。

时间: 2024-10-20 13:52:04

数据结构概述<2>链表的基本概念的相关文章

数据结构概述&lt;3&gt;链表的简单应用

今天介绍两个链表的简单应用. 1.约瑟夫问题 假设有N个人决定选出一个领导人,方法如下:所有人排成一个圆圈,按顺序数数,每次数到第M个人出局,此时,他两边的人靠拢重新形成圆圈.问题是找出哪一个人将会是最后剩下的那个人.下列程序依次读入N和M,并给出最终结果. #include <stdlib.h> #include <stdio.h> typedef struct node* link; struct node { int item; link next; }; int main(

数据结构概述&lt;4&gt;队列

队列也是一种比较常用的数据结构,和栈不同的地方在于它是先进先出的,就像我们平时的排队一样. 由于队列和栈非常相似,就不详细讲述概念了,可以参考上一篇博客数据结构概述<3>栈. 和栈一样,在这里直接给出队列的接口(queue.h),以及接口的数组实现(queue1.c)和链表实现(queue2.c).分别如下: //queue.h void queue_init(int); int queue_empty(); void queue_put(int); int queue_get(); //qu

数据结构-概述(1)

数据结构是计算机存储.组织数据的方式.数据结构是指相互之间存在一种或多种特定关系的数据元素的集合.通常情况下,精心选择的数据结构可以带来更高的运行或者存储效率. 数据的逻辑结构:指反映数据元素之间的逻辑关系的数据结构,其中的逻辑关系是指数据元素之间的前后件关系,而与他们在计算机中的存储位置无关. 通常有下列四类基本的结构: ⑴集合结构.该结构的数据元素间的关系是"属于同一个集合". ⑵线性结构.该结构的数据元素之间存在着一对一的关系. ⑶树型结构.该结构的数据元素之间存在着一对多的关系

数据结构概述&lt;3&gt;栈

栈是一种重要的数据结构,其实质也是线性表的一种.但是它只支持两种操作:插入和删除.并且,栈的特点是后进先出,也就是说,栈的操作永远在顶部,插入和删除操作只在栈的顶部进行,所以先插入的栈会堆在底下,而后插入的栈会在栈顶,进行删除的时候,是从栈顶开始,所以新插入的元素反而能优先被删除,我们称之为后进先出.而这种插入和删除操作,在栈的用语里,叫做推进(push)和弹出(pop). 举个例子来说,栈的操作有点像一个老师收上来的作业,先交的作业放在下面,后交的作业放在上面,老师在批阅的时候,总是先从上面的

[考研系列之数据结构]数据结构概述

1.脑图 2.数据结构 2.1 抽象数据类型 表示法: (D,S,P) D:数据对象 S:D上的关系集 P:对D的基本操作集 ADT格式 ADT 抽象数据类型名{ 数据对象:<数据对象定义> 数据关系:<数据对象的定义> 基本操作:<基本操作的定义> }ADT 抽象数据类型名 基本操作的格式: 基本操作名(参数表) 初始条件:<初始条件描述> 操作结构:<操作结果描述> 2.2 分类 2.2.1 按值的不同特性 原子类型的值是不能分解的,如C中基

java数据结构与算法之树基本概念及二叉树(BinaryTree)的设计与实现

[版权申明]未经博主同意,不允许转载!(请尊重原创,博主保留追究权) http://blog.csdn.net/javazejian/article/details/53727333 出自[zejian的博客] 关联文章: java数据结构与算法之顺序表与链表设计与实现分析 java数据结构与算法之双链表设计与实现 java数据结构与算法之改良顺序表与双链表类似ArrayList和LinkedList(带Iterator迭代器与fast-fail机制) java数据结构与算法之栈(Stack)设

37. 蛤蟆的数据结构笔记之三十七图的概念

37. 蛤蟆的数据结构笔记之三十七图的概念 本篇名言:"宿命论是那些缺乏意志力的弱者的借口.--罗曼? 罗兰" 又到了一个新概念,这次咱们来看 这个图,图一看给人一种凌乱的感觉.那么它在数据结构中又是什么呢? 欢迎转载,转载请标明出处: 1.  图的概念 图(graph)是一种比线性表.树更为复杂的数据结构.在线性表中,数据元素之间呈线性关系,即每个元素只有一个直接前驱和一个直接后继.在树型结构中,数据元素之间有明显的的层次关系,即每个结点只有一个直接前驱,但可有多个直接后继,而在图结

数据结构——概述

本来大一下册的时候学过<数据结构>,只怪自己太无知,除了能够理解基本概念外其他的一无所知,上课也算是在坐飞机吧.无奈,现在大二又来看看,复习复习.不求深入的理解只求把书读薄吧. 数据结构是一门研究非数值计算的程序设计问题中的操作对象,以及它们之间的关系和操作等相关问题的科学. 基本概念和术语: 数据:是信息的载体,是描述客观事物的符号,是计算机中可以操作的对象,是能被计算机识别,并输入给计算机处理的符号集合.数据不仅包括整型.实型等数值类型,还包括字符及声音.图像.视频等非数值类型. 数据元素

算法数据结构01 /算法数据结构概述

目录 算法数据结构01 /算法数据结构概述 1. 算法 2. 评判程序优劣的方法 3. 时间复杂度 4. 数据结构 5. python数据结构性能分析 6. 总结 算法数据结构01 /算法数据结构概述 1. 算法 算法概述 算法是计算机处理信息的本质,因为计算机程序本质上是一个算法来告诉计算机确切的步骤来执行一个指定的任务.一般地,当算法在处理信息时,会从输入设备或数据的存储地址读取数据,把结果写入输出设备或某个存储地址供以后再调用. 算法是独立存在的一种解决问题的方法和思想. 对于算法而言,实