You are on page 1of 23

 Lập trình

o
o
o
o
o
o
o
 Cấu trúc dữ liệu
 Giải thuật
 Machine learning
 Mã nguồn
o
o

 Giới thiệu

 Học C

 Học Java

 Học Javascript

 Học Python

 Học Pandas

 Học Tensorflow

Lập trình không khó


 LẬP TRÌNH
 CẤU TRÚC DỮ LIỆU
 GIẢI THUẬT
 MACHINE LEARNING
 MÃ NGUỒN
 GIỚI THIỆU

TÌM KI? M

Cấu trúc dữ liệu Danh sách liên kết đơn – Single linked list

 Cấu trúc dữ liệu

 Lập trình

 Lập trình C/C++

Danh sách liên kết đơn – Single


linked list
Bởi
Nguyễn Văn Hiếu
-
23/12/2018
0
567

Chia sẻ

This entry is part 6 of 10 in the series Cấu trúc dữ liệu

Danh sách được liên kết là ví dụ tốt nhất và đơn giản nhất về cấu trúc dữ liệu
động sử dụng con trỏ để cài đặt. Do đó, kiến thức con trỏ là rất quan trọng để
hiểu cách danh sách liên kết hoạt động, vì vậy nếu bạn chưa có kiến thức về
con trỏ thì bạn nên học về con trỏ trước. Bạn cũng cần hiểu một chút về cấp
phát bộ nhớ động. Để đơn giản và dễ hiểu, phần nội dung cài đặt danh sách liên
kết của bài viết này sẽ chỉ trình bày về danh sách liên kết đơn.

Nội dung bài viết [Click để ẩn]


 1. Lý thuyết về danh sách liên kết
 2. Danh sách liên kết là gì?
 3. Cài đặt danh sách liên kết đơn
o 3.1. Khai báo linked list
o 3.2. Tạo mới 1 Node
o 3.3. Thêm Node vào danh sách liên kết
 Thêm vào đầu
 Thêm vào cuối
 Thêm vào vị trí bất kỳ
o 3.4. Xóa Node khỏi danh sách liên kết
 Xóa đầu
 Xóa cuối
 Xóa ở vị trí bất kỳ
o 3.5. Lấy giá trị ở vị trí bất kỳ
o 3.6. Tìm kiếm trong danh sách liên kết
o 3.7. Duyệt danh sách liên kết
o 3.8. Một số hàm bổ trợ khác
 Hàm khởi tạo Node head
 Hàm lấy số phần tử của DSLK
 Hàm nhập danh sách liên kết
 4. Code hoàn chỉnh của danh sách liên kết đơn

1. Lý thuyết về danh sách liên kết


Về bản chất, danh sách liên kết có chức năng như một mảng, có thể thêm và
xóa các phần tử ở bất kỳ vị trí nào khi cần thiết. Một số sự khác nhau giữa danh
sách liên kết và mảng:
Nội dung Mảng Danh sách liên kết

 Kích thước thay đổi trong quá


 Kích thước cố định
trình thêm/ xóa phần tử
Kích thước  Cần chỉ rõ kích thước trong
 Kích thước tối đa phụ thuộc vào
khi khai báo
bộ nhớ

 Tĩnh: Bộ nhớ được cấp phát  Động: Bộ nhớ được cấp phát
Cấp phát bộ nhớ trong quá trình biên dịch trong quá trình chạy

 Được lưu trữ trên một dãy ô  Được lưu trữ trên các ô nhớ
Thứ tự & sắp xếp nhớ liên tục ngẫu nhiên

 Truy cập tới phần tử ngẫu  Truy cập tới phần tử ngẫu nhiên

Truy cập nhiên trực tiếp bằng cách cần phải duyệt từ đầu/cuối đến
sử dụng chỉ số mảng: O(1) phần tử đó: O(n)

 Tìm kiếm tuyến tính hoặc


Tìm kiếm  Chỉ có thể tìm kiếm tuyến tính
tìm kiếm nhị phân

Lưu ý: Ở bảng phía trên, các phần in nghiêng thể hiện đó là ưu điểm so với đối
thủ còn lại.

2. Danh sách liên kết là gì?


Danh sách được liên kết là một tập hợp các Node được phân bố động, được sắp
xếp theo cách sao cho mỗi Node chứa “một giá trị”(Data) và “một con
trỏ”(Next). Con trỏ sẽ trỏ đến phần tử kế tiếp của danh sách liên kết đó. Nếu
con trỏ mà trỏ tới NULL, nghĩa là đó là phần tử cuối cùng của linked list.

Hình ảnh mô tả cho một Node trong danh sách liên kết đơn:
Và đây là hình ảnh mô phỏng một danh sách liên đơn kết đầy đủ:

Mô phỏng
của danh sách liên kết đơn
Danh sách các kiểu danh sách liên kết:

 Danh sách liên kết đơn(Single linked list): Chỉ có sự kết nối từ phần tử
phía trước tới phần tử phía sau.
 Danh sách liên kết đôi(Double linked list): Có sự kết nối 2 chiều giữa phần
tử phía trước với phần tử phía sau
 Danh sách liên kết vòng(Circular Linked List): Có thêm sự kết nối giữa 2
phần tử đầu tiên và phần tử cuối cùng để tạo thành vòng khép kín.

3. Cài đặt danh sách liên kết đơn

3.1. Khai báo linked list


Để đơn giản hóa, data của chúng ta sẽ là số nguyên(int). Bạn cũng có thể sử
dụng các kiểu nguyên thủy khác(float, char,…) hay kiểu dữ liệu struct(SinhVien,
CanBo,…) tự tạo.

0
1 struct LinkedList{
2 int data;
3 struct LinkedList *next;
4 };
5

Khai báo trên sẽ được sử dụng cho mọi Node trong linked list. Trường data sẽ
lưu giữa giá trị và next sẽ là con trỏ để trỏ đến thằng kế tiếp của nó.

Tại sao next lại là kiểu LinkedList của chính nó? Bởi vì nó là con trỏ trỏ của
chính bản thân nó, và nó trỏ tới một thằng Node kế tiếp cũng có kiểu
LinkedList.

3.2. Tạo mới 1 Node

Hãy tạo một kiểu dữ liệu của struct LinkedList để code clear hơn:

0
1 typedef struct LinkedList *node; //Từ giờ dùng kiểu dữ liệu LinkedList có thể thay bằng node cho ngắn gọn
2
3 node CreateNode(int value){
4 node temp; // declare a node
5 temp = (node)malloc(sizeof(struct LinkedList)); // Cấp phát vùng nhớ dùng malloc()
6 temp->next = NULL;// Cho next trỏ tới NULL
7 temp->data = value; // Gán giá trị cho Node
8 return temp;//Trả về node mới đã có giá trị
9 }
10

Mỗi một Node khi được khởi tạo, chúng ta cần cấp phát bộ nhớ cho nó, và mặc
định cho con trỏ next trỏ tới NULL. Giá trị của Node sẽ được cung cấp khi thêm
Node vào linked list.

 typedef được dùng để định nghĩa một kiểu dữ liệu trong C. VD: typeder
long long LL;
 malloc là hàm cấp phát bộ nhớ của C. Với C++ chúng ta dùng new
 sizeof là hàm trả về kích thước của kiểu dữ liệu, dùng làm tham số cho
hàm malloc

Lưu ý: Không giống với mảng, cần khai báo arr[size]. Trong linked list, vì mỗi
Node sẽ có con trỏ liên kết đến Node tiếp theo. Do đó, với danh sách liên kết
đơn, bạn chỉ cần lưu giữ Node đầu tiên(HEAD). Có head rồi bạn có thể đi tới bất
cứ Node nào.

3.3. Thêm Node vào danh sách liên kết

Thêm vào đầu

Việc thêm vào đầu chính là việc cập nhật lại thằng head. Ta gọi Node
mới(temp), ta có:

 Nếu head đang trỏ tới NULL, nghĩa là linked list đang trống, Node mới
thêm vào sẽ làm head luôn
 Ngược lại, ta phải thay thế thằng head cũ bằng head mới. Việc này phải
làm theo thứ tự như sau:
o Cho next của temp trỏ tới head hiện hành
o Đặt temp làm head mới

0
1 node AddHead(node head, int value){
2 node temp = CreateNode(value); // Khởi tạo node temp với data = value
3 if(head == NULL){
4 head = temp; // //Nếu linked list đang trống thì Node temp là head luôn
5 }else{
6 temp->next = head; // Trỏ next của temp = head hiện tại
7 head = temp; // Đổi head hiện tại = temp(Vì temp bây giờ là head mới mà)
8 }
9 return head;
10 }
11

Thêm vào cuối

Chúng ta sẽ cần Node đầu tiên, và giá trị muốn thêm. Khi đó, ta sẽ:
1. Tạo một Node mới với giá trị value
2. Nếu head = NULL, tức là danh sách liên kết đang trống. Khi đó Node
mới(temp) sẽ là head luôn.
3. Ngược lại, ta sẽ duyệt tới Node cuối cùng(Node có next = NULL), và trỏ
next của thằng cuối tới Node mới(temp).

0
1 node AddTail(node head, int value){
2 node temp,p;// Khai báo 2 node tạm temp và p
3 temp = CreateNode(value);//Gọi hàm createNode để khởi tạo node temp có next trỏ tới NULL và giá trị là value
4 if(head == NULL){
5 head = temp; //Nếu linked list đang trống thì Node temp là head luôn
6 }
7 else{
8 p = head;// Khởi tạo p trỏ tới head
9 while(p->next != NULL){
10 p = p->next;//Duyệt danh sách liên kết đến cuối. Node cuối là node có next = NULL
11 }
12 p->next = temp;//Gán next của thằng cuối = temp. Khi đó temp sẽ là thằng cuối(temp->next = NULL mà)
13 }
14 return head;
15 }
16

Tổng quan hơn, chúng ta sẽ sẽ viết hàm thêm một Node vào vị trí bất kỳ nhé.

Thêm vào vị trí bất kỳ

Thêm Node vào giữa danh sách liên kết


Để làm được việc này, ta phải duyệt từ đầu để tìm tới vị trí của Node cần chèn,
giả sử là Node Q, khi đó ta cần làm theo thứ tự sau:

 Cho next của Node mới trỏ tới Node mà Q đang trỏ tới
 Cho Node Q trỏ tới Node mới
Lưu ý: Chỉ số chèn bắt đầu từ chỉ số 0 nhé các bạn

0
1 node AddAt(node head, int value, int position){
2 if(position == 0 || head == NULL){
3 head = AddHead(head, value); // Nếu vị trí chèn là 0, tức là thêm vào đầu
4 }else{
5 // Bắt đầu tìm vị trí cần chèn. Ta sẽ dùng k để đếm cho vị trí
6 int k = 1;
7 node p = head;
8 while(p != NULL && k != position){
9 p = p->next;
10 ++k;
11 }
12
13 if(k != position){
14 // Nếu duyệt hết danh sách lk rồi mà vẫn chưa đến vị trí cần chèn, ta sẽ mặc định chèn cuối
15 // Nếu bạn không muốn chèn, hãy thông báo vị trí chèn không hợp lệ
16 head = AddTail(head, value);
17 // printf("Vi tri chen vuot qua vi tri cuoi cung!\n");
18 }else{
19 node temp = CreateNode(value);
20 temp->next = p->next;
21 p->next = temp;
22 }
23 }
24 return head;
25 }
26

Lưu ý: Bạn phải làm theo thứ tự trên, nếu bạn cho p->next = temp trước. Khi
đó, bạn sẽ không thể lấy lại phần sau của danh sách liên kết nữa(Vì next chỉ
được được lưu trong p->next mà thay đổi p->next rồi thì còn đâu giá trị cũ).

3.4. Xóa Node khỏi danh sách liên kết

Xóa đầu

Xóa đầu đơn giản lắm, bây giờ chỉ cần cho thằng kế tiếp của head làm head là
được thôi. Mà thằng kế tiếp của head chính là head->next.

0
1 node DelHead(node head){
2 if(head == NULL){
3 printf("\nCha co gi de xoa het!");
4 }else{
5 head = head->next;
6 }
7 return head;
8}
9

Xóa cuối

Xóa cuối mới nhọc nè, nhọc ở chỗ phải duyệt đến thằng cuối – 1, cho next của
cuối – 1 đó bằng NULL.

0
1 node DelTail(node head){
2 node p = head;
3 while(p->next->next != NULL){
4 p = p->next;
5 }
6 p->next = p->next->next; // Cho next bằng NULL
7 // Hoặc viết p->next = NULL cũng được
8 return head;
9 }
10

Thằng Node cuối – 1 là thằng có p->next->next = NULL. Bạn cho next của nó
bằng NULL là xong.

Xóa ở vị trí bất kỳ

Việc xóa ở vị trí bất kỳ cũng khá giống xóa ở cuối kia. Đơn giản là chúng ta bỏ
qua một phần tử, như ảnh sau:

Xóa node trong danh sách liên kết


Lưu ý: Chỉ số xóa bắt đầu từ 0 nhé các bạn. Việc tìm vị trí càn xóa chỉ duyệt tới
Node gần cuối thôi(cuối – 1). Sau đây là code xóa Node ở vị trí bất kỳ
0
1 node DelAt(node head, int position){
2 if(position == 0 || head == NULL){
3 head = DelHead(head); // Nếu vị trí chèn là 0, tức là thêm vào đầu
4 }else{
5 // Bắt đầu tìm vị trí cần chèn. Ta sẽ dùng k để đếm cho vị trí
6 int k = 1;
7 node p = head;
8 while(p->next->next != NULL && k != position){
9 p = p->next;
10 ++k;
11 }
12
13 if(k != position){
14 // Nếu duyệt hết danh sách lk rồi mà vẫn chưa đến vị trí cần chèn, ta sẽ mặc định xóa cuối
15 // Nếu bạn không muốn xóa, hãy thông báo vị trí xóa không hợp lệ
16 head = DelTail(head);
17 // printf("Vi tri xoa vuot qua vi tri cuoi cung!\n");
18 }else{
19 p->next = p->next->next;
20 }
21 }
22 return head;
23 }
24

3.5. Lấy giá trị ở vị trí bất kỳ

Chúng ta sẽ viết một hàm để truy xuất giá trị ở chỉ số bất kỳ nhé. Trong trường
hợp chỉ số vượt quá chiều dài của linked list – 1, hàm này trả về vị trí cuối cùng.
Do hạn chế là chúng ta không thể raise error khi chỉ số không hợp lệ. Tôi mặc
định chỉ số bạn truyền vào phải là số nguyên không âm.

0
1 int Get(node head, int index){
2 int k = 0;
3 node p = head;
4 while(p->next != NULL && k != index){
5 p = p->next;
6 }
7 return p->data;
8}
9

Lý do dùng p->next != NULL là vì chúng ta chỉ muốn đi qua các phần tử có


value.

3.6. Tìm kiếm trong danh sách liên kết


Hàm tìm kiếm này sẽ trả về chỉ số của Node đầu tiên có giá trị bằng với giá trị
cần tìm. Nếu không tìm thấy, chúng ta trả về -1.

0
1 int Search(node head, int value){
2 int position = 0;
3 for(node p = head; p != NULL; p = p->next){
4 if(p->data == value){
5 return position;
6 }
7 ++position;
8 }
9 return -1;
10 }
11

Chúng ta có thể sử dụng hàm này để xóa tất cả các Node trong danh sách liên
kết có giá trị chỉ định như sau:

0
1 node DelByVal(node head, int value){
2 int position = Search(head, value);
3 while(position != -1){
4 DelAt(head, position);
5 position = Search(head, value);
6 }
7 return head;
8}
9

3.7. Duyệt danh sách liên kết

Việc duyệt danh sách liên kết cực đơn giản. Khởi tạo từ Node head, bạn cứ thế
đi theo con trỏ next cho tới trước khi Node đó NULL.

0
1 void Traverser(node head){
2 printf("\n");
3 for(node p = head; p != NULL; p = p->next){
4 printf("%5d", p->data);
5 }
6}
7

3.8. Một số hàm bổ trợ khác

Hàm khởi tạo Node head


Đơn giản là cho con trỏ head = NULL thôi. Nếu bạn để ý, chúng ta vẫn check
head = NULL để biết rằng danh sách liên kết chưa có phần tử nào ở các hàm
phía trên.

0
1 node InitHead(){
2 node head;
3 head = NULL;
4 return head;
5}
6

Hàm lấy số phần tử của DSLK

Duyệt và đếm chừng nào các Node chưa NULL. Sau cùng, trả về giá trị đếm
được.

0
1 int Length(node head){
2 int length = 0;
3 for(node p = head; p != NULL; p = p->next){
4 ++length;
5 }
6 return length;
7}
8

Hàm nhập danh sách liên kết


0
1 node Input(){
2 node head = InitHead();
3 int n, value;
4 do{
5 printf("\nNhap so luong phan tu n = ");
6 scanf("%d", &n);
7 }while(n <= 0);
8
9 for(int i = 0; i < n; ++i){
10 printf("\nNhap gia tri can them: ");
11 scanf("%d", &value);
12 head = AddTail(head, value);
13 }
14 return head;
15 }
16
4. Code hoàn chỉnh của danh sách liên kết đơn
0
1 #include<stdio.h>
2 #include<stdlib.h>
3
4 struct LinkedList{
5 int data;
6 struct LinkedList *next;
7 };
8
9 typedef struct LinkedList *node; //Từ giờ dùng kiểu dữ liệu LinkedList có thể thay bằng node cho ngắn gọn
10
11 node CreateNode(int value){
12 node temp; // declare a node
13 temp = (node)malloc(sizeof(struct LinkedList)); // Cấp phát vùng nhớ dùng malloc()
14 temp->next = NULL;// Cho next trỏ tới NULL
15 temp->data = value; // Gán giá trị cho Node
16 return temp;//Trả về node mới đã có giá trị
17 }
18
19 node AddTail(node head, int value){
20 node temp,p;// Khai báo 2 node tạm temp và p
21 temp = CreateNode(value);//Gọi hàm createNode để khởi tạo node temp có next trỏ tới NULL và giá trị là value
22 if(head == NULL){
23 head = temp; //Nếu linked list đang trống thì Node temp là head luôn
24 }
25 else{
26 p = head;// Khởi tạo p trỏ tới head
27 while(p->next != NULL){
28 p = p->next;//Duyệt danh sách liên kết đến cuối. Node cuối là node có next = NULL
29 }
30 p->next = temp;//Gán next của thằng cuối = temp. Khi đó temp sẽ là thằng cuối(temp->next = NULL mà)
31 }
32 return head;
33 }
34
35
36 node AddHead(node head, int value){
37 node temp = CreateNode(value); // Khởi tạo node temp với data = value
38 if(head == NULL){
39 head = temp; // //Nếu linked list đang trống thì Node temp là head luôn
40 }else{
41 temp->next = head; // Trỏ next của temp = head hiện tại
42 head = temp; // Đổi head hiện tại = temp(Vì temp bây giờ là head mới mà)
43 }
44 return head;
45 }
46
47 node AddAt(node head, int value, int position){
48 if(position == 0 || head == NULL){
49 head = AddHead(head, value); // Nếu vị trí chèn là 0, tức là thêm vào đầu
50 }else{
51 // Bắt đầu tìm vị trí cần chèn. Ta sẽ dùng k để đếm cho vị trí
52 int k = 1;
53 node p = head;
54 while(p != NULL && k != position){
55 p = p->next;
56 ++k;
57 }
58
59 if(k != position){
60 // Nếu duyệt hết danh sách lk rồi mà vẫn chưa đến vị trí cần chèn, ta sẽ mặc định chèn cuối
61 // Nếu bạn không muốn chèn, hãy thông báo vị trí chèn không hợp lệ
62 head = AddTail(head, value);
63 // printf("Vi tri chen vuot qua vi tri cuoi cung!\n");
64 }else{
65 node temp = CreateNode(value);
66 temp->next = p->next;
67 p->next = temp;
68 }
69 }
70 return head;
71 }
72
73 node DelHead(node head){
74 if(head == NULL){
75 printf("\nCha co gi de xoa het!");
76 }else{
77 head = head->next;
78 }
79 return head;
80 }
81
82 node DelTail(node head){
83 node p = head;
84 while(p->next->next != NULL){
85 p = p->next;
86 }
87 p->next = p->next->next; // Cho next bằng NULL
88 // Hoặc viết p->next = NULL cũng được
89 return head;
90 }
91
92 node DelAt(node head, int position){
93 if(position == 0 || head == NULL){
94 head = DelHead(head); // Nếu vị trí chèn là 0, tức là thêm vào đầu
95 }else{
96 // Bắt đầu tìm vị trí cần chèn. Ta sẽ dùng k để đếm cho vị trí
97 int k = 1;
98 node p = head;
99 while(p->next->next != NULL && k != position){
100 p = p->next;
101 ++k;
102 }
103
104 if(k != position){
105 // Nếu duyệt hết danh sách lk rồi mà vẫn chưa đến vị trí cần chèn, ta sẽ mặc định xóa cuối
106 // Nếu bạn không muốn xóa, hãy thông báo vị trí xóa không hợp lệ
107 head = DelTail(head);
108 // printf("Vi tri xoa vuot qua vi tri cuoi cung!\n");
109 }else{
110 p->next = p->next->next;
111 }
112 }
113 return head;
114 }
115
116 int Get(node head, int index){
117 int k = 0;
118 node p = head;
119 while(p != NULL && k != index){
120 p = p->next;
121 }
122 return p->data;
123 }
124
125 int Search(node head, int value){
126 int position = 0;
127 for(node p = head; p != NULL; p = p->next){
128 if(p->data == value){
129 return position;
130 }
131 ++position;
132 }
133 return -1;
134 }
135
136 node DelByVal(node head, int value){
137 int position = Search(head, value);
138 while(position != -1){
139 DelAt(head, position);
140 position = Search(head, value);
141 }
142 return head;
143 }
144
145 void Traverser(node head){
146 printf("\n");
147 for(node p = head; p != NULL; p = p->next){
148 printf("%5d", p->data);
149 }
150 }
151
152 node InitHead(){
153 node head;
154 head = NULL;
155 return head;
156 }
157
158 int Length(node head){
159 int length = 0;
160 for(node p = head; p != NULL; p = p->next){
161 ++length;
162 }
163 return length;
164 }
165
166 node Input(){
167 node head = InitHead();
168 int n, value;
169 do{
170 printf("\nNhap so luong phan tu n = ");
171 scanf("%d", &n);
172 }while(n <= 0);
173
174 for(int i = 0; i < n; ++i){
175 printf("\nNhap gia tri can them: ");
176 scanf("%d", &value);
177 head = AddTail(head, value);
178 }
179 return head;
180 }
181
182
183
184 int main(){
185 printf("\n==Tao 1 danh sach lien ket==");
186 node head = Input();
187 Traverser(head);
188
189 printf("\n==Thu them 1 phan tu vao linked list==");
190 head = AddAt(head, 100, 2);
191 Traverser(head);
192
193 printf("\n==Thu xoa 1 phan tu khoi linked list==");
194 head = DelAt(head, 1);
195 Traverser(head);
196
197 printf("\n==Thu tim kiem 1 phan tu trong linked list==");
198 int index = Search(head, 5);
199 printf("\nTim thay tai chi so %d", index);
200
201 printf("\nBan co the thu them nhe!");
202
203 }
204

Kết quả chạy thử:

0
1 ==Tao 1 danh sach lien ket==
2 Nhap so luong phan tu n = 5
3
4 Nhap gia tri can them: 1
5
6 Nhap gia tri can them: 2
7
8 Nhap gia tri can them: 3
9
10 Nhap gia tri can them: 4
11
12 Nhap gia tri can them: 5
13
14 1 2 3 4 5
15 ==Thu them 1 phan tu vao linked list==
16 1 2 100 3 4 5
17 ==Thu xoa 1 phan tu khoi linked list==
18 1 100 3 4 5
19 ==Thu tim kiem 1 phan tu trong linked list==
20 Tim thay tai chi so 4
21 Ban co the thu them nhe!
22 Process returned 0 (0x0) execution time : 4.166 s
23 Press any key to continue.
24

Series Navigation<< Bảng băm – Hash tablesCài đặt danh sách liên kết đôi
trong C/C++ >>

 THẺ TAG

 cấu trúc dữ liệu

 danh sách liên kết

 danh sách liên kết đơn

 linked list

Chia sẻ

Bài trướcBảng băm – Hash tables


Bài tiếp theoCài đặt danh sách liên kết đôi trong C/C++

Nguyễn Văn Hiếu


https://nguyenvanhieu.vn/
Nguyễn Văn Hiếu là Founder của Hệ thống đào tạo lập trình trực tuyến mang tên "Lập trình không
khó". Đây là một hệ thống website chuyên đào tạo các kiến thức và kỹ năng lập trình miễn phí dành
cho tất cả mọi người.

BÀI VIẾT LIÊN QUANCÙNG TÁC GIẢ


Cấu trúc dữ liệu
Cây tìm kiếm nhị phân – Binary search tree

Cấu trúc dữ liệu


Cây nhị phân – Binary Tree

Cấu trúc dữ liệu


Danh sách liên kết vòng – Circular Linked List

Cấu trúc dữ liệu


Cài đặt danh sách liên kết đôi trong C/C++
Cấu trúc dữ liệu
Hàng đợi – Queue

Cấu trúc dữ liệu


Ngăn xếp – Stack

ĐỂ LẠI BÌNH LUẬN

Save my name, email, and website in this browser for the next time I comment.

Ðang bình lu?n

Bài viết mới nhất

Bài tập PHP xây dựng một trang đăng nhập đơn giản
Anonymous-4 - 28/01/2019
0
Vòng lặp for trong C – Bài 9
Nguyễn Văn Hiếu - 26/01/2019
0

Tìm giá trị đầu tiên trong mảng có chữ số đầu tiên là chữ...
vantam - 23/01/2019
0

Bài tập nhập xuất trong C – Bài 7


Nguyễn Văn Hiếu - 23/01/2019
0

Bài tập câu lệnh SELECT trong SQL – P3


Nguyễn Văn Hiếu - 23/01/2019
0

Kết nối với chúng tôi

556Thành viênTHÍCH

0Người theo dõiTHEO DÕI

7Người theo dõiTHEO DÕI

15,400Người theo dõiĐĂNG KÝ

Từ khóa nổi bật

 Lập trình C/C++130

 Lập trình Java37

 Lập trình Javascript34

 Bài tập Javascript22

 Lập trình Web18

 Machine learning17

 Lập trình Python12

 Thuật toán12

 Cấu trúc dữ liệu12

 Chia sẻ10

Bài viết nổi bật


SQL Server

Bài tập câu lệnh SELECT trong SQL – P2


Nguyễn Văn Hiếu - 23/01/2019
0

Đây là loạt bài tập sql từ cơ bản tới nâng cao dành cho các bạn sinh viên đang học môn Cơ sở dữ...

Counting Sort – Thuật toán sắp xếp đếm phân phối


Nguyễn Văn Hiếu - 22/01/2019
0

Nhập xuất trong C | Hàm printf() và hàm scanf() – Bài 5


Nguyễn Văn Hiếu - 21/01/2019
0

[Khóa học tensorflow] Bài 0 – Giới thiệu về khóa học Tensorflow


Nguyễn Văn Hiếu - 28/07/2018
1

Merge Sort – Sắp xếp trộn


Nguyễn Văn Hiếu - 18/07/2018
0
VỀ CHÚNG TÔI
Lập trình không khó là một trong những blog đào tạo lập trình trực tuyến hàng đầu tại
Việt Nam. Với phương châm "lập trình không khó", chúng tôi đã và đang không ngừng
chia sẻ những kiến thức lập trình bổ ích miễn phí tới cộng đồng lập trình viên Việt.
Liên hệ hợp tác: hieunv.dev[at]gmail.com
THEO DÕI CHÚNG TÔI

© Made with by Nguyễn Văn Hiếu.

CÙNG CHỦ ĐỀ

Bảng băm – Hash tables


22/12/2018

Mảng 1 chiều – One-dimensional Array


18/12/2018

You might also like