- 1、本文档共69页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构与算法-02-线性表
双向链表的插入操作 在结点 p 前插入q q-prior=P-prior; p-prior-next=q; q-next=p; p-prior=q; * 数据结构与算法课程组 * 请大家思考回答:如果在p后插入,将如何操作? x q b a P 双向链表的插入操作 void DLinkedListInsert(DLinkedList L,ElemType e, DLinkedList p) { q=(LNode *)malloc(sizeof(LNode)); ? if(q==NULL) { printf(申请空间失败!); exit(0); } q-data=e; ? q-prior=p-prior; p-prior-next=q; q-next=p; p-prior=q; } * 数据结构与算法课程组 * 算法评价 T(n) = O(1) 带头的双向循环链表的删除 * 数据结构与算法课程组 * 请大家思考回答:如果删除后表为空,如何操作? b c a p-next-prior=p-prior; P p-prior-next=p-next; free(p) 双向链表的删除操作 void LinkedListDel(LinkedList L, ElemType e) { p=L-next; while((p!=NULL)(p -data!=e)) p=p-next;//查找元素e if(p!==NULL) //找到需要删除的结点 { p-prior-next=p-next; p-next-prior=p-prior; free(p); } } * 数据结构与算法课程组 * 单向循环链表 循环链表是单链表的变形。循环链表尾结点的 next 指针不是 NULL,而是指向了表的前端。 为简化操作,在循环链表中往往加入表头结点。 a1 head a2 a3 an head a1 an head (空表,也要保留表头) (非空表) * 数据结构与算法课程组 * 循环链表的判空条件是:head-next == head。 循环链表的特点是:只要知道表中某一结点的地址,就可搜寻到所有其他结点的地址。 在搜寻过程中,没有一个结点的 next 域为空。 for (p = head-next; p != head; p = p-next ) do 搜索; 循环链表的所有操作的实现类似于单链表,差别在于检测到链尾,指针不为NULL,而是回到链头。 a1 head a2 a3 an * 数据结构与算法课程组 * 带尾指针的循环链表 rear a1 a2 a3 an 如果插入与删除仅在链表的两端发生,可采用带表尾指针的循环链表结构。 在表尾可直接插入新结点,时间复杂性 O(1); 在表尾删除时要找前驱,时间复杂性 O(n); 在表头插入相当于在表尾插入; 在表头可直接删除,时间复杂性 O(1)。 * 数据结构与算法课程组 * 顺序与链式存储结构比较 顺存储结构的特点 逻辑上相邻的元素,其物理位置也相邻; 可随机存取表中任一元素 必须按最大可能长度预分存储空间,存储空间利用率低,表的容量难以扩充,是一种静态存储结构 插入删除时,需移动大量元素,平均移动元素为n/2 链式存储结构的特点 逻辑上相邻的元素,其物理位置不一定相邻;元素之间的邻接关系由指针域指示 是非随机存取存储结构;对链表的存取必须从头指针开始 是一种动态存储结构; 插入删除运算非常方便;只需修改相应指针值 * * * * * * * * 顺序表相关操作的实现(8) 顺序表的删除操作 SeqListDel (L,i)删除L第i个元素,长length变为length-1 * 数据结构与算法课程组 * a1 a2 a3 a4 a5 a6 a7 ?? ?? 0 1 2 3 4 5 6 7 L.elem a5 删除 a1 a2 a3 a4 a6 a7 ?? ?? 0 1 2 3 4 5 6 7 L.elem 平均移动元素个数: bool SeqListDel ( SeqList L, int i ) { if ( i 1 i L.length) { printf(“i不合法”);//i值越界 return
文档评论(0)