1、1,单链表(Singly Linked List) 循环链表(Circular List) 多项式及其相加 双向链表(Doubly Linked List) 稀疏矩阵,第二章 链表,2,单链表,特点每个元素(表项)由结点(Node)构成。线性结构 结点可以不连续存储表可扩充,3,单链表的存储映像,4,单链表中的插入与删除,插入第一种情况:在第一个结点前插入newnodelink = first ; first = newnode;,(插入前) (插入后),5,(插入前) (插入后),第二种情况:在链表中间插入newnodelink = plink; plink = newnode;,6,第三种
2、情况:在链表末尾插入newnodelink = plink; plink = last = newnode;,(插入前) (插入后),7,void List:Insert ( const int x, const int i ) /在链表第 i 个结点处插入新元素 x Node *p = first; int k = 0; while ( p != NULL ,8,删除 第一种情况: 删除表中第一个元素 第二种情况: 删除表中或表尾元素,在单链表中删除含ai的结点,9,带表头结点的单链表,表头结点位于表的最前端,本身不带数据,仅标志表头。 设置表头结点的目的是统一空表与非空表的操作,简化链表操
3、作的实现。,非空表 空表,10,在带表头结点的单链表:插入新结点,newnodelink = plink; if ( plink =NULL ) last = newnode;plink = newnode;,11,q = plink;plink = qlink;delete q;if ( plink = NULL ) last = p;,从带表头结点的单链表中删除一个结点,12,静态链表结构: 利用数组定义,运算过程中存储空间大小不变,13,循环链表 (Circular List),循环链表是单链表的变形。 循环链表最后一个结点的link 指针不为0(NULL),而是指向了表的前端。 为简化
4、操作,在循环链表中往往加入表头结点。 循环链表的特点是:只要知道表中某一结点的地址,就可搜寻到所有其他结点的地址。,14,循环链表的示例带表头结点的循环链表,15,用循环链表求解约瑟夫问题,约瑟夫问题的提法n 个人围成一个圆圈,首先从1开始一个人一个人顺时针报数, 报到第m个人,令其出列。然后再从下一个人开始,从1顺时针报数,报到第m个人,再令其出列,如此下去, 直到圆圈中只剩一个人为止。此人即为优胜者。 例如 n = 8 m = 3,16,17,约瑟夫问题的解法void Josephus ( int n, int m ) for ( int i=0; in-1; i+ ) /执行n-1次fo
5、r ( int j=0; jm-1; j+ ) Next ( );cout “Delete person ” getData ( ) endl; /数m-1个人Remove ( ); /删去 ,18,多项式及其相加,在多项式的链表表示中每个结点增加了一个数据成员link,作为链接指针。优点是: 多项式的项数可以动态地增长,不存在存储溢出问题。 插入、删除方便,不移动元素。,19,多项式(polynomial)类的链表定义 struct Term int coef; int exp; void Init ( int c, int e ) coef = c; exp = e; ;,20,多项式链表
6、的相加,AH = 1 - 10x6 + 2x8 +7x14 BH = - x4 + 10x6 - 3x10 + 8x14 +4x18,21,双向链表 (Doubly Linked List),双向链表是指在前驱和后继方向都能游历(遍历)的线性链表。 双向链表每个结点结构:前驱方向 后继方向 双向链表通常采用带表头结点的循环链表形式。,22,结点指向 p = plLinkrLink = prLinklLink,非空表 空表,23,搜索成功,搜索不成功,双向循环链表的搜索算法,24,plLink = current; prLink =currentrLink; currentrLink = p; current = currentrLink; currentrLinklLink = current;,双向循环链表的插入算法,25,currentrLinklLink = currentlLink; currentlLinkrLink = currentrLink;,双向循环链表的删除算法,