LATEST

Duyệt danh sách liên kết đôi

Trong bài viết này, codehow sẽ hướng dẫn các bạn cách duyệt danh sách liên kết đôi trong C / C++. Đây là một bước rất quan trong trong việc sử dụng DSLK đôi, bởi vì các bạn cần kiểm tra xem các thao tác với DSLK đôi có lỗi hay không.

Vì sao mình lại hướng dẫn thao tác này trước các thao tác khác? Bởi vì mình muốn khi các bạn thực hiện các thao tác như thêm, xóa, ... thì có thể kiểm tra kết quả ngay lập tức.

Mình sẽ hướng dẫn các bạn hai cách để duyệt danh sách liên kết đôi đó là:

  • Duyệt từ đầu danh sách.
  • Duyệt từ cuối danh sách.

Tùy vào bài toán mà chúng ta chọn cách duyệt nào nhé, còn bây giờ hãy cùng mình bắt đầu thôi nào.

Duyệt danh sách liên kết đôi trong C / C++

Như đã nói thì trong phần này mình sẽ hướng dẫn hai cách để duyệt danh sách liên kết đôi. Các bạn tham khảo và lựa chọn cho mình một cách cho phù hợp với bài toán nhé.

Duyệt từ đầu danh sách liên kết đôi

Dưới đây là hàm duyệt danh sách liên kết đôi với phương pháp duyệt từ đầu danh sách. Các bạn hãy xem trước, sau đó mình sẽ giải thích ngay bên dưới nhé.

void Print() {
// khởi tạo một node tạm temp, sử dụng node này thay thế cho head để duyệt danh sách
    struct Node* temp = head;
    cout<<"\nForward: ";
//sử dụng vòng lặp while để duyệt danh sách
    while(temp != NULL) {
        cout<<temp->data;
        temp = temp->next;
    }
    cout<<endl;
}

Giải thích:

  • Đầu tiên chúng ta sẽ tạo một node temp để thay thế cho node head. Vì node head luôn luôn quản lý node đầu tiên nên chúng ta không thế sử dụng nó để duyệt danh sách được.
  • Sử dụng vòng lặp while với điều kiến là node temp != NULL.
    • Nếu temp == NULL nghĩa là danh sách rỗng thì ta thoát vòng lặp và kết thúc hàm.
    • Nếu temp != NULL thì ta thực hiện lặp từng phần tử trong danh sách. Sau đó lấy data của node rồi hiển thị ra màn hình. Cứ tiếp tục như vậy cho đến khi vòng lặp kết thúc.

Duyệt từ cuối danh sách liên kết đôi

Tương tự như việc duyệt từ đầu danh sách, ta cũng có thể duyệt từ cuối danh sách. Các bạn xem hàm dưới đây, sau đó mình sẽ giải thích cụ thể ngay bên dưới nhé.

/* duyệt từ cuối về đầu danh sách */
void ReversePrint() {
  //tạo một node tạm temp thay thế cho node tail để duyệt danh sách
    struct Node* temp = tail;
    //nếu danh sách rỗng thì thoát khỏi hàm
    if(temp == NULL) return;
    cout<<"\nReverse: ";
    //ngược lại nếu temp != null thì thực hiện vòng lặp while
    while(temp != NULL) {
        cout<<temp->data;//xuất giá trị data của node ra màn hình
        temp = temp->prev;// trỏ đến node kế tiếp
    }
    cout<<endl;
}

Giải thích:

  • Đầu tiên ta sẽ sử node temp để thay thế cho node tail để duyệt danh sách.
  • Kiểm tra nếu temp == NULL, nghĩa là danh sách rổng thì thoát khỏi hàm.
  • Nếu temp != NULL thì ta thực hiện lặp từng phần tử trong danh sách. Lấy data của node đó rồi hiển thị ra màn hình. Cứ tiếp tục cho đến khi kết thúc vòng lặp.

Ví dụ về duyệt danh sách liên kết đôi

Trong phần này mình sẽ thực hiện một chương trình duyệt danh sách liên kết đôi theo cả hai cách để các bạn có thể so sánh nhé. Chương trình được viết bằng ngôn ngữ C++, các bạn có thể tham khảo nhé.

Đầu tiên chúng ta sẽ tạo cấu trúc dữ liệu cho danh sách liên kết đôi.

/* tạo cấu trúc node */
struct Node  {
    int data;
    struct Node* next;
    struct Node* prev;
};
 
struct Node *head, *tail; // Khởi tạo Node head global của dslk đôi.

Sau đó khởi tạo một node mới trong DSLK đôi dựa vào cấu trúc vừa tạo ở trên.

/* tạo node mới */
struct Node* CreateNode(int x) {
    struct Node* newNode
        = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = x;
    newNode->prev = NULL;
    newNode->next = NULL;
    return newNode;
}

Viết hàm thêm node vào đầu danh sách, khi đó mới có dữ liệu để có thể duyệt được. Hàm này mình sẽ giải thích kỹ ở bài sau, bây giờ các bạn chỉ cần biết nó dùng đề chèn node vào DSLK đôi thôi nhé.

/* thêm node vào đầu danh sách */
void InsertAtHead(int x) {
    struct Node* newNode = CreateNode(x);
    if(head == NULL) {
        head = newNode;
        tail = newNode;
        return;
    }
    head->prev = newNode;
    newNode->next = head;
    head = newNode;
}

Tạo hàm hiển thị danh sách liên kết đôi theo hai cách từ đầu về cuối và từ cuối về đầu.

/* hiển thị từ đầu đến cuối */
void Print() {
    struct Node* temp = head;
    printf("\nĐầu đến cuối: ");
    while(temp != NULL) {
        printf("%d ",temp->data);
        temp = temp->next;
    }
    printf("\n");
}
  
/* hiển thị từ cuối về đầu */
void ReversePrint() {
    struct Node* temp = tail;
    if(temp == NULL) return; // empty list, exit
    // Traversing backward using prev pointer
    printf("\nCuối về đầu: ");
    while(temp != NULL) {
        printf("%d ",temp->data);
        temp = temp->prev;
    }
    printf("\n");
}

Full code mẫu:

#include <iostream>
using namespace std;
/* tạo cấu trúc node */
struct Node  {
    int data;
    struct Node* next;
    struct Node* prev;
};
 
struct Node *head, *tail; // Khởi tạo Node head global của dslk đôi.
  
/* tạo node mới */
struct Node* CreateNode(int x) {
    struct Node* newNode
        = (struct Node*)malloc(sizeof(struct Node));
    newNode->data = x;
    newNode->prev = NULL;
    newNode->next = NULL;
    return newNode;
}
/* hiển thị từ đầu đến cuối */
void Print() {
    struct Node* temp = head;
    printf("\nĐầu đến cuối: ");
    while(temp != NULL) {
        printf("%d ",temp->data);
        temp = temp->next;
    }
    printf("\n");
}
  
/* hiển thị từ cuối về đầu */
void ReversePrint() {
    struct Node* temp = tail;
    if(temp == NULL) return; // empty list, exit
    // Traversing backward using prev pointer
    printf("\nCuối về đầu: ");
    while(temp != NULL) {
        printf("%d ",temp->data);
        temp = temp->prev;
    }
    printf("\n");
}
/* thêm node vào đầu danh sách */
void InsertAtHead(int x) {
    struct Node* newNode = CreateNode(x);
    if(head == NULL) {
        head = newNode;
        tail = newNode;
        return;
    }
    head->prev = newNode;
    newNode->next = head;
    head = newNode;
}
int main() {
  
    head = NULL;
 //gọi hàm thêm node vào đầu danh sách
    InsertAtHead(2);
    InsertAtHead(3);
    InsertAtHead(4);
    Print(); ReversePrint();
     
    cout<<"\n---------------------------------------\n";
    cout<<"Chương trình này được đăng tại codehow.net";
}

Kết quả:

bai33 01 PNG

Kết luận

Như vậy là chúng ta đã cùng nhau tìm hiểu về cách duyệt phần tử trong danh sách liên kết đôi. Ở bài viết tiếp theo, mình sẽ hướng dẫn các bạn cách chèn node vào danh sách liên kết đôi. Các bạn chú ý theo dõi nhé !!!

Cùng chuyên mục:

Xóa node khỏi cây nhị phân tìm kiếm

Xóa node khỏi cây nhị phân tìm kiếm

Tìm node Max và Min trong cây nhị phân tìm kiếm

Tìm node Max và Min trong cây nhị phân tìm kiếm

Xuất node con và node lá trong cây nhị phân tìm kiếm

Xuất node con và node lá trong cây nhị phân tìm kiếm

Tìm kiếm trên cây nhị phân tìm kiếm

Tìm kiếm trên cây nhị phân tìm kiếm

Duyệt cây nhị phân tìm kiếm

Duyệt cây nhị phân tìm kiếm

Thêm node vào cây nhị phân tìm kiếm

Thêm node vào cây nhị phân tìm kiếm

Cây nhị phân (Binary tree) là gì? Cơ chế hoạt động của nó

Cây nhị phân (Binary tree) là gì? Cơ chế hoạt động của nó

Cách gộp hai danh sách liên kết đôi

Cách gộp hai danh sách liên kết đôi

Tìm kiếm phần tử trong DSLK đôi

Tìm kiếm phần tử trong DSLK đôi

Xóa node trong DSLK đôi

Xóa node trong DSLK đôi

Chèn node (Insert node) vào DSLK đôi

Chèn node (Insert node) vào DSLK đôi

Tạo node mới trong DSLK đôi

Tạo node mới trong DSLK đôi

DSLK đôi là gì? Cấu trúc dữ liệu của DSLK đôi

DSLK đôi là gì? Cấu trúc dữ liệu của DSLK đôi

Quản lý sinh viên bằng DSLK đơn

Quản lý sinh viên bằng DSLK đơn

Tìm kiếm và sắp xếp trong DSLK đơn

Tìm kiếm và sắp xếp trong DSLK đơn

Xóa node (Delete node) trong DSLK đơn

Xóa node (Delete node) trong DSLK đơn

Chèn node (Insert node) vào DSLK đơn

Chèn node (Insert node) vào DSLK đơn

Tạo node mới trong DSLK đơn

Tạo node mới trong DSLK đơn

Cấu trúc dữ liệu của DSLK đơn

Cấu trúc dữ liệu của DSLK đơn

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Danh sách liên kết (Linked List) là gì? Các loại danh sách liên kết

Top