数据结构学习单链表,顺序表和链表的比较
2006-10-29 16:26
单链表
1、链接存储方法
链接方式存储的线性表简称为链表(Linked List)。
链表的具体存储表示为:
① 用一组任意的存储单元来存放线性表的结点(这组存储单元既可以是连续的,也可以是不连续的)
② 链表中结点的逻辑次序和物理次序不一定相同。为了能正确表示结点间的逻辑关系,在存储每个结点值的同时,还必须存储指示其后继结点的地址(或位置)信息(称为指针(pointer)或链(link))
注意:
链式存储是最常用的存储方式之一,它不仅可用来表示线性表,而且可用来表示各种非线性的数据结构。
2、链表的结点结构
┌──┬──┐
│data│next│
└──┴──┘
data域--存放结点值的数据域
next域--存放结点的直接后继的地址(位置)的指针域(链域)
注意:
①链表通过每个结点的链域将线性表的n个结点按其逻辑顺序链接在一起的。
②每个结点只有一个链域的链表称为单链表(Single Linked List)。
3、头指针head和终端结点指针域的表示
单链表中每个结点的存储地址是存放在其前趋结点next域中,而开始结点无前趋,故应设头指针head指向开始结点。
注意:
链表由头指针唯一确定,单链表可以用头指针的名字来命名。
【例】头指针名是head的链表可称为表head。
终端结点无后继,故终端结点的指针域为空,即NULL。
4、单链表的一般图示法
由于我们常常只注重结点间的逻辑顺序,不关心每个结点的实际位置,可以用箭头来表示链域中的指针。
5、单链表类型描述
typedef char DataType; //假设结点的数据域类型为字符
typedef struct node{ //结点类型定义
DataType data; //结点的数据域
struct node *next;//结点的指针域
}ListNode;
typedef ListNode *LinkList;
ListNode *p;
LinkList head;
注意:
①LinkList和ListNode *是不同名字的同一个指针类型(命名的不同是为了概念上更明确)
②LinkList类型的指针变量head表示它是单链表的头指针
③ListNode *类型的指针变量p表示它是指向某一结点的指针
6、指针变量和结点变量
┌────┬────────────┬─────────────┐
│ │ 指针变量 │ 结点变量 │
├────┼────────────┼─────────────┤
│ 定义 │在变量说明部分显式定义 |在程序执行时,通过标准 │
│ │ │函数malloc生成 │
├────┼────────────┼─────────────┤
│ 取值 │ 非空时,存放某类型结点 │实际存放结点各域内容 │
│ │的地址 │ │
├────┼────────────┼─────────────┤
│操作方式│ 通过指针变量名访问 │ 通过指针生成、访问和释放 │
└────┴────────────┴─────────────┘
①生成结点变量的标准函数
p=( ListNode *)malloc(sizeof(ListNode));
//函数malloc分配一个类型为ListNode的结点变量的空间,并将其首地址放入指针变量p中
②释放结点变量空间的标准函数
free(p);//释放p所指的结点变量空间
③结点分量的访问
利用结点变量的名字*p访问结点分量
方法一:(*p).data和(*p).next
方法二:p-﹥data和p-﹥next
④指针变量p和结点变量*p的关系
指针变量p的值——结点地址
结点变量*p的值——结点内容
(*p).data的值——p指针所指结点的data域的值
(*p).next的值——*p后继结点的地址
*((*p).next)——*p后继结点
注意:
① 若指针变量p的值为空(NULL),则它不指向任何结点。此时,若通过*p来访问结点就意味着访问一个不存在的变量,从而引起程序的错误。
顺序表和链表的比较
顺序表和链表各有短长。在实际应用中究竟选用哪一种存储结构呢?这要根据具体问题的要求和性质来决定。通常有以下几方面的考虑:
┌───┬───────────────┬───────────────┐
│ │ 顺序表 │ 链表 │
├─┬─┼───────────────┼───────────────┤
│基│分│静态分配。程序执行之前必须明确│动态分配只要内存空间尚有空闲,│
│于│配│规定存储规模。若线性表长度n变 │就不会产生溢出。因此,当线性表│
│空│方│化较大,则存储规模难于预先确定│的长度变化较大,难以估计其存储│
│间│式│估计过大将造成空间浪费,估计太│规模时,以采用动态链表作为存储│
│考│ │小又将使空间溢出机会增多。 │结构为好。 │
│虑├─┼───────────────┼───────────────┤
│ │存│为1。当线性表的长度变化不大, │<1 │
│ │储│易于事先确定其大小时,为了节约│ │
│ │密│存储空间,宜采用顺序表作为存储│ │
│ │度│结构。 │ │
├─┼─┼───────────────┼───────────────┤
│基│存│随机存取结构,对表中任一结点都│顺序存取结构,链表中的结点,需│
│于│取│可在O(1)时间内直接取得 │从头指针起顺着链扫描才能取得。│
│时│方│线性表的操作主要是进行查找,很│ │
│间│法│少做插入和删除操作时,采用顺序│ │
│考│ │表做存储结构为宜。 │ │
│虑├─┼───────────────┼───────────────┤
│ │插│在顺序表中进行插入和删除,平均│在链表中的任何位置上进行插入和│
│ │入│要移动表中近一半的结点,尤其是│删除,都只需要修改指针。对于频│
│ │删│当每个结点的信息量较大时,移动│繁进行插入和删除的线性表,宜采│
│ │除│结点的时间开销就相当可观。 │用链表做存储结构。若表的插入和│
│ │操│ │删除主要发生在表的首尾两端,则│
│ │作│ │采用尾指针表示的单循环链表为宜│
└─┴─┴───────────────┴───────────────┘
存储密度(Storage Density)是指结点数据本身所占的存储量和整个结点结构所占的存储量之比,即
存储密度=(结点数据本身所占的存储量)/(结点结构所占的存储总量)
分享到:
相关推荐
单链表是一种线性数据结构,每个元素(节点)包含两个部分:数据域和指针域。数据域存储实际的数据,而指针域指向下一个节点的地址。单链表的头节点通常用来初始化链表,其指针域指向第一个元素。插入和删除操作...
1. **数据结构基础**:理解线性表的概念,学习顺序表和链表的区别。 2. **C语言编程**:使用指针操作内存,动态内存分配,结构体定义等。 3. **链表操作**:链表的初始化,插入节点,删除节点,查找节点,以及链表的...
本话题聚焦于两种基本的数据结构:顺序表和链表,它们是编程中最常用的数据组织方式。 顺序表是一种线性数据结构,其中元素在内存中按顺序存储。这种表的操作通常涉及到数组,因为数组提供了随机访问的能力。在顺序...
本专题主要探讨了三种基本数据结构:顺序表、单链表和循环链表,并以学生成绩管理为例,展示了它们在实际问题中的应用。下面将详细阐述这三种数据结构及其在C#语言中的实现。 首先,顺序表是一种线性数据结构,它在...
1.从键盘输入顺序任意的5个整数,按有序插入的要求生成第一个有序单链表,将该链表输出显示。 2.再从键盘输入顺序任意的5个整数,按有序插入的要求生成第二个有序单链表,将该链表输出显示。 3.将这两个有序单链表...
本文档主要介绍顺序表和链表这两种基本的数据结构。在计算机科学中,数据结构是指在计算机中组织和存储数据的一种特殊方式,它允许高效地访问和修改数据。顺序表和链表作为线性表的两种实现方式,在实际应用中非常...
顺序表和链表是两种基本的数据结构,它们在程序设计中扮演着重要角色。本篇将深入探讨这两种数据结构及其在C++语言中的实现,通过分析提供的代码文件(dlink.cpp、sqlist.cpp、slink.cpp、cdlink.cpp、cslink.cpp)...
顺序表和链表是两种基本且常用的数据结构,它们在理解和实现各种算法时起着至关重要的作用。下面将详细介绍这两种数据结构以及在VC++6.0环境下如何进行相关操作。 **顺序表** 是一种线性数据结构,它的元素在内存中...
在这个"数据结构顺序表+单链表+二叉树+图等等各实验总汇.rar"压缩包中,包含了多个关于基础数据结构的实验,对于计算机专业的学生来说,这些都是极其重要的学习资源。 首先,我们来看"顺序表o_o"。顺序表是一种最...
总的来说,这个压缩包提供了一个实践C语言数据结构学习的平台,通过编写和运行这些程序,可以加深对顺序链表、单链表、双链表以及栈的理解,提升编程技能。对于初学者来说,这是一个很好的练习机会,对于经验丰富的...
通过本次实验,不仅加深了对数据结构中链表概念的理解,还熟练掌握了如何使用C语言实现单链表的各种基本操作。特别是在实际编程过程中遇到的问题及其解决方法,如内存分配与释放、链表节点的正确连接等方面,都获得...
本主题将深入探讨两种常用的数据结构——顺序表和链表,并展示如何使用C语言来实现这两种数据结构来连接表。顺序表和链表各有优缺点,理解和掌握它们对于优化算法和提高程序效率至关重要。 首先,我们来讨论顺序表...
顺序链表,也称为单链表,是另一种线性数据结构,但与顺序表不同,它的元素不必须存储在连续的内存位置。每个元素(节点)包含两个部分:数据域,存储实际数据;指针域,存储指向下一个节点的引用。由于不需要保持...
通过对这些文件的学习和实践,你可以深入理解链表数据结构,提升在实际编程中的数据处理能力。链表是许多高级数据结构(如栈、队列、树等)的基础,熟练掌握链表的操作对提升编程技能至关重要。
本主题聚焦于两种基本数据结构——顺序表和单链表,并探讨如何利用它们来实现筛选素数的功能。 **顺序表**是一种简单且直观的数据结构,它将元素存储在一块连续的内存空间中,可以通过下标直接访问任意位置的元素。...
本主题聚焦于“顺序表”中的“链表”部分,这是一个基础且至关重要的概念,广泛应用于各种软件系统。 链表是一种线性数据结构,与数组不同,它不连续存储元素。每个元素称为节点,每个节点包含两个部分:数据域,...
在实际应用中,根据需求选择合适的数据结构,如需要频繁插入和删除操作,链表可能优于顺序表;如果主要涉及元素访问,顺序表可能更优。 总的来说,Python提供了丰富的工具来实现和操作链表,理解并熟练掌握这些数据...
在实现线性表时,有两种常见的数据结构:顺序表和链表。本文将深入探讨这两种结构的基本操作及其在实际应用中的体现。 顺序表是将数据元素存储在一块连续的内存区域中,其特点是访问速度快,因为可以通过索引直接...
这里我们讨论的是顺序表、链表以及循环队列,这些都是基本的数据结构,广泛应用于算法设计和程序实现中。 顺序表是一种线性数据结构,它在内存中按顺序连续存储元素。它的主要操作包括插入、删除和查找。在顺序表中...