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

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

单链表介绍

单链表(简称为链表)由各个元素之间通过一个指针彼此链接起来而组成。每个元素包含两个部分:数据成员和一个称为next的指针。通过采用这种二成员的结构,将每个元素的next指针设置为指向其后面的元素(见图1)。最后一个元素的next指针设置为NULL,简单的表示链表的尾端。链表开始处的元素是“头”,链表未尾的元素称为尾。

要访问链表中的某个元素,从链表头开始,通过next指针从一个元素到另一个元素连续地遍历直到找到所需要的那个元素为止。以单链表来说,只能以一个方向进行遍历:从头到尾,因为每个元素并没有维护指向其前一个元素的链接。

从概念上说,可以把链表想象成一系列连续的元素。然而,由于这些元素是动态分配的(在C语言中调用malloc),因此很重要的一点是,切记这些元素通常实际上都是分散在内存空间中的(见图2)。元素与元素之前的链接关系只是为了确保所有的元素都可以访问到。带着这种思考,我们将会看到当维护元素之间的链接信息时需要特别小心。如果我们错误地丢失了一个链接,则从这个位置开始,往后的所有元素都无法访问到了。“你的弱点有多弱,你的强度就有多强”,非常适用于描述链表的特点。

单链表接口的定义

list_init  



void list_init(List *list,void (*destroy)(void *data));

返回值 无

描述  初始化由list指定的链表。

该函数必须在链表做其他操作之前调用。当调用list_destroy时,destroy参数提供了一种释放动态分配的数据的方法。例如,如果链表包含采用malloc动态分配的数据,当链表被销毁时,destroy应该设置为free用来释放数据。对于包含好几个动态分配成员的结构化数据,destroy应该设置为一个用户自定义的析构函数,通过对每一个动态分配的成员以及对结构体自身调用free来释放数据。如果链表包含不应该释放的数据,destroy应该设置为null。

复杂度   O(1)

list_destroy



void list_destroy(List *list);

返回值 无

描述  销毁由参数list指定的链表。

调用list_destroy后任何其他的操作都不允许执行,除非再次调用list_init。list_destroy将链表中所有的元素都移除,如果传给list_init的参数destroy不为null,则移除链表中每个元素时都调用该函数一次。

复杂度  O(n),n代表链表中的元素个数

list_ins_next



int list_ins_next(List *list,ListElmt *element,const void *data);

返回值  如果插入元素成功则返回0,否则返回-1.

描述  在list指定的链表中element后面插入一个新元素。

如果element设置为NULL,则新元素插入链表头部。新元素包含一个指向data的指针,因此只要该元素还在链表中,data所引用的内存空间就应该保持合法。管理data所引用的存储空间是调用者的责任。

复杂度  O(1)

list_rem_next



int list_rem_next(List *list,ListElmt *element,void **data);

返回值  如果移除元素成功则返回0,否则返回-1.

描述  移除由list指定的链表中element后面的那个元素。

如果element被设置为NULL,则移除链表头元素。调用返回后,data指向已移除元素中存储的数据。由调用者负责管理data所引用的存储空间。

复杂度  O(1)

list_size



int list_size(const List *list);

返回值  链表中元素的个数。

描述  这是一个宏,用来计算由参数list指定的链表中的元素的个数。

复杂度  O(1)

list_head



ListElmt *list_head(const List *list);

返回值  指向链表中头元素的指针。

描述  这是一个宏,返回由参数list指定的链表中头元素的指针。

复杂度  O(1)

list_tail



ListElmt *list_tail(const List *list);

返回值  指向链表中尾元素的指针。

描述  这是一个宏,返回由参数list指定的链表中尾元素的指针。

复杂度  O(1)

list_is_head



int list_is_head(const ListElmt *element);

返回值  如果element所指定的元素是链表头结点则返回1,否则返回-1.

描述  这是一个宏,用来判断由element所指定的元素是否是链表的链表头结点。

复杂度  O(1)

list_is_tail



int list_is_tail(const ListElmt *element);

返回值  如果element所指定的元素是链表尾结点则返回1,否则返回-1.

描述  这是一个宏,用来判断由element所指定的元素是否是链表的链表尾结点。

复杂度  O(1)

list_data



void  *list_data(const ListElmt *element);

返回值   节点中保存的数据。

描述  这是一个宏,返回由element所指定的链表节点元素中保存的数据。

复杂度  O(1)

list_next



ListEmlt *list_next(const ListElmt *element);

返回值  返回由element所指定的节点的下一个节点。

描述  这是一个宏,返回链表中由element所指定的结点的下个节点。

复杂度  O(1)

时间: 2025-01-15 17:12:11

数据结构 链表_单链表的接口定义的相关文章

数据结构之_单链表的实现

数据结构之_单链表的实现 1.基本概念 链式存储定义 为了表示每个数据元素与其直接后继元素之间的逻辑关系,每个元素除了存储本身的信息外,还需要存储指示其直接后继的信息. 单链表 线性表的链式存储结构中,每个节点中只包含一个指针域,这样的链表叫单链表. 通过每个节点的指针域将线性表的数据元素按其逻辑次序链接在一起(如图). 概念解释: 表头结点 链表中的第一个结点,包含指向第一个数据元素的指针以及链表自身的一些信息 数据结点 链表中代表数据元素的结点,包含指向下一个数据元素的指针和数据元素的信息

PHP数据结构之实现单链表

学习PHP中,学习完语法,开始尝试实现数据结构,今天实现单链表 <?php class node //节点的数据结构 { public $id; public $name; public $next; public function __construct($id,$name) //构造函数 { $this->id=$id; $this->name=$name; $this->next=null; } } class linklist //链表的数据结构 { private $he

数据结构学习之单链表基本操作

数据结构学习之单链表基本操作 0x1 前言 今天实验课,学习了下单链表的写法,这里记录下. 0x2 正文 题目要求如下: 本实验的单链表元素的类型为char,完成如下实验要求: (1)初始化单链表h (2)采用尾插法依次插入a.b.c.d.e (3)输出单链表h (4)输出单链表h的长度 (5)判断单链表h是否为空 (6)输出单链表h的第3个元素 (7)输出元素a的逻辑位置 (8)在第4个元素位置上插入元素f (9)输出单链表h (10)删除单链表h的第3个元素 (11)输出单链表h (12)释

数据结构 线性表—单链表

本文只要实现单链表的初始化.插入(尾插.头插.任意位置插入).删除(尾删.头删.删除指定元素).查找等. 定义单链表 typedef int DataType; typedef struct LinkNode {  DataType data;  struct LinkNode *next; }LinkNode, *pLinkNode, *pList; 实现单链表的所有接口: void InitLinkList(pList* pHead);//单链表的初始化 void Destroy(pList

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

【数据结构】顺序存储单链表

数据结构之单链表的顺序存储实现 闲来无事,回顾下以前学过的数据结构,写个玩玩,理论的东西就不多说了,网上一搜一大堆: 重要的是需要掌握这种数据结构的思想,整个数据结构这门课最重要的也是思想! 下面是代码: //====================================================================== // // Copyright (C) 2014-2015 SCOTT // All rights reserved // // filename:

厦门大学数据结构期末考试单链表问题

因为过几天要去参加厦门大学的夏令营,提前刷了下厦门大学往年的期末考试试卷. 卷中有这么一道题目: 有一个单链表,其结点的元素值以递增顺序排列,给出数据结构,并编写一个算法删除该单链表中元素值相同的结点. 算法如下: 从头到尾扫描单链表,若当前结点和后继结点的值不相同,则指针后移,若相同,则删除该后继结点. 1 #include "stdio.h" 2 3 typedef struct Node{ 4 int data; 5 struct Node *next; 6 }Node, *Li

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

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

【c++版数据结构】之单链表的实现(带头结点以及尾节点)

所实现的单链表的结构如下图所示: 头文件:SList.h #include<iostream> #include<cassert> using namespace std; typedef enum{FALSE,TRUE}Status; template<class Type> class List; template<class Type> class ListNode { friend class List<Type>; //友元类可以访问该