文档详情

数据结构7-线性表的链式表示与实现.ppt

发布:2016-12-13约3.7千字共25页下载文档
文本预览下载声明
数 据 结 构 第七课 线性表的链式表示与实现 第八课:线性表的链式表示与实现 二、线性链表的概念: 1.线性链表:以链式结构存储的线性表称之为线性链表。 特点是该线性表中的数据元素可以用任意的存储单元来存储。线性表中逻辑相邻的两元素的存储空间可以是不连续的。 插入、删除操作是不再需要移动大量的元素,但失去了顺序表的可随机存取特点。 2.结点(Node):数据元素的映象用一个结点来表示。结点的一个域表示元素本身,称为数据域, 另一个域是能指示其后继的指针 ,称为指针域, 用来表示线性表数据元素的逻辑关系。 3﹑用线性链表表示线性表时,数据元素之间的逻辑关系是由结点中的指针指示的 链式结构存储的线性表实例 链表的种类 链表可分为单链表、循环链表和双向链表。 单链表:链表中的每一个结点中只包含一个指针域的称为单链表或线性链表。 二、线性链表(单链表)的存储实现 struct LNODE{ ElemType data; struct LNODE *next; }; typedef struct LNODE LNode; typedef struct LNODE * LinkList; 三、线性表(单链表)的操作实现(类C语言)(1) 1. 初始化操作 Status Init_L(LinkList L){ if (L=(LinkList *)malloc(sizeof(LNode))) {L-next=NULL;return 1;} else return 0; } 三、线性表(单链表)的操作实现(类C语言)(2) 2. 插入操作:要在数据元素a和b 之间插入元素x。 算法思想:决定a和b之间的相邻关系是由a 的指针决定的。若要实现插入,生成x结点,然后让a 的指针指向x 且x 的指针指向b。实现三个元a、x和b的逻辑关系。 设p为指向结点a 的指针,s为指向结点x的指针,则修改s、a的指针: s→next=p→next;p→next=s; 插入操作 Status ListInsert_L(LinkList L,int i,ElemType e){ p=L,j=0; while(pji-1){p=p-next;++j;} if(!p||ji-1) return ERROR; s=(LinkList)malloc(sizeof(LNode)); s-data=e;s-next=p-next; p-next=s; return OK; }//ListInsert_L 三、线性表(单链表)的操作实现(类C语言)(3) 3. 删除操作:在单链表数据元素a、b、c三个相邻的元素中删除b, 算法思想:就是要让a 的指针直接指向c,使b从链表中脱离。 即,p→next=p→next→next Status ListDelete_L(LinkList L,int i,ElemType e){ p=L,j=0; while(pji-1){p=p-next;++j;} if(!p-next||ji-1) return ERROR; q=p-next;p-next=q-next; e=q-data;free(q); return OK; }//ListDelete_L 三、线性表(单链表)的操作实现(类C语言)(4) 4.取某序号元素的操作 算法思想:单链表是非随机存取结构。每个元素的位置信息都包含在前驱结点的信息中,所以取得第i个元素必须从头指针出发寻找。设置一个指针变量指向第一个结点,然后,让该指针变量逐一向后指向,直到第i个元素。 取某序号元素的操作 Status GetElem_L(LinkList L,int i,ElemType e){ p=L-next , j=1; while(pji){p=p-next;++j;} if(!p||ji) return ERROR; e=p-data; return OK; }//GetElem_L 三、线性表(单链表)的操作实现(类C语言)(5) 5.归并两个单链表的操作 例:将两个有序链表合并为一个有序链表。 算法思想:设立三个指针pa、pb和pc 分别用来指向两个有序链表和合并表的当前元素。比较两个表的当前元素的大小,将小的元素链接到合并表中,即,让合并表的当前指针指向该元素,然后,修改指针。在归并两个链表为一个链表时,不需要另建新表的结点空间,而只需将原来两个链表中结点之间的关系解除,重新建立关系。 归并两个单链表的操作 void
显示全部
相似文档