引言
链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。
链表由一系列结点(链表中每一个元素称为结点)组成,结点可以在运行时动态生成。
每个结点包括两个部分:一个是存储数据元素的数据域,另一个是存储下一个结点地址的指针域。
相比于线性表顺序结构,操作复杂。由于不必须按顺序存储,链表在插入的时候可以达到O(1)的复杂度,比另一种线性表顺序表快得多,但是查找一个节点或者访问特定编号的节点则需要O(n)的时间,而线性表和顺序表相应的时间复杂度分别是O(logn)和O(1)。
使用链表结构可以克服数组链表需要预先知道数据大小的缺点,链表结构可以充分利用计算机内存空间,实现灵活的内存动态管理。但是链表失去了数组随机读取的优点,同时链表由于增加了结点的指针域,空间开销比较大。
链表最明显的好处就是,常规数组排列关联项目的方式可能不同于这些数据项目在记忆体或磁盘上顺序,数据的存取往往要在不同的排列顺序中转换。链表允许插入和移除表上任意位置上的节点,但是不允许随机存取。
链表有很多种不同的类型:单向链表,双向链表以及循环链表。
单向链表
概念:单向链表(单链表)是链表的一种,其特点是链表的链接方向是单向的,对链表的访问要通过顺序读取从头部开始;链表是使用指针进行构造的列表;又称为结点列表,因为链表是由一个个结点组装起来的;其中每个结点都有指针成员变量指列表中的下一个结点;
列表是由结点构成,由head指针指向第一个成为表头的结点而终止于最后一个指向NULL的指针;
/**2015年2月27日16:42:27 by:我愛編程**/ /**功能:创建、插入、打印单链表(SingleLinkList--SLL)**/ #include <stdio.h> #include <malloc.h> //0.单链表(SLL)结点 typedef struct node { char data; //数据域 struct node *next; //指针域 }LNode; //1.初始化单链表(SLL),返回链表头指针 LNode *InitSLL() { //开辟头结点 LNode *head = NULL; //初始化是否成功 if ( NULL != (head = (LNode *)malloc(sizeof(LNode))) ) head->next = NULL; return head; } //2.往单链表(SLL)中插入(Insert)结点之“头插法” ///head --- 链表头指针 ///data --- 要插入的数据 int InsertNode1(LNode *head, char data) { LNode *pNode1 = NULL; int YesNo = 0; //默认结点开辟失败 //结点开辟是否成功 if ( NULL != (pNode1 = (LNode *)malloc(sizeof(LNode))) ) { pNode1->data = data; //将结点插入链表(SLL)头部 pNode1->next = head->next; head->next = pNode1; YesNo = 1; } return YesNo; } //3.打印单链表(SLL) ///head --- 链表头指针 void DisPlaySLL(LNode *head) { LNode *h = head->next; while (NULL != h) { printf("%c ",h->data); h = h->next; } } int main(void) { LNode *head = NULL; //1.初始化单链表(SLL) head = InitSLL(); //2.插入结点“头插法” InsertNode1(head,'a'); InsertNode1(head,'b'); InsertNode1(head,'c'); InsertNode1(head,'d'); InsertNode1(head,'e'); //3.打印单链表(SLL) DisPlaySLL(head); return 0; }
循环链表
概念:循环链表是另一种形式的链式存贮结构。它的特点是表中最后一个结点的指针域指向头结点,整个链表形成一个环。
这里,我们将上述的单向链表的初始化部分稍作修改就形成了一个循环单链表。
//1.初始化循环链表(CL),返回链表头指针 LNode *InitCL() { //开辟头结点 LNode *head = NULL; //初始化是否成功 if ( NULL != (head = (LNode *)malloc(sizeof(LNode))) ) { //这里用“#”标记head结点 head->data = '#'; //将链表首尾链接起来~~~ head->next = head; } return head; }
(未完待续……)
参考文献:
1)百度百科,链表,http://baike.baidu.com/view/549479.htm,2015年2月27日17:22:48
2)百度百科,单向链表,http://baike.baidu.com/view/2073053.htm,2015年2月27日17:23:05
3)百度百科,循环链表,http://baike.baidu.com/view/178643.htm,2015年2月27日17:49:00