測試上一次介紹了單向迴圈鍊錶,這一次介紹雙向迴圈鍊錶。
顧名思義,雙向迴圈鍊錶的結點中有兩個指標域,乙個指向直接後繼,乙個指向直接前驅。
描述:資料域+兩個指標域
typedef
int datatype;
typedef
struct node dlinklist,
*dlinklist_t;
用malloc動態申請空間
dlinklist_t createdlinklist()
//2.賦值:資料無效,兩個指標都指向自己
h->data =-1
; h->prior = h;
h->next = h;
return h;
}
頭插,新結點永遠插入第一項(頭結點不是第一項,頭結點後面才是第一項)
**的書寫順序可以有很多種,只要邏輯通順即可。
int
headinsert
(dlinklist_t h, datatype x)
pnew->data = x;
//2.接入頭結點後面
pnew->prior = h;
pnew->next = h->next;
h->next->prior = pnew;
h->next = pnew;
return0;
}
void
showdlinklist
(dlinklist_t h)
printf
("\n");
}
單鏈表中,取第i個元素必須從頭結點出發尋找。
按位置查詢,查詢第pos項元素,返回其位址
dlinklist_t searchpos
(dlinklist_t h,
int pos)
while
(count < pos)
}return p;
}
要利用上面的查詢函式searchpos()
//3.插入新增結點
pnew->prior = p->prior;
pnew->next = p;
p->prior->next = pnew;
p->prior = pnew;
return0;
}刪除結點
("下標%d = %d\n"
, pos, p->data)
;insertdlinklist
(h,2
,666);
insertdlinklist
(h,2
,777);
insertdlinklist
(h,2
,888);
printf
("insert: ");
showdlinklist
(h);
datatype x;
deletedlinklist
(h,2
,&x)
;deletedlinklist
(h,2
,&x)
;deletedlinklist
(h,2
,&x)
;printf
("delete: ");
showdlinklist
(h);
線性表 雙向迴圈鍊錶
雙向鍊錶 double liked list 就是在單向鍊錶的每個結點中,新增乙個指向前驅結點的指標域。class doublenode 雙向鍊錶迴圈帶頭結點的空鍊錶,如圖 非空的迴圈帶頭結點的雙向鍊錶,如圖 插入操作不複雜,不過順序很重要,不要寫反了。假設儲存元素 e 的結點為 s,要實現將結點 ...
線性表的實現(四)雙向鍊錶
單鏈表的結點都只有乙個指向下乙個結點的指標 單鏈表的資料元素無法直接訪問其前驅元素 逆序訪問單鏈表中的元素是極其耗時的操作!雙向鍊錶的定義 在單鏈表的結點中增加乙個指向其前驅的pre指標 插入操作 刪除操作 雙向鍊錶的新操作 獲取當前游標指向的資料元素 將游標重置指向鍊錶中的第乙個資料元素 將游標移...
線性表(一) 鍊錶之雙向迴圈鍊錶
四 雙向迴圈鍊錶的實現 template class cycdullist cycdullist 獲取鍊錶大小 size t size 判斷鍊錶是否為空 bool empty 獲取頭節點 listnode get head 獲取任意位置節點 listnode get node const int i...