Tổ chức lưu trữ dslk đơn
typedef struct NODE {
DATA info;
NODE* pNext;
} NODE;
typedef struct {
NODE* pHead;
} LIST;
Các thao tác cơ bản
Khởi tạo danh sách rỗng: gán pHead = NULL
void Initialize(LIST &list)
{
list.pHead = NULL;
}
Các thao tác cơ bản
Kiểm tra danh sách có rỗng hay không: kiểm tra pHead có bằng NULL
hay không
Kiểm tra danh sách có đầy hay chưa: không kiểm tra được tính đầy đối
với DSLK
bool IsEmpty(LIST list)
{
if (list.pHead == NULL)
return true;
return false;
}
Duy t danh sách: cho con tr p ch y t đầầu đếến cuốếi danh sách
Ph i thay Process bằầng tến hàm t ng ng ươ
void Process (LIST list)
{
NODE* p = list.pHead;
while (p != NULL) {
p = p->pNext;
}
}
Tìm kiếếm m t phầần t trong danh sách: nếếu tm thầếy tr vếầ con tr p, ng c l i tr vếầ NULL ượ
NODE* Search(LIST list, DATA x)
{
NODE* p = list.pHead;
while (p != NULL)
{
if (p->info == x) break;
p = p->pNext;
}
return p;
}
NODE* Search2(LIST list, DATA x, NODE* &q)
{
NODE* p = list.pHead;
while (p != NULL)
{
if (p->info == x) break;
q = p;
p = p->pNext;
}
return p;
}
Thếm m t phầần t vào danh sách • B1: T o m t phầần t trong b nh
NODE* CreateNode(DATA x) {
NODE* p = new NODE;
if (p != NULL)
{
p->info = x;
p->pNext = NULL;
}
return p;
}
Thếm m t phầần t vào danh sách
• B2: Gằến phầần t v a t o vào danh sách
• Gằến vào đầầu danh sách
NODE* InsertHead(LIST &list, DATA x)
{
NODE* p = CreateNode(x);
if (p != NULL)
{
p->pNext = list.pHead;
list.pHead = p;
}
return p;
}
Thếm m t phầần t vào danh sách
B2: Gằến phầần t v a t o vào danh sách
Gằến vào sau phầần t q
NODE* InsertAfter(LIST &list, NODE* q, DATA x)
{
NODE* p = CreateNode(x);
if (p != NULL)
{
p->pNext = q->pNext;
q->pNext = p;
}
return p;
}
• Xóa m t phầần t kh i danh sách
• Xóa phầần t đ ng sau phầần t q
bool DeleteAfter(LIST &list, NODE* q)
{
if (q != NULL)
{
NODE* p = q->pNext;
if (p != NULL)
{
q->pNext = p->pNext;
delete p;
return true;
}
}
return false;
}
Xóa m t phầần t kh i danh sách
• Xóa phầần t có giá tr X
bool DeleteNode(LIST &list, DATA x)
{
NODE* q = NULL;
NODE* p = Search2(list, x, q);
if (p == NULL) return false;
if (q == NULL)
return DeleteHead(list);
else
return DeleteAfter(list, q);
}
Xóa hếết danh sách
void DeleteAll(LIST &list)
{
while ( DeleteHead(list) );
}
Stack và queue
Kh i t o rốỗng
void Initialize(LIST &s)
{
s.pHead = NULL;
}
Ki m tra có rốỗng hay khống
bool IsEmpty(LIST s)
{
if (s.pHead == NULL)
return true;
return false;
}
Thếm m t phầần t vào đ nh Stack
bool Push(LIST &s, DATA x)
{
NODE* p = InsertHead(s,x);
if (p != NULL)
return true;
return false;
}
Lầếy ra m t phầần t kh i đ nh Stack
DATA POP (LIST &s)
{
if ( !IsEmpty(s) )
{
DATA x = s.pHead->info;
DeleteHead(s);
return x;
}
return NULL;
}
Xem thống tin phầần t đ nh Stack
DATA GetTop(LIST s)
{
if ( !IsEmpty(s) )
{
DATA x = s.pHead->info;
return x;
}
return NULL;
}
L u tr d i d ng DSĐư ướ
#define N 100
typedef struct
{
int front;
int rear;
DATA a[N];
} CQUEUE;
L u tr d i d ng DSLKư ướ
typedef struct NODE
{
DATA info;
NODE* pNext;
} NODE;
typedef struct
{
NODE* pHead;
NODE* pTail;
} LQUEUE;
Kh i t o rốỗng
void Initialize(LQUEUE &q)
{
q.pHead = NULL;
q.pTail = NULL;
}
Ki m tra có rốỗng hay khống
bool IsEmpty(LQUEUE q)
{
if (q.pHead == NULL)
return true;
return false;
}
Thếm m t phầần t vào cuốếi
Queue bool Push(LQUEUE &q, DATA x)
{
NODE* p = InsertTail(q,x);
if (p != NULL)
return true;
return false;
}
Lầếy ra m t phầần t đầầu Queue
DATA Pop(LQUEUE &q)
{
if ( !IsEmpty(q) )
{
DATA x = q.pHead->info;
DeleteHead(q);
return x;
}
return NULL;
}
DATA GetFront(LQUEUE q)
{
if ( !IsEmpty(q) )
{
DATA x = q.pHead->info;
return x;
}
}
return NULL;
}
DATA GetRear(LQUEUE q)
{
if ( !IsEmpty(q) ) {
{
DATA x = q.pTail->info;
return x;
}
return NULL;
}
Bài 11-13: Cây, Cây nh phân, Cây BST, Cây cân bằằng
typedef struct BNODE
{
int info;
BNODE* left;
BNODE* right;
} BNODE;
BNODE* CreateNode(int x)
{
BNODE* p = new BNODE;
if (p != NULL)
{
p->info = x;
p->left = NULL;
p->right = NULL;
}
return p;
}
typedef struct
{
BNODE* root;
} BTREE;
void Initialize(BTREE &tree)
{
tree.root = NULL;
}
void CreateBTree(BNODE* &p)
{
int x;
printf(“\n Nhap vao gia tri cua nut: “);
scanf(“%d”, &x);
if (x == -1) return;
p = CreateNode(x);
if (p != NULL) {
printf(“\n Nhap cay con ben trai cua nut %d: “,x);
CreateBTree(p->left);
printf(“\n Nhap cay con ben phai cua nut %d: “,x);
CreateBTree(p->right);
}
}
void PrintTree(BNODE* p, int k)
{
if (p == NULL)
return;

Preview text:

Tổ chức lưu trữ dslk đơn typedef struct NODE { DATA info; NODE* pNext; } NODE; typedef struct { NODE* pHead; } LIST; Các thao tác cơ bản
Khởi tạo danh sách rỗng: gán pHead = NULL
void Initialize(LIST &list) { list.pHead = NULL; } Các thao tác cơ bản
Kiểm tra danh sách có rỗng hay không: kiểm tra pHead có bằng NULL hay không
Kiểm tra danh sách có đầy hay chưa: không kiểm tra được tính đầy đối với DSLK bool IsEmpty(LIST list) { if (list.pHead == NULL) return true; return false; } Duy t danh sách: cho con tr ệ p ch
ỏ y tạ đầầu đếến cuốếi danh sá ừ ch Ph i tha ả
y Process bằầng tến hàm t ng ươ ng ứ void Process (LIST list) { NODE* p = list.pHead; while (p != NULL) { p = p->pNext; } } Tìm kiếếm m t phầần t ộ trong danh s ử
ách: nếếu tm thầếy tr vếầ con tr ả p, ng ỏ c l ượ i tr ạ vếầ N ả ULL
NODE* Search(LIST list, DATA x) { NODE* p = list.pHead; while (p != NULL) { if (p->info == x) break; p = p->pNext; } return p; }
NODE* Search2(LIST list, DATA x, NODE* &q) { NODE* p = list.pHead; while (p != NULL) { if (p->info == x) break; q = p; p = p->pNext; } return p; } Thếm m t phầần t ộ v
ử ào danh sách • B1: T o m ạ t phầần t ộ trong b ử ộ nhớ NODE* CreateNode(DATA x) { NODE* p = new NODE; if (p != NULL) { p->info = x; p->pNext = NULL; } return p; } Thếm m t phầần t ộ v ử ào danh sách • B2: Gằến phầần t v ử a t ừ o v ạ ào danh sách
• Gằến vào đầầu danh sách
NODE* InsertHead(LIST &list, DATA x) { NODE* p = CreateNode(x); if (p != NULL) { p->pNext = list.pHead; list.pHead = p; } return p; } Thếm m t phầần t ộ v ử ào danh sách B2: Gằến phầần t v ử a t ừ o v ạ ào danh sách
Gằến vào sau phầần t q ử
NODE* InsertAfter(LIST &list, NODE* q, DATA x) { NODE* p = CreateNode(x); if (p != NULL) { p->pNext = q->pNext; q->pNext = p; } return p; } • Xóa m t phầần t ộ kh ử i danh sách ỏ • Xóa phầần t đ ử ng sau phầần t ứ q ử
bool DeleteAfter(LIST &list, NODE* q) { if (q != NULL) { NODE* p = q->pNext; if (p != NULL) { q->pNext = p->pNext; delete p; return true; } } return false; } Xóa m t phầần t ộ kh ử i danh sách ỏ • Xóa phầần t có gi ử á tr X ị
bool DeleteNode(LIST &list, DATA x) { NODE* q = NULL; NODE* p = Search2(list, x, q); if (p == NULL) return false; if (q == NULL) return DeleteHead(list); else return DeleteAfter(list, q); } Xóa hếết danh sách void DeleteAll(LIST &list) { while ( DeleteHead(list) ); } Stack và queue Khởi t o rốỗng ạ void Initialize(LIST &s) { s.pHead = NULL; } Ki m tra c ể ó rốỗng hay khống bool IsEmpty(LIST s) { if (s.pHead == NULL) return true; return false; } Thếm m t phầần t ộ v ử ào đ nh Stack ỉ
bool Push(LIST &s, DATA x) { NODE* p = InsertHead(s,x); if (p != NULL) return true; return false; } Lầếy ra m t phầần t ộ kh ử i đ ỏ nh Stac ỉ k DATA POP (LIST &s) { if ( !IsEmpty(s) ) { DATA x = s.pHead->info; DeleteHead(s); return x; } return NULL; } Xem thống tin phầần t ử đ ở nh Stack ỉ DATA GetTop(LIST s) { if ( !IsEmpty(s) ) { DATA x = s.pHead->info; return x; } return NULL; } L u tr ư ữ d i d ướ ng DSĐ ạ #define N 100 typedef struct { int front; int rear; DATA a[N]; } CQUEUE; L u tr ư ữ d i d ướ ng DSLK ạ typedef struct NODE { DATA info; NODE* pNext; } NODE; typedef struct { NODE* pHead; NODE* pTail; } LQUEUE; Khởi t o rốỗng ạ
void Initialize(LQUEUE &q) { q.pHead = NULL; q.pTail = NULL; } Ki m tra c ể ó rốỗng hay khống bool IsEmpty(LQUEUE q) { if (q.pHead == NULL) return true; return false; } Thếm m t phầần t ộ v ử ào cuốếi
Queue bool Push(LQUEUE &q, DATA x) { NODE* p = InsertTail(q,x); if (p != NULL) return true; return false; } Lầếy ra m t phầần t ộ ử đầầu Queue ở DATA Pop(LQUEUE &q) { if ( !IsEmpty(q) ) { DATA x = q.pHead->info; DeleteHead(q); return x; } return NULL; } DATA GetFront(LQUEUE q) { if ( !IsEmpty(q) ) { DATA x = q.pHead->info; return x; } } return NULL; } DATA GetRear(LQUEUE q) { if ( !IsEmpty(q) ) { { DATA x = q.pTail->info; return x; } return NULL; }
Bài 11-13: Cây, Cây nh phân, Câ ị y BST, Cây cân bằằng typedef struct BNODE { int info; BNODE* left; BNODE* right; } BNODE; BNODE* CreateNode(int x) { BNODE* p = new BNODE; if (p != NULL) { p->info = x; p->left = NULL; p->right = NULL; } return p; } typedef struct { BNODE* root; } BTREE;
void Initialize(BTREE &tree) { tree.root = NULL; }
void CreateBTree(BNODE* &p) { int x;
printf(“\n Nhap vao gia tri cua nut: “); scanf(“%d”, &x); if (x == -1) return; p = CreateNode(x); if (p != NULL) {
printf(“\n Nhap cay con ben trai cua nut %d: “,x); CreateBTree(p->left);
printf(“\n Nhap cay con ben phai cua nut %d: “,x); CreateBTree(p->right); } }
void PrintTree(BNODE* p, int k) { if (p == NULL) return;