雙向鍊錶的應用背景主要是單向鍊錶只能順序訪問,逆序訪問單向鍊錶(尤其是較大的單向鍊錶是一件極其費時費力的工作),相比於單向鍊錶,雙向鍊錶增加了乙個域,這個域裡面增加了乙個指向前驅節點的指標,使得整個鍊錶可以順序訪問或者逆序訪問,來去自如;
//定義的雙向鍊錶的標頭檔案,裡面包含了雙向鍊錶的宣告和資料型別的定義;
#ifndef _my_doublelist_h
#define _my_doublelist_h
typedef
void dlinklist;
typedef
struct _tag_dlinklistnode
dlinklistnode;
dlinklist*
dlinklist_create()
;void
dlinklist_destroy
(dlinklist* list)
;void
dlinklist_clear
(dlinklist* list)
;int
dlinklist_length
(dlinklist* list)
;int
dlinklist_insert
(dlinklist* list, dlinklistnode* node,
int pos)
;dlinklistnode*
dlinklist_get
(dlinklist* list,
int pos)
;dlinklistnode*
dlinklist_delete
(dlinklist* list,
int pos)
;//游標相關的函式
dlinklistnode*
dlinklist_deletenode
(dlinklist* list,dlinklistnode* node)
;dlinklistnode*
dlinklist_reset
(dlinklist* list)
;dlinklistnode*
dlinklist_current
(dlinklist* list)
;dlinklistnode*
dlinklist_next
(dlinklist* list)
;dlinklistnode*
dlinklist_prior
(dlinklist* list)
;#endif
/******************標頭檔案中宣告的函式的定義*********************/
#include
using namespace std;
#include
"doublelist.h"
typedef
struct _tag_dlinklist
tdlinklist;
dlinklist*
dlinklist_create()
return ret;
}void
dlinklist_destroy
(dlinklist* list)
free
(slist);}
void
dlinklist_clear
(dlinklist* list)
slist->length =0;
slist->header.next =
null
; slist->header.pre =
null
; slist->slider =
null;}
intdlinklist_length
(dlinklist* list)
}int
dlinklist_insert
(dlinklist* list, dlinklistnode* node,
int pos)
next = current->next;
//增加了乙個指標,這個指標指向要插入的位置的後乙個結點
node->next = next;
current->next = node;
if(next!=
null
)//增加一步判斷,如果next==null,說明插入的是第乙個元素;
node->pre = current;
if(slist->length ==0)
//如果長度是0,就指向第乙個元素,換句話說:如果是第一次插入,游標就指向第乙個元素;
if(current ==
(dlinklistnode*
)slist)
slist->length++
;return0;
}dlinklistnode*
dlinklist_get
(dlinklist* list,
int pos)
}return current->next;
}dlinklistnode*
dlinklist_delete
(dlinklist* list,
int pos)
dlinklistnode* current =
(dlinklistnode*
)slist;
dlinklistnode* next =
null
;for
(i =
0; i < pos; i++
) ret = current->next;
next = ret->next;
//步驟1
current->next = next;
//步驟2,next!=null 判斷除了0號位置之外還有別的元素;
if(next !=
null)}
if(slist->slider = ret)
slist->length--;}
//與游標相關的函式
dlinklistnode*
dlinklist_deletenode
(dlinklist* list, dlinklistnode* node)
current = current->next;}if
(ret !=
null)}
return ret;
}dlinklistnode*
dlinklist_reset
(dlinklist* list)
return ret;
}dlinklistnode*
dlinklist_current
(dlinklist* list)
return ret;
}dlinklistnode*
dlinklist_next
(dlinklist* list)
//游標下移
return ret;
}dlinklistnode*
dlinklist_prior
(dlinklist* list)
//游標前移
return ret;
}/*******************雙向鍊錶測試框架*********************/
#include
#include
"doublelist.h"
using namespace std;
typedef
struct value
value;
intmain()
cout << endl;
dlinklist_delete
(list,
dlinklist_length
(list)-1
);dlinklist_delete
(list,0)
;for
(i =
0; i <
dlinklist_length
(list)
; i++
) cout << endl;
dlinklist_reset
(list)
;dlinklist_next
(list)
; pv =
(value*
)dlinklist_current
(list)
; cout << pv->v;
cout << endl;
dlinklist_deletenode
(list,
(dlinklistnode*
)pv)
; pv =
(value*
)dlinklist_current
(list)
; cout << pv->v;
cout << endl;
dlinklist_prior
(list)
; pv =
(value*
)dlinklist_current
(list)
; cout << pv->v;
cout << endl;
return0;
}
雙向鍊錶實現
template class link link link pre null,link ne null void operator new size t void operator delete void ptr template link link freelist null template v...
實現雙向鍊錶
雙向鍊錶和單向鍊錶相比更加靈活,它的每乙個元素除了本身的值以為擁有兩個指標,分別指向上乙個和下乙個節點。維護成本上要高於單向鍊錶。鍊錶的大部分操作依賴於遍歷,這一方面雙向鍊錶會效率會好一些,可以根據查詢下標的位置從而選擇從煉表頭開始遍歷還是從鍊錶尾開始遍歷。返回元素個數 public intsize...
鍊錶 java實現雙向鍊錶
前面已經總結了單向鍊錶,有興趣的兄弟可以進我部落格看一下。大家對比就可以看出,實現同樣的功能單向鍊錶要比雙向鍊錶痛苦的多。所以呀不斷地總結前輩留下的東西,是社會進步的基礎呀。可以直接看linkedlist的原始碼,其就是個雙向鍊錶。一 雙向鍊錶的結構。1 首先節點的結構,其中包含本節點內容,同時需要...