可以看到代碼寫的相當(dāng)專業(yè),應(yīng)該比國內(nèi)所有數(shù)據(jù)結(jié)構(gòu)教材上的代碼漂亮多了^_^,不知道我什么時候也能寫出如此瀟灑的代碼
/*
************************************************
?*???????????????????????????????????????????????*
?*??Module:?list.h???????????????????????????????*
?*??Description:?????????????????????????????????*
?*??????Interface?to?an?abstract?linked?list.????*
?*??Author:?T.H.?Janssen?????????????????????????*
?*??????????Van?Oostenrijk,?A.C.?????????????????*
?*??Modifications:???????????????????????????????*
?*???????????????????????????????????????????????*
?*************************************************
?*???????????????????????????????????????????????*
?*???This?program?is?free?software;?you?can??????*
?*???redistribute?it?and/or?modify??it?under?????*
?*???the?terms?of?the?GNU?General?Public?????????*
?*???License?as?published?by?the?Free????????????*
?*???Software?Foundation;?either?version?2???????*
?*???of?the?License,?or?(at?your?option)?any?????*
?*???later?version.??????????????????????????????*
?*???????????????????????????????????????????????*
?************************************************
*/
#ifndef?LIST_H
#define
?LIST_H
#include?
"
defs.h
"
/*
************************************************
?*???????????????????????????????????????????????*
?*??TYPES????????????????????????????????????????*
?*???????????????????????????????????????????????*
?************************************************
*/
/*
?Type?specifier?of?the?data?cleanup?function
?*?which?is?used?by?the?linked?list?when?removing
?*?nodes.
?*
?*?example:
?*?BOOL?remove?(void?*data);
?
*/
typedef?BOOL?(?
*
DeleteFunction?)(?
void
?
*
?);
/*
?*?Definition?of?a?node?for?an?abstract?double
?*?linked?list?*
?
*/
typedef?
struct
?ListNode
{
????
void
?
*
data;?????????
//
抽象的通用雙鏈表,可以存儲各種數(shù)據(jù),但取出時需要轉(zhuǎn)化成對應(yīng)的指針
????
struct
?List?
*
list;
????
struct
?ListNode?
*
prev;??
//
前驅(qū)
????
struct
?ListNode?
*
next;??
//
后繼
}?ListNode;
/*
?*?Every?list?is?stored?in?its?own?instance?of
?*?this?structure.
?
*/
typedef?
struct
?List
{
????ListNode?
*
first;????
//
指向第一個節(jié)點(diǎn)
????ListNode?
*
last;?????
//
指向最后一個節(jié)點(diǎn)
????ListNode?
*
current;??????
//
內(nèi)部維護(hù)可以移動的指針
????
//
用于記錄注冊的刪除函數(shù),刪除節(jié)點(diǎn)時回調(diào)刪除函數(shù)
????DeleteFunction?deleteFunction;
}?List;
/*
************************************************
?*???????????????????????????????????????????????*
?*??FUNCTION?DECLARATIONS????????????????????????*
?*???????????????????????????????????????????????*
?************************************************
*/
/*
?*?Allocates?resources?for?a?list?and?intializes?it
?*?to?no?items?(empty).
?*
?*?Returns?a?pointer?to?the?newly?created?list.
?*?注冊刪除節(jié)點(diǎn)
?
*/
List?
*
ListInit(?DeleteFunction?deleteFunction?);
/*
?*?This?function?cleans?up?the?entire?list?using?either?the
?*?default?clean?callback?(if?the?second?parameter?is?NULL)?or
?*?the?given?callback.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?*
?*?Post:?The?linked?list?is?empty,?and?the?element?memory
?*???????released.
?*???????IMPORTANT:?The?list?structure?itself
?*??????????????????is?also?deleted!
?
*/
void
?ListPurge(?List?
*
list,?DeleteFunction?deleteFunction?);
/*
?*?This?function?cleans?up?the?entire?list,?but?does?not
?*?free?the?memory?for?the?elements?(it?unlinks?them).
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?*
?*?Post:?The?linked?list?is?empty.
?*???????IMPORTANT:?The?list?structure?itself
?*??????????????????is?also?deleted!
?
*/
void
?ListClear(?List?
*
list?);
/*
?*?Inserts?a?new?node?in?front?of?current?node.
?*
?*?Always?returns?TRUE.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?*?貌似命名為ListInsertBeforeCurrent更好點(diǎn)
?
*/
BOOL?ListInsert(?List?
*
list,?
void
?
*
data?);
/*
?*?Appends?a?new?node?at?the?back?of?list.
?*
?*?Always?returns?TRUE.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?
*/
BOOL?ListAppend(?List?
*
list,?
void
?
*
data?);
/*
?*?Removes?current?node?from?list?[list],?but
?*?does?not?delete?its?data.
?*
?*?Returns?the?data?pointer.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?
*/
void
?
*
ListUnlink(?List?
*
list?);
/*
?*?Removes?current?node?from?list.?If?no?clean?callback?is
?*?provided?the?default?is?used,?which?is?either?the?callback
?*?specified?at?ListInit?or?free().
?*
?*?Returns?TRUE?on?success,?or?FALSE?if?there?was?no
?*?current?node?to?delete.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?
*/
BOOL?ListRemove(?List?
*
list,?DeleteFunction?deleteFunction?);
/*
?*?Moves?the?current?node?pointer?to?the?last
?*?node?in?the?list.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?
*/
void
?ListLast(?List?
*
list?);
/*
?*?Moves?the?current?node?pointer?to?the?first
?*?node?in?the?list.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?
*/
void
?ListFirst(?List?
*
list?);
/*
?*?Moves?the?current?node?pointer?one?node
?*?further?up?the?list.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?
*/
void
?ListNext(?List?
*
list?);
/*
?*?Moves?the?current?node?pointer?one?node
?*?down?the?list.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?
*/
void
?ListPrev(?List?
*
list?);
/*
?*?Returns?the?data?pointer?of?the?current
?*?node.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?
*/
void
?
*
ListGet(?List?
*
list?);
/*
?*?Returns?the?number?of?nodes?in?the?list.
?*
?*?Pre:??[list]?is?a?valid?linked?list.
?
*/
int
?ListSize(?List?
*
list?);
/*
************************************************
?*???????????????????????????????????????????????*
?*??EXTENDED?LINKED?LIST?FUNCTIONS???????????????*
?*???????????????????????????????????????????????*
?*??和上面的命名類似函數(shù)的不同之處:
????上面的函數(shù)移動內(nèi)部的指針,
????而下面的函數(shù)返回指向節(jié)點(diǎn)的指針
?************************************************
*/
/*
?*?Return?first?ListNode?in?list?[list].?If?the?list?is
?*?empty,?return?NULL.?The?returned?list?node
?*?may?be?used?to?iterate?through?the?list
?*?using?ListNextEx.
?*
?*?Pre:??[list]?if?a?valid?linked?list.
?*?如果將節(jié)點(diǎn)指針抽象的理解為位置,那么該函數(shù)類似STL中的find_first_of
?
*/
ListNode?
*
ListFirstEx(?List?
*
list?);
/*
?*?Return?last?ListNode?in?list?[list].?If?the?list?is
?*?empty,?return?NULL.?The?returned?list?node
?*?may?be?used?to?iterate?through?the?list
?*?using?ListNextEx.
?*
?*?Pre:??[list]?if?a?valid?linked?list.
?
*/
ListNode?
*
ListLastEx(?List?
*
list?);
/*
?*?Return?the?ListNode?after?the?supplied
?*?ListNode?[node].?If?there?is?no?next?node,
?*?ListNextEx?returns?NULL.
?*
?*?Pre:??[node]?is?a?valid?ListNode.
?
*/
ListNode?
*
ListNextEx(?ListNode?
*
node?);
/*
?*?Return?the?ListNode?before?the?supplied
?*?ListNode?[node].?If?there?is?no?prev?node,
?*?ListPrevEx?returns?NULL.
?*
?*?Pre:??[node]?is?a?valid?ListNode.
?
*/
ListNode?
*
ListPrevEx(?ListNode?
*
node?);
/*
?*?Delete?node?[node]?from?list,?and?return
?*?next?node.?Return?NULL?if?there?is?no
?*?next?node.
?*?This?function?deletes?the?node?contents.
?*
?*?Pre:??[node]?is?a?valid?ListNode.
?
*/
ListNode?
*
ListRemoveEx(?ListNode?
*
node?);
/*
?Unlink?node?[node]?from?list.
?*?This?function?returns?the?node?contents.
?*
?*?Pre:??[node]?is?a?valid?ListNode.
?
*/
void
?
*
ListUnlinkEx(?ListNode?
*
node?);
/*
************************************************
?*???????????????????????????????????????????????*
?*??LIST?TEST?CODE???????????????????????????????*
?*???????????????????????????????????????????????*
?************************************************
*/
/*
?*?Tests?the?linked?list.?Returns?TRUE?if?the
?*?test?was?successful,?or?FALSE?if?it?failed
?*?(something?went?wrong).
?
*/
BOOL?TestList();
#endif
?