1、第2章线性表2.5其他类型的链表静态链表循环链表双向链表其他类型的链表主要内容静态链表要解决的问题 动态存储空间的管理有一定的开销 获取和回收存储空间操作频繁会降低链表的效率 可以采用两种方法解决:- 静态链表,整个数组作为备用空间- 初始化备用链表,获取和回收均在备用链表上进行静态链表备用空间利用数组进行定义用下标值代替地址指示后继元素位置0 11 22 33 44 55 66 77 88 99 1010 0#define SpaceSize1000typedef struct NodeElementTypedata;int next;Node,CursorSpaceSpacesize;自己
2、管理备用空间实现malloc和free操作0 11 22 33 44 55 66 77 88 99 10100!Freelist: 可以使用的单元链接成自由链表!自由链表中下标0位置是头结点!下个结点的位置为0的结点是尾结点自由链表头头结点静态链表frelist123456789100012345678910frelist2header13456789100012345678910CursorAlloc用于模拟malloc()获取新结点自由链表的实现int CursorAlloc(void) /从自由链表上获取新的可点int p;p = CursorSpace0.next;CursorSpac
3、e0.next = CursorSpacep.next;return p; /函数返回获取到的结点下标从自由链表获取新结点frelist8header2c 3b 4e 5g 6f 7d19100012345678910frelist4header2c 3b 5e8g 6f 7d19100012345678910CursorFree模拟回收结点自由链表回收结点void CursorFree(int p) /将结点回收到自由链表上CursorSpacep.next = CursorSpace0.next;CursorSpace0.next = p; /连接到自由链表的头部回收结点的实现判断是否为末
4、尾:CursorSpacer.next != firstStatus Insert(elementType e, int p)int Tmpcell;Tmpcell = CursorAlloc();if(Tmpcell = 0)return ERROR;CursorSpaceTmpcell.data = e;CursorSpaceTmpcell.next = CursorSpacep.next;CursorSpacep.next = Tmpcell;return OK;在p的位置后面插入静态链表插入操作循环链表(Circular List) 循环链表是单链表的变形。 循环链表最后一个结点的li
5、nk 指针不为0 (NULL),而是指向了表的前端。 为简化操作,在循环链表中往往加入表头结点。 循环链表的特点是:只要知道表中某一结点的地址,就可搜寻到所有其他结点的地址。循环链表的示例带表头结点的循环链表template classCircList;template classCircListNodefriend classCircList;public:CircListNode( Typed 0 CircListNode ne t NULL) :d t ( d ) link ( ne t ) /构造函数private:Typed t ;CircListNode link;循环链表类的定义
6、template class CircListpublic: CircList( Type l e); CircList( );int Len t ( ) const; oole n s t ( ) return irst link irst; oole n ind ( const Type & l e );Type et t ( ) const;void irster ( ) c rrent irst; oole n irst ( ); oole n Ne t ( ); oole n rior ( );void nsert( const Type & l e);void e o e ( );
7、private: CircListNode irst c rrent l st;循环链表的插入循环链表对比单链表操作 空链表CircList( const Type & value ) last =first = new CircListNode( value );first-link = first;List ( const Type & value ) last =first = new ListNode( value );循环链表查找template CircListNode*List :Find ( Type value ) /在链表中从头搜索其数据值为value的结点CircList
8、Node*p = firstlink;/检测指针p 指示第一个结点while ( p != first &pdata != value ) p = plink;return(p!=first)?p:NULL;/ p 在搜索成功时返回找到的结点地址/ p 在搜索不成功时返回空值双向链表(Doubly Linked List) 向链表是指在前 后继 向 ( )的链表。 向链表个结点结 :前 向 后继 向 向链表用表头结点的循环链表形currency1。 lLink(左链指针) data(数据) rLink(右链指针)结点指向p =plLinkrLink= prLinklLink非空表 空表双向循环
9、链表类的定义template class lList;template class lNodefriend class lList;private:Type d t ; /数据 lNode lLink rLink; /指针 lNode( Type l e, /构造函数 lNode le t, lNode ri t ):d t ( l e),lLink(le t),rLink(ri t) lNode( Type l e ):d t ( l e),lLink(NULL),rLink(NULL) ;template class lListpublic: lL st(Type ni“ e l); lL
10、ist( );intLen t ( ) const;int s t ( )return irst rlink irst; int ind( const Type &t r et);Type et t ( ) const;void irster( ) c rrent irst; int irst( ); intNe t( );int rior( );int operator ( )returnc rrent NULL;void nsert ( const Type & l e);void e o e( );private: lNode irst, c rrent;搜索成功搜索不成功双向循环链表的
11、搜索算法template intDblList:Find ( const Type &target ) /在双向循环链表中搜索含target的结点,/搜索成功返回1,否则返回0。DblNode*p = firstrLink;while( p!=first &pdata!= target)p = prLink; /循链搜索if( p != first ) current = p; return1;return0;1、plLink= current;2、prLink=currentrLink;3、currentrLink= p;4、current = currentrLink;5、currentr
12、LinklLink= current;双向循环链表的插入算法非空表插入 空表插入12345te l te cl ss fi efl oid lListfi efl nsert ( const fi e l e ) i ( c rrent NULL ) 空表形c rrent irst rLink ne lNode( l e irst irst )else 空表形c rrent rLink ne lNode( l e c rrent c rrent rLink)c rrent c rrent rLinkc rrent rLink lLink c rrent”c rrent rLink lLink
13、c rrent lLink ”c rrent lLink rLink c rrent rLink双向循环链表的删除算法12template void lList: e o e ( ) if( c rrent NULL) lNode te c rrent; /被删结点c rrent c rrent rLink; /下一结点c rrent lLink te lLink; /从链中摘下te lLink rLink c rrent;deletete ; 删去if ( c rrent irst)if( s t ( ) )c rrent NULL;else c rrent c rrent rLink;其他
14、双向循环链表的公共操作template lList: lList( Type ni“ e l) /双向循环链表的构造函数, 创建表头结点 irst new lNode( ni“ e l); irst rLink irst lLink irst;c rrent NULL;template int lList:Len t ( ) const /求双向循环链表的长度(不计表头结点) lNode irst rLink;intco nt 0;while ( irst ) rLink; co nt;returnco nt;template int lList: irst ( ) if ( s t ( ) ) /跳过表头结点的第一个c rrent irst rLink; return ;c rrent NULL; return0;template int lList:Ne t ( )if ( c rrent rLink irst )c rrent NULL; return 0;c rrent c rrent rLink; return;template int lList: rior( ) if ( c rrent lLink irst )c rrent NULL; return0;c rrent c rrent lLink; return;