Xem mẫu

  1. ́ ́ Danh sach liên kêt đôi (Doubly Linked List)
  2. • Là danh sach mà môi phân tử có 2 môi liên ́ ̃ ̀ ́ ́ kêt: – Next: để kêt nôi với phân tử kế tiêp ́ ́ ̀ ́ – Prev: để kêt nôi với phân tử trước nó ́ ́ ̀ pos head rear
  3. ̣̀ Cai đăt DSLK đôi • Cai đăt: dựa trên con tro, bao gôm: ̀ ̣ ̉ ̀ • 3 con tro: head (đâu ds), pos (phân tử hiên hanh), và ̉ ̀ ̀ ̣ ̀ ́ rear (cuôi ds) • biên count: số phân tử cua danh sach ́ ̀ ̉ ́ typedef struct nodet { next elem data; data struct nodet *next, *prev; } node; prev typedef node *nodeptr;
  4. pos head rear typedef struct { nodeptr head, pos, rear; int count; } list;
  5. ́ ́ ́ ́ Cac thao tac trên danh sach liên kêt đôi • Tương tự như danh sach liên kêt đơn ngoai ́ ́ ̣ trừ 2 thao tac (cuc bô) lam thay đôi liên kêt: ́ ̣ ̣̀ ̉ ́ – Chen phân tử vao danh sach ̀ ̀ ̀ ́ – Xoa phân tử trong danh sach liên kêt ́ ̀ ́ ́ • Bổ sung thêm môt số thao tac như: ̣ ́ – Khởi đâu từ cuôi danh sach ̀ ́ ́ – Di chuyên qua phân tử trước phân tử hiên hanh ̉ ̀ ̀ ̣ ̀
  6. Chen phân tử x vao danh sach ̀ ̀ ̀ ́ q p head rear wp • Chen đâu danh sach (xet theo chiêu xuôi): ̀ ̀ ́ ́ ̀ – q = head – newp->next = q – head = newp
  7. Chen phân tử x vao danh sach ̀ ̀ ̀ ́ q p head rear newp • Chen sau p (xet theo chiêu xuôi): ̀ ́ ̀ – q = p->next – newp->next=q – p->next = newp
  8. ̉ ̣ ̀ Giai thuât chen Câp phat bộ nhớ cho newp, gan dữ liêu ́ ́ ́ ̣ 1. Xac đinh con trỏ q=(p==NULL? head:p->next) ̣́ 2. ́́ 3. Kêt nôi xuôi 3.1 newp→next = q; 3.2 Nêu p=NULL thì ́ head = newp 3.3 Ngược lai ̣ p→next = newp Kêt nôi ngược ́́ 4. 4.1 newp→prev = p; 4.2 Nêu q=NULL thì ́ rear = newp 4.3 Ngược lai ̣ q→prev = newp ́ 5. Tăng biên count
  9. Ham chen phân tử vao danh sach ̀ ̀ ̀ ̀ ́ void insertlist(list &l, elem &x, nodeptr p) { nodeptr newp, q; newp = new node; memcpy(&newp->data, &x, sizeof(elem)); q = (p==NULL? l.head: p->next); newp->next = q; if (p==NULL) l.head = newp; else p->next = newp; newp->prev = p; if (q==NULL) l.rear = newp; else q->prev = newp; l.count++;
  10. Ham xoa phân tử trongdanh sach ̀ ́ ̀ ́ void deletelist(list &l, nodeptr p) { nodeptr t, q; t = (p==NULL? l.head: p->next); q = t->next; if (p==NULL) l.head = q; else p->next = q; if (q==NULL) l.rear = p; else q->prev = p; delete t; l.count--; }
  11. Bổ sung 2 ham ̀ • Khởi đâu tử cuôi danh sach ̀ ́ ́ void startend(list &l) { l.pos = l.rear; } • Di chuyên đên phân tử trước phân tử hiên hanh ̉ ́ ̀ ̀ ̣ ̀ void skipbefore(list &l) { if (l.pos == NULL) l.pos = l.rear; else l.pos = l.pos->prev; }
  12. • Thiêt kế kiêu số nguyên lớn với cac phep ́ ̉ ́ ́ ́ ̣ ́ ̣ ́ toan: công, nhân. Ap dung tinh 100!, 7100 • 349093429 • 675432
nguon tai.lieu . vn