数据结构电子教案-深圳大学-自动化课件-ds-02.pptVIP

  • 6
  • 0
  • 约2.82万字
  • 约 116页
  • 2017-06-05 发布于四川
  • 举报

数据结构电子教案-深圳大学-自动化课件-ds-02.ppt

* 循环链表的搜索算法 template class T, class E CircListNodeT, E * CircListT, E::Search( T x ) { //在链表中从头搜索其数据值为 x 的结点 current = first-link; while ( current != first current-data != x ) current = current-link; return current; } * 带尾指针的循环链表 rear 31 48 15 57 22 如果插入与删除仅在链表的两端发生,可采用带表尾指针的循环链表结构。 在表尾插入,时间复杂性 O(1) 在表尾删除,时间复杂性 O(n) 在表头插入,相当于在表尾插入 在表头删除,时间复杂性 O(1) * 用循环链表求解约瑟夫问题 约瑟夫问题的提法 n 个人围成一个圆圈,首先第 1 个人从 1 开始,一个人一个人顺时针报数, 报到第 m 个人,令其出列。然后再从下一 个人开始,从 1 顺时针报数,报到第 m 个人,再令其出列,…,如此下去, 直到圆圈中只剩一个人为止。此人即为优胜者。 用不带表头结点的循环链表来组织。 * 例如 n = 8 m = 3 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 * n = 8 m = 3 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 0 1 2 3 4 5 6 7 1 2 3 4 5 6 7 8 * 求解Josephus问题的算法 #include iostream.h #include “CircList.h” template class T, class E void Josephus(CircListT, E Js, int n, int m) { CircLinkNodeT, E *p = Js.getHead(), *pre = NULL; int i, j; for ( i = 0; i n-1; i++ ) { //执行n-1次 for ( j = 1; j m; j++) //数m-1个人 { pre = p; p = p-link; } cout “出列的人是” p-data endl; * pre-link = p-link; delete p; //删去 p = pre-link; } }; void main() { CircListint, int clist; int i, n m; cout “输入游戏者人数和报数间隔 : ”; cin n m; for (i = 1; i = n; i++ ) clist.insert(i, i); //约瑟夫环 Josephus(clist, n, m); //解决约瑟夫问题 } * 双向链表 (Doubly Linked List) 双向链表是指在前驱和后继方向都能游历(遍历)的线性链表。 双向链表每个结点结构: 双向链表通常采用带表头结点的循环链表形式。 前驱方向 ? ? 后继方向 lLink data rLink * 结点指向 p == p-lLink-rLink == p-rLink-lLink 非空表 空表 p-lLink p-rLink p lLink rLink first first * 双向循环链表类的定义 template class T struct DblNode { //链表结点类定义 T data; //链表结点数据 DblNodeT *lLink, *rLink; //前驱、后继指针 DblNode

文档评论(0)

1亿VIP精品文档

相关文档