您的位置:首页 > 理论基础 > 数据结构算法

数据结构-线性表--单链表

2014-11-13 17:32 127 查看
链式存储结构存储线性数据元素的方法是,把存储有数据元素的节点用指针域构造成链;指针式指向物理存储单元(在malloc的时候其实是申请的 内存空间)地址的变量,一个由数据元素域及一个或若干个指针域组成的结构体称为一个节点。链式存储结构的线性表是链表。
一,单链表
1,单链表的存储结构:
单链表中,构成链表的节点只有一个指向后继节点的指针域。
单链表的表示形式:
typedef struct Node{
DataType data;
struct Node *next;
}SLNode;
data 域用来存放数据元素,next域用来存放指向下一个节点的指针。
链表允许在任何位置进行插入或删除操作。
单链表有带头结点结构和不带头结点结构两种。
把指向单链表的指针称为头指针。头指针所指的不存放数据元素的第一个节点称为头结点。存放第一个数据元素的节点称为第一个数据元素节点。第一个数据的节点称为第一个数据元素节点,第一个数据元素节点在带头节点的单链表中是链表中的第二个节点;在不带头结点的单链表中是链表中的第一个节点。
链式存储结构由于只有在存储数据的时候才申请动态空间,在不同时刻申请的内存地址可能不连续,所以在链式存储结构中,两个在逻辑上相邻的数据元素在物理上不一定相邻,数据元素的逻辑是通过链中的指针链接起来的。
2,带头结点单链表和不带头结点的单链表的比较
(1),带头结点的单链表:设头指针为head,则第一个数据元素节点前插入结点时,不会改变头指针head的值,改变的是头指针所指的头结点的指针域的值,即改变的是:head->next的值,这与其他数据元素节点前插入节点的过程相同。当删除第一个数据元素节点时,不会改变头指针head的值,改变的是头指针所指的指针域的值,即改变的是head->next的值,同样,这与删除其他位置数据元素节点的过程相同。
(2),不带头结点的单链表:在第一个数据元素前插入节点时,头指针head的值将改变为等于指针s的值,在其他数据元素节点前插入节点时,头指针head的值不会改变,改变的是指针p->next的值。删除单链表的第一个数据元素节点时,头指针head的值将改变为等于head=head->next;即头指针等于原head->next的值;删除其他位置的数据元素节点时,头指针head的值将不会改变,改变的是指针p->next的值。
(3),设计单链表带头结点,则无论是在第一个数据元素节点前插入还是在其他数据元素节点前插入,都不会改变头指针的值;若设计不带头结点的单链表,则在第一个数据元素节点前插入和其他数据元素节点前插入算法的处理方式一样,所以在设计链表的时候设计成带头结点的单链表会对算法处理比较容易。
3,单链表的效率分析:
在单链表插入和删除一个数据元素节点的平均时间复杂度为T(n)=O(n);
二,单向循环链表:
循环单链表的特点是链表中最后一个节点的指针域不再是结束标志,而是指向整个链表的第一个节点,从而使链表形成一个环。
单链表和循环单链表的区别:单链表的特点是,从链表头到链表尾比较方便,但无法从链表尾到链表头;和单链表相比,循环单链表的长处是从链表尾到链表头比较方便。
三,双向链表:
双向循环链表中,每个节点除后继节指针域外还有一个前驱指针域。
单链表的形式:
typedef struct Node{
DataType data;
struct Node *next;
struct Node *prior;
}DLNode;

                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: