数据结构----单链表分析及实现

来源:互联网 发布:知乎帐号异常 编辑:程序博客网 时间:2024/06/07 16:10

一、 链表特点

链表,即物理结构上非连续的顺序表,拥有顺序表的所有特点:

1、n 个相同类型元素的有限集合;

2、除了第一个元素只有一个后继、最后一个元素只有一个前驱以外,其他所有元素都有一个直接前驱和一个直接后继(类似于排队)。

除此之外,链表相比于顺序存储的顺序表(例如数组)还有自己的特点:

1、逻辑结构相邻的两个元素在物理上并非一定相邻;

2、除了需要空间存储数据本身,还需要一个指针域指明下一个元素的地址。

二、链表分类

分类:单链表、双向列表、单项循环列表、双向循环列表。

单链表:最简单的链表,一个节点只有一个指针域,指向下一个节点。最后一个节点指针域指向NULL;

双向列表:一个节点有两个指针域,分别指向前驱和后继。最后一个节点的两个指针域指向NULL;

单项循环列表:在单链表的基础上,让最后一个节点的指针域指向第一个节点。

双向循环列表:在双向列表的基础上,让最后一个节点的后继指针指向第一个节点,让第一个节点的前驱指针指向最后一个节点。

本文先介绍最简单的单链表。

三、链表结构

一个单链表由一个表头和若干个节点组成。其中表头和节点都必须包含一个指针域,因此可以将指针域单独定义,在表头和数据节点上包含一个指针域即可,指针域定义如下:

typedef struct _tag_ListNode ListNode;         struct _tag_ListNode {        ListNode *next;};       


可见,指针域实质就是一个结构体,该结构体只有一个指向结构体本身的指针。定义完指针域就可以定义链表头了:

typedef struct _tag_List{        ListNode head;        int length;}TList;


链表头定义两个域即可,一个指针域,指向第一个元素,一个当前列表长度。

定义数据节点:

typedef struct _tag_data{        ListNode node;        int dat;}Data;


数据节点的数据域就是用户要存储的数据,具体类型要视用户需求而定。这里为求简便,用了一个int型的数据。

、链表的相关操作

1、链表的创建:TList* Create_List()

链表的创建实际就是从堆空间分配一个链表头的空间,然后返回其地址。

   2、链表的销毁:int Destroy_List(List* list)

free掉从堆空间申请到的链表头。

3、清空链表:int Clear_List(List* list)

       不同于销毁,清空链表只是将length域清零,然后让node指向NULL。

   4、插入元素:ListNode* Insert_Element(List* list, ListNode* data, int pos)

将指定的节点插入到指定的链表的指定位置。

   5、获取元素:ListNode* Get_Element(List* list, int pos)

从指定的链表的指定位置获取节点元素。

   6、删除元素:ListNode*Delete_Element(List* list, int pos)

从指定的链表的指定位置删除节点元素。

五、代码实现

为方便管理,将代码托管在GitHub:  单链表代码实现





0 0
原创粉丝点击