Lớp dẫn xuất (derived class) trong lập trình hướng đối tượng với C++
1. Truy nhập các thành phần trong lớp dẫn xuất Các thành phần của lớp dẫn...
Kết quả sẽ mở trong tab mới, giới hạn trong website này.
Truy cập nhanh
Tìm kiếm gần đây
Có nhiều thao tác trên danh sách liên kết đơn như thêm node, hủy node, tìm kiếm node trong danh sách, sắp xếp danh sách,… 1. Định nghĩa danh sách liên kết đơn Giả sử, chúng ta tạo một danh sách liên kết đơn lưu trữ một dãy số nguyên như sau: 2. Khởi tạo […]
Có nhiều thao tác trên danh sách liên kết đơn như thêm node, hủy node, tìm kiếm node trong danh sách, sắp xếp danh sách,…
Giả sử, chúng ta tạo một danh sách liên kết đơn lưu trữ một dãy số nguyên như sau:
struct node{
int info;
node *next;
};
struct sList{
node *head;
node *tail;
};
Xây dựng hàm createList() để gán các con trỏ head và tail trỏ về NULL.
void createsList(sList &l){
l.head = NULL;
l.tail = NULL;
}
Xây dựng hàm createNode() có tham số là giá trị của node muốn tạo. Hàm createNode() có kiểu trả về là con trỏ node.
node* createNode(int x){
node *p;
p = new node;
if(p==NULL){
cout<<"Khong du bo nho!";
exit(1);
}
p->info = x;
p->next = NULL;
return p;
}
Trường hợp 1: Nếu danh sách liên kết đơn rỗng thì node mới được xem là node đầu tiên và cũng là node cuối cùng.
Trường hợp 2: Nếu danh sách liên kết đơn không rỗng thì:
void insertHead(sList &l, int x){
node *p;
p = createNode(x);
if(p==NULL){
cout<<"Khong tao duoc node!";
exit(1);
}
if(l.head==NULL){//trường hợp danh sách rỗng
l.head = l.tail = p;
}else{//trường hợp danh sách không rỗng
p->next = l.head;
l.head = p;
}
}
Trường hợp 1: Nếu danh sách liên kết đơn rỗng thì node mới được xem là node đầu tiên và cũng là node cuối cùng.
Trường hợp 2: Nếu danh sách liên kết đơn không rỗng thì:
void insertTail(sList &l, int x){
node *p = createNode(x);
if(p==NULL){
cout<<"Khong tao duoc nut moi!";
exit(1);
}
if (l.head==NULL){//trường hợp danh sách rỗng
l.head = l.tail = p ;
}else{//trường hợp danh sách không rỗng
l.tail->next = p;
l.tail = p;
}
}
Cho con trỏ liên kết (next) của node p chỉ vào node sau của q.
Cho con trỏ liên kết của q chỉ vào node p.
Nếu q là nút cuối thì gán lại p là nút cuối.
void insertAfter(sList &l, node *p, node *q){
p->next = q->next;
q->next = p;
if (q == l.tail){
l.tail = p;
}
}
void processList(sList &l){
node *p;
p = l.head;
while (p!= NULL){
cout<<p->info<<endl;//xuất giá trị trong node
p = p->next;
}
}
Hàm searchList() có kiểu trả về là con trỏ node. Nếu tìm thấy x thì node được trả về khác NULL, ngược lại node được trả về là NULL.
node* searchList(sList l, int k){
node *p;
p = l.head;
while((p!= NULL)&&(p->info != k)){
p = p->next;
}
return p;
}
Sử dụng lệnh delete để giải phóng bộ nhớ lưu trữ các node trong danh sách.
void deleteList(sList &l){
node *p;
while (l.head!= NULL){
p = l.head;
l.head = p->next;
delete p;
}
l.tail = NULL;
}
Có thể sử dụng thuật toán sắp xếp chọn trực tiếp (Selection Sort) để sắp xếp danh sách liên kết đơn.
void List_Selection_Sort(sList &l){
node *min;
node *p, *q;
p = l.head;
while(p != l.tail){
min = p; q = p->next;
while(q != NULL){
if(q->info < min->info){
min = q;
}
q= q->next;
}
swap(min->info, p->info);
p = p->next;
}
}
Bên dưới là hình minh họa một danh sách liên kết đơn.
Hãy viết chương trình với C++ để thao tác với danh sách liên kết đơn ở trên:
a. Tạo danh sách liên kết đơn như hình minh họa.
b. Thêm một node có giá trị là 9 vào đầu danh sách.
c. Xuất giá trị và địa chỉ của các node trong danh sách lên màn hình.
d. Sắp xếp danh sách theo thứ tự tăng dần các giá trị của các node.
e. Giải phóng bộ nhớ cho toàn bộ danh sách.