1. Trình bày (bằng ngôn ngữ tựa C) giải thuật bổ sung một nút mới có chứa dữ liệu X vào trước nút trỏ bởi Q trong danh sách móc nối hai chiều với: Pdau trỏ vào phần tử đầu, Pcuoi trỏ vào phần tử cuối, mỗi nút có cấu trúc như sau:
P_L Trỏ tới nút bên trái DATA Chứa dữ liệu P_R Trỏ tới nút bên phải
DOUBLE_IN(Pdau, Pcuoi, Q, X) //X: dữ liệu cần thêm { Node MOI = malloc(); //khởi tạo nút MOI -> DATA = X; MOI -> P_L = NULL; MOI -> P_R = NULL; if(Pcuoi == NULL){ //list rỗng thì gán MOI làm phần tử đầu và cuối luôn Pdau = MOI; Pcuoi = MOI; }else if(Q == Pdau){ // nếu Q là đầu list thì... Pdau = MOI; //...gán lại nút đầu thành nút mới MOI -> P_R = Q; //...nút phải của nút mới thành nút Q Q -> P_L = MOI; //...nút trái của Q (nút đầu list) thành nút Mới }else{ //nếu Q là cuối list hoặc ở giữa thì... //..chèn MỚI vào trước Q MOI -> P_L = Q -> P_L; MOI -> P_R = Q; Q -> P_L = MOI; //..chèn MỚI vào sau nút trước Q Node TRUOC = MOI -> P_L; TRUOC -> P_R = MOI;}} 2. Trình bày (bằng ngôn ngữ tựa C) giải thuật loại bỏ một nút trỏ bởi Q trong danh sách móc nối hai chiều với: Pdau trỏ vào phần tử đầu, Pcuoi trỏ vào phần tử cuối, mỗi nút có cấu trúc như sau:
P_L Trỏ tới nút bên trái (Nút trước) DATA Chứa dữ liệu P_R Trỏ tới nút bên phải (Nút sau)
DOUBLE_DEL(Pdau, Pcuoi, Q) { if(Pcuoi == NULL){ // list trống thì k có đầu (hoặc cuối) printf("List empty!"); }else if(Pdau = Pcuoi){ //list có 1 phần tử, xoá Q là thành NULL hết cả lũ Pdau = NULL;