You are on page 1of 14

CẤU TRÚC DỮ LIỆU &

GIẢI THUẬT

GV: Đặng Ngọc Hoàng Thành.


Khoa: Công nghệ Thông tin Kinh Doanh.
Email: thanhdnh@ueh.edu.vn
Chương 6: Cấu trúc Danh sách liên kết
(Linked List)

1. GIỚI THIỆU DANH SÁCH LIÊN KẾT

2. CÀI ĐẶT DANH SÁCH LIÊN KẾT

3. BÀI TẬP ỨNG DỤNG


6.1. GIỚI THIỆU DANH SÁCH LIÊN KẾT

- Mỗi danh sách liên kết được cấu tạo từ các phần tử được gọi là các nút.
- Mỗi một nút gồm có 2 phần: phần dữ liệu và phần thông tin liên kết. link
- Mỗi DSLK luôn có một nút đầu (header) để chỉ định vị trí đầu tiên của DS.
flink
- Có 2 loại DSLK cơ bản: danh sách liên kết đơn và danh sách liên kết kép.
- Danh sách liên kết đơn: phần liên kết (link) chứa thông tin của nút tiếp theo.
blink
- Danh sách liên kết kép: phần liên kết chứa thông tin của nút trước (flink) và nút
sau (blink).
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT ĐƠN

Định nghĩa DSLK


public class Node{
    public object element;
    public Node link;

    public Node(){ link
        element = null;
        link = null; public class LinkedList{
    }     public Node header;

    public Node(object element){     public LinkedList(){
        this.element = element;         header = new Node("Header");
        link = null;     }
    } . . .
} }
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT ĐƠN

Chèn nút:

private Node Find(object element){ public void Insert(object newelement, object afterelement){
   Node current = new Node();    Node current = new Node();
   current = header;    Node newnode = new Node(newelement);
   while(current.element!=element)    current = Find(afterelement);
      current = current.link;    newnode.link = current.link;
   return current;    current.link = newnode;
} }
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT ĐƠN

Xóa nút:

public Node FindPrev(object element){ public void Remove(object element){
  Node current = header;   Node current = FindPrev(element);
  while(current.link!=null && current.link.element!=element)   if(current.link!=null)
    current = current.link;     current.link = current.link.link;
  return current; }
}
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT ĐƠN

In thông tin của nút:

public void Print(){
   Node current = new Node();
   current = header;
   while(current.link!=null){
       Console.WriteLine(current.link.element);
       current = current.link;
   }
}
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT ĐƠN

Cài đặt DSLK đơn:


    static void Main() First
    { Second
        LinkedList list = new LinkedList(); Third
        list.Insert("First", "Header"); ===
        list.Insert("Second", "First"); First
        list.Insert("Third", "Second"); Third
        list.Print();
        Console.WriteLine("===");
        list.Remove("Second");
        list.Print();

        Console.ReadLine();
    }
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT KÉP

Định nghĩa DSLK

public class Node2{ flink
    public object element;
    public Node2 flink, blink; blink
    public Node2(){
        element = null; public class DoubleLinkedList{
        flink = blink = null;     public Node2 header;
    }
    public Node2(object element){     public DoubleLinkedList(){
        this.element = element;         header = new Node2("Header");
        flink = blink = null;     }
    } . . .
} }
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT KÉP

Chèn nút DSLK

private Node2 Find(object element){ public void Insert(object newelement, object afterelement){
   Node2 current = new Node2();   Node2 current = new Node2();
   current = header;   Node2 newnode = new Node2(newelement);
   while(current.element!=element){   current = Find(afterelement);
       current = current.flink;   newnode.flink = current.flink;
   }   newnode.blink = current;
   return current;   current.flink = newnode;
} }
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT KÉP

Xóa nút DSLK

public void Remove(object element) {
    Node2 current = Find(element);
    if (current.flink != null) {
       current.blink.flink = current.flink;
       current.flink.blink = current.blink;
       current.flink = null;
       current.blink = null;
    }
}
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT KÉP

In nút DSLK

private Node2 FindLast() { public void Print() {
   Node2 current = new Node2();    Node2 current = new Node2();
   current = header;    current = FindLast();
   while(!(current.flink == null))    while (!(current.blink == null)) {
       current = current.flink;        Console.WriteLine(current.element);
   return current;        current = current.blink;
}    }
}
6.1. CÀI ĐẶT DANH SÁCH LIÊN KẾT KÉP

Cài đặt DSLK kép:


    static void Main() Third
    { Second
        DoubleLinkedList dlist = new DoubleLinkedList(); First
        dlist.Insert("First", "Header"); ---
        dlist.Insert("Second", "First"); Third
        dlist.Insert("Third", "Second"); First
        dlist.Print();
        Console.WriteLine("---");
        dlist.Remove("Second");
        dlist.Print();

        Console.ReadLine();
    }
BÀI TẬP
1. Cài đặt danh sách liên kết đơn.
2. Cài đặt danh sách liên kết kép.
3. Danh sách liên kết tích hợp trong NET

using System.Collections.Generic;
…………
LinkedListNode<string> node = new LinkedListNode<string>("Mike");

LinkedList<string> names = new LinkedList<string>();


names.AddFirst(node);

LinkedListNode<string> node1 = new LinkedListNode<string>("David");


names.AddAfter(node, node1);

LinkedListNode<string> node2 = new LinkedListNode <string>(null);

…………

You might also like