Professional Documents
Culture Documents
Vũ Song Tùng
1
NỘI DUNG
Đặc điểm của C/C++ 3
2
I. Đặc điểm của C/C++
Ngôn ngữ C
3
I. Đặc điểm của C/C++
4
II. Các thành phần cơ bản
Bộ ký tự
Chú thích
Định danh
Hằng
Biến
Vào/ra
5
II. Các thành phần cơ bản
2.1. Bộ ký tự
#include <iostream>
void main()
{
int Arr[] = { 1, 2, 3, 4 };
for (int i = 0; i < 4; i++)
std::cout << Arr[i] << '\t';
}
6
II. Các thành phần cơ bản
7
II. Các thành phần cơ bản
8
II. Các thành phần cơ bản
2.4. Hằng
Ví dụ
9
II. Các thành phần cơ bản
2.4. Hằng
10
II. Các thành phần cơ bản
2.5. Biến
11
II. Các thành phần cơ bản
2.5. Biến
Ví dụ
12
II. Các thành phần cơ bản
2.5. Biến
double 8 ±1.7E±308
long double 8 ±1.7E±308
13
II. Các thành phần cơ bản
2.5. Biến
void main()
{
int x = 10, y; Trong một khối {…}, các tên biến phải khác nhau
// Các biểu thức
14
II. Các thành phần cơ bản
2.5. Biến
int sz;
sz = sizeof(sz); // sz = 4
sz = sizeof(long long); // sz = 8
sz = sizeof("12345"); // sz = 6
15
II. Các thành phần cơ bản
2.5. Biến
• Kiểu liệt kê
• Dùng để định danh cho các giá trị kiểu int
Ví dụ
16
II. Các thành phần cơ bản
2.6. Vào/ra
double a, b, c;
cout << "Nhap a, b, c: ";
cin >> a >> b >> c; // Dùng dấu cách, TAB hoặc ENTER để phân biệt các luồng
if (a != 0)
{
cout << "delta = " << b*b - 4*a*c << '\n';
// Các biểu thức
}
else
cerr << "a phai khac 0.\n";
17
II. Các thành phần cơ bản
18
II. Các thành phần cơ bản
PhuongTrinhBac2.cpp
#include <iostream> // thư viện vào/ra
using namespace std; // nơi khai báo các thành phần chuẩn
void main()
{
double a, b, c;
cout << "Nhap a, b, c: "; cin >> a >> b >> c;
if (a != 0) {
// Đoạn biểu thức giải và biện luận phương trình //
}
else
cerr << "He so a phai khac 0.";
19
II. Các thành phần cơ bản
PhuongTrinhBac2.cpp
20
II. Các thành phần cơ bản
Bài tập
21
III. Biểu thức và toán tử
Biểu thức
Các toán tử đơn
Các toán tử có cấu
trúc
22
III. Biểu thức và toán tử
Ví dụ
23
III. Biểu thức và toán tử
24
III. Biểu thức và toán tử
• Toán tử gán:
Cú pháp lvalue = rvalue
lvalue – tên_biến, rvalue – một biểu thức
Ví dụ
a = 5; // gán 5 vào a
a = b = c = 5; // tương đương: c = 5; b = c; a = b;
a = b + (c = 5); // tương đương: c = 5; a = b + c;
25
III. Biểu thức và toán tử
+ Cộng / Chia
- Trừ hoặc đổi dấu % Chia dư
* Nhân
Ví dụ
a = 1 / 5; // a = 0
a = 1.0 / 5; // a = 0.2
a = (double)1 / 5; // a = 0.2
a = 11 % 3; // a = 2
++ Tăng 1
-- Giảm 1
Ví dụ
27
III. Biểu thức và toán tử
28
III. Biểu thức và toán tử
Ví dụ
29
III. Biểu thức và toán tử
&& Và
|| Hoặc
! Phủ định
Ví dụ
30
III. Biểu thức và toán tử
Ví dụ
31
III. Biểu thức và toán tử
Ví dụ
32
III. Biểu thức và toán tử
33
III. Biểu thức và toán tử
34
III. Biểu thức và toán tử
Ví dụ
35
0
Biểu thức logic
36
III. Biểu thức và toán tử
Ví dụ
37
0
Biểu thức logic
38
III. Biểu thức và toán tử
Ví dụ
// tìm ước số chung lớn nhất của a và b
while (b != 0)
{
int r = a % b;
a = b;
b = r;
}
uscln = a;
39
0
Biểu thức logic
40
III. Biểu thức và toán tử
Ví dụ
//
41
Khói biểu thức
42
III. Biểu thức và toán tử
Ví dụ
// tìm N!
int gt = 1;
for (int i = 2; i <= N; i++)
gt *= i;
43
Biểu thức khởi tạo
0
Biểu thức logic
44
III. Biểu thức và toán tử
45
III. Biểu thức và toán tử
46
III. Biểu thức và toán tử
47
III. Biểu thức và toán tử
Bài tập
• Viết chương trình in ra màn hình các giá trị từ 1 đến k dưới dạng ma
trận mxn với k = mxn, m và n được khởi tạo trong hàm main().
• Viết chương trình xác định dạng tam giác được cho bởi 3 cạnh a, b, c
là các số thực. Yêu cầu:
– Nhập 3 cạnh của tam giác
– In ra màn hình kiểu của tam giác:
• Tam giac thuong
• Tam giac vuong
• Tam giac can
• Tam giac vuong can
• Tam giac deu
– Chương trình chỉ kết thúc khi a, b, c không tạo thành tam giác
48
III. Biểu thức và toán tử
Bài tập
• Viết chương trình in ra màn lịch của năm nay theo mẫu của năm 2000:
Thang 1
CN T2 T3 T4 T5 T6 T7
1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31
Thang 2
CN T2 T3 T4 T5 T6 T7
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29
49
IV. Hàm, mảng và con trỏ
Mảng
Con trỏ và tham chiếu
Hàm
50
IV. Hàm, mảng và con trỏ
4.1. Mảng
51
IV. Hàm, mảng và con trỏ
4.1. Mảng
int A[2];
short B[] = { 10, 256, 1024 };
char S[100] = { 'A', 'B', 'C', 0 };
A B S
A[0] 0x0A B[0] 0x41 S[0]
0x00 0x42
0x00 B[1] 0x43
0x01 0x00 S[3]
A[1] 0x00 B[2]
0x04
– S[99]
52
IV. Hàm, mảng và con trỏ
4.1. Mảng
• Xâu ký tự (string)
• Mảng các ký tự, kết thúc bằng ký tự NULL
• Biến xâu ký tự được khai báo bằng một mảng kiểu
char (biểu thức khởi tạo có thể là một hằng xâu ký tự)
Ví dụ
// nhập và kiểm tra mật khẩu
char pwd[] = "12345678";
char s[100];
53
IV. Hàm, mảng và con trỏ
Bài tập
• Thiết kế và cài đặt chương trình thực hiện các thao tác sau:
– Khai báo một mảng chứa 1000 số nguyên
– Đặt giá trị ngẫu nhiên từ 1 .. 1000 cho các phần tử của mảng (dùng hàm
rand())
– Đếm số lượng số chẵn, số lẻ và số chia hết cho 8 của mảng
54
IV. Hàm, mảng và con trỏ
4.2. Con trỏ và tham chiếu
55
IV. Hàm, mảng và con trỏ
4.2. Con trỏ và tham chiếu
r = 10; // -> a = 10
b = *p; // p đang trỏ vào a -> b = 10
56
IV. Hàm, mảng và con trỏ
4.2. Con trỏ và tham chiếu
double A[10], *p = A;
57
IV. Hàm, mảng và con trỏ
4.2. Con trỏ và tham chiếu
new kiểu
new kiểu[kích_thước]
delete tên_biến;
delete []tên_biến;
58
IV. Hàm, mảng và con trỏ
4.2. Con trỏ và tham chiếu
Vi dụ
61
IV. Hàm, mảng và con trỏ
4.3. Hàm
Vi dụ
int factorial(int );
62
IV. Hàm, mảng và con trỏ
4.3. Hàm
Chú ý:
• Dùng tham số con trỏ thay cho mảng trong prototype của hàm
• VD. int sum(int *, int);
• Có thể dùng từ khóa const để cấm thay đổi giá trị các tham số trong hàm
• VD. int max(const int, const int);
63
IV. Hàm, mảng và con trỏ
4.3. Hàm
a = power(3); // N = 2
a = power(3, 4); // N = 4
64
IV. Hàm, mảng và con trỏ
4.3. Hàm
• Toán tử return
return;
// thoát khỏi hàm
// dùng cho các hàm kiểu void
Vi dụ
void main()
{
// các biểu thức
if (a == 0)
return;
// các biểu thức
}
65
IV. Hàm, mảng và con trỏ
4.3. Hàm
• Toán tử return
return (biểu thức);
// thoát khỏi hàm
// dùng cho các hàm khác kiểu void
// trả về cho hàm giá trị của biểu thức
Vi dụ
66
IV. Hàm, mảng và con trỏ
4.3. Hàm
• Gọi hàm
tên_hàm(danh sách đối số)
// tên_hàm phải được khai báo trước khi gọi
// danh sách đối số phải phù hợp với danh sách tham số
// về số lượng và kiểu
Vi dụ
void main()
{
int f = Factorial(5);
double p = power(2.5, 3);
}
67
IV. Hàm, mảng và con trỏ
4.3. Hàm
68
IV. Hàm, mảng và con trỏ
4.3. Hàm
void main()
{
int arr[] = { 1, 2, 3, 4 };
int s = sum(arr, 4);
}
69
IV. Hàm, mảng và con trỏ
4.3. Hàm
void main()
{
int x = 10;
change1(x); // x không thay đổi
change2(&x); // x = 11
change3(x); // x = 12
}
70
IV. Hàm, mảng và con trỏ
4.3. Hàm
71
IV. Hàm, mảng và con trỏ
4.3. Hàm
void foo(int a)
{
// có thể gọi goo
}
// 3.cpp
void goo(int a, int b)
{ // prototype của foo và goo
// có thể gọi foo extern void foo(int);
} extern void goo(int, int);
72
IV. Hàm, mảng và con trỏ
4.3. Hàm
73
IV. Hàm, mảng và con trỏ
4.3. Hàm
• Hàm inline
• Chương trình dịch thay các biểu thức của hàm inline
vào biểu thức gọi hàm
• Không nên chứa các vòng lặp
Ví dụ
inline double modul(double a, double b)
{
return sqrt(a * a + b * b);
}
void main()
{
cout << modul(3, 4); // cout << sqrt(3* 3 + 4 * 4)
}
74
IV. Hàm, mảng và con trỏ
4.3. Hàm
int foo(int n) {
if (n < 2) return 1;
return n * foo(n – 1);
}
int goo(int a) { return a * a; }
void main()
{
cout << get(5, &foo) << ' ' << get(4, &goo);
}
75
IV. Hàm, mảng và con trỏ
4.3. Hàm
void main()
{
int x = 5, y = 10;
cout << max(x, y);
max(x, y) = 7;
cout << x << ' ' << y;
}
76
IV. Hàm, mảng và con trỏ
4.3. Hàm
double power(double x) {
return x * x;
}
double power(double x, int N) {
if (N == 0) return 1;
if (N < 0) return 1/power(x, -N);
return x * power(x, N – 1);
}
double power(double x, double y) {
return exp(y * log(x));
}
77
IV. Hàm, mảng và con trỏ
4.3. Hàm
double a;
78
IV. Hàm, mảng và con trỏ
4.3. Hàm
• Hàm mẫu
• Dùng để sinh ra các hàm có cấu trúc giống nhau, chỉ
phân biệt về kiểu của các tham số
Ví dụ
template <class _T>
_T abs(_T x)
{
return (x < 0? –x: x);
}
void main()
{
cout << abs(-1) // hàm sinh: int abs(int x) {...}
<< abs(2.0); // hàm sinh: double abs(double x) {...}
}
79
IV. Hàm, mảng và con trỏ
Bài tập
• Cài đặt hàm giải phương trình bậc 2 sau:
• Thiết kế và cài đặt hàm trả về xâu ký tự theo chuẩn họ tên từ xâu đầu
vào.
v u H A I m i n h \0
V u H a i M i n h \0
80
IV. Hàm, mảng và con trỏ
Bài tập
• Cài đặt hàm sau:
• Viết chương trình so sánh các thuật toán sắp xếp với các mảng 100,
1000, 10000 và 100000 phần tử
81
V. Kiểu dữ liệu trừu tượng
82
V. Kiểu dữ liệu trừu tượng
5.1. Các khái niệm
83
V. Kiểu dữ liệu trừu tượng
5.1. Các khái niệm
• Ví dụ:
• Một hình chữ nhật (Rectangle) được xác định bởi:
– tọa độ góc trên bên trái: x1, y1
– tọa độ góc dưới bên phải: x2, y2
– tính diện tích: Area = (y2 – y1) * (x2 – x1)
• Một hình ô van (Elipse) nội tiếp trong hình chữ nhật:
– tính diện tích: Area = Rectagle::Area * / 4
84
V. Kiểu dữ liệu trừu tượng
5.1. Các khái niệm
• Ví dụ (struct):
struct Rectangle
{
double x1, y1;
double x2, y2;
double Area() { return (y2 - y1) * (x2 - x1); }
};
85
V. Kiểu dữ liệu trừu tượng
5.1. Các khái niệm
• Ví dụ (class):
class Rectangle
{
public:
double x1, y1;
double x2, y2;
double Area() { return (y2 - y1) * (x2 - x1); }
};
void main()
{
Rectangle r = { 1, 1, 6, 3 };
Elipse e;
e.x1 = 12; e.y1 = 2;
e.x2 = 17; e.y2 = 7;
87
V. Kiểu dữ liệu trừu tượng
5.1. Các khái niệm
88
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
class tên_ADT
{
kiểu tên_hàm(danh sách tham số)
{
// các biểu thức
}
};
90
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
class tên_ADT
{
kiểu tên_hàm(danh sách tham số);
};
91
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
92
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
class tên_ADT
{
public:
tên_ADT(); // hàm tạo mặc định
tên_ADT(danh sách tham số); // hàm tạo thiết lập
tên_ADT(const tên_kiểu &); // hàm tạo copy
~tên_ADT(); // hàm hủy
};
93
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
class tên_ADT
{
public:
tên_ADT(danh sách tham số)
: tên_biến(biểu thức)
, ...
{
// các biểu thức
}
};
94
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
• Ví dụ (class Time)
class Time
{
long ticks;
public:
Time() { ticks = 0; }
Time(long value) : ticks(value) { }
Time(const Time & t) : ticks(t.ticks) { }
~Time() { }
public:
long Seconds() { return ticks / 1000; }
long Minutes() { return Seconds() / 60; }
long Hours() { return Seconds() / 3600; }
};
95
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
• Ví dụ (class Time)
void main()
{
Time *p;
Time t1; // gọi Time()
Time t2(1000); // gọi Time(long)
Time t3 = t2; // gọi Time(const Time &)
• Ví dụ (class String)
– Các biến thành viên và các hàm static
class String
{
char *data; // Vùng dữ liệu chứa các ký tự
int len; // Số ký tự
public:
// Lấy độ dài xâu src
static int GetLength(const char * src);
97
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
• Ví dụ (class String)
– Các hàm private
private:
// Hàm tạo đối lượng chứa được n ký tự
String(int n) { createData(n); }
98
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
• Ví dụ (class String)
– Các hàm tạo và hàm hủy
public:
String() { createData(0); }
99
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
• Ví dụ (class String)
– Các hàm public
public:
// Lấy số ký tự
int Length() { return len; }
• Ví dụ (class String)
– Các toán tử
public:
String operator=(const char * src);
String operator=(String & src);
}; // class String
101
V. Kiểu dữ liệu trừu tượng
5.2. Xây dựng ADT
• Ví dụ (class String)
– Định nghĩa các hàm
int String::GetLength(const char * src)
{
register int i = 0;
while (src[i]) ++i;
return i;
}
• Ví dụ (class String)
– Định nghĩa các hàm
103
V. Kiểu dữ liệu trừu tượng
5.3. Các toán tử
• Toán tử gán
{
Time t1, t2;
String s1, s2;
} delete[] s2.data
delete[] s1.data sinh ra lỗi vì s1.data đã bị xóa
104
V. Kiểu dữ liệu trừu tượng
5.3. Các toán tử
• Toán tử gán
105
V. Kiểu dữ liệu trừu tượng
5.3. Các toán tử
len = s.len;
char *p = data; data = s.data; s.data = p;
return *this;
}
107
V. Kiểu dữ liệu trừu tượng
5.3. Các toán tử
108
V. Kiểu dữ liệu trừu tượng
5.3. Các toán tử
• Toán tử chỉ số
109
V. Kiểu dữ liệu trừu tượng
5.3. Các toán tử
• Toán tử hàm
kiểu operator()(danh sách tham số) { ... }
Ví dụ
Lấy giá trị của hàm theo một tập các đối số
Truy cập phần tử của mảng n chiều
110
V. Kiểu dữ liệu trừu tượng
5.3. Các toán tử
111
V. Kiểu dữ liệu trừu tượng
5.3. Các toán tử
113
V. Kiểu dữ liệu trừu tượng
Bài tập
• Xây dựng class PhanSo mô tả kiểu phân số gồm các thành phần sau:
– Hai biến a, b chứa tử số và mẫu số
– Các hàm tạo
– Các toán tử cộng, trừ, nhân, chia và kết hợp
– Toán tử luồng ra
VD. PhanSo a(2, 4); cout << a + 1; 3/2
• Xây dựng class Complex mô tả kiểu số phức gồm các thành phần
sau:
– Hai biến r, i chứa phần thực và phần ảo
– Các hàm tạo
– Các toán tử cộng, trừ, nhân, chia và kết hợp
– Toán tử hàm để lấy mô-đun
– Toán tử luồng ra
VD. Complex z(1, 3); cout << z + 1; (2, 3i)
114
V. Kiểu dữ liệu trừu tượng
5.4. Kế thừa
• Mô hình
class ADT_cơ_sở {
protected|public:
virtual void foo() { ... }
};
115
V. Kiểu dữ liệu trừu tượng
5.4. Kế thừa
ADT_cơ_sở
116
V. Kiểu dữ liệu trừu tượng
5.4. Kế thừa
• Ví dụ về sự kế thừa
class B {
protected: int x;
public:
B(int a = 0) : x(a) { }
virtual void Print() { cout << x; }
void Inc() { x++; }
};
class D : public B {
int x;
public:
D(int a, int b) : x(a), B(b) { }
void Print() {
cout << x << ", ";
B::Print();
}
};
117
V. Kiểu dữ liệu trừu tượng
5.4. Kế thừa
• Ví dụ về sự kế thừa
void main()
{
B b(5);
D d(1, 2);
d.Inc();
B *p = &b;
p->Print(); // gọi B::Print() -> 5
p = &d;
p->Print(); // gọi D::Print() -> 1, 3
}
118
V. Kiểu dữ liệu trừu tượng
5.4. Kế thừa
119
V. Kiểu dữ liệu trừu tượng
5.4. Kế thừa
class Shape
{
String _name;
public:
Shape(const char *name) : _name(name) { }
void Print()
{
cout << _name << ": Area = " << Area() << endl;
}
virtual double Area() = 0;
};
120
V. Kiểu dữ liệu trừu tượng
5.4. Kế thừa
121
V. Kiểu dữ liệu trừu tượng
5.4. Kế thừa
122
V. Kiểu dữ liệu trừu tượng
5.4. Kế thừa
• Ví dụ
void main()
{
Shape *s[2];
123
VI. Các cấu trúc dữ liệu cơ bản
5.5. ADT mẫu
• ADT mẫu
template <class _T, int n> class Shape
{
_T edge[n]; // các cạnh
public:
_T Bound();
};
void main()
{
Shape<int, 3> tamGiac; // tạo ra class Shape có 3 cạnh kiểu int
Shape<double, 4> tuGiac;// tạo ra class Shape có 4 cạnh kiểu double
}
124
V. Kiểu dữ liệu trừu tượng
Bài tập
• class Matrix mô tả một ma trận được cho dưới đây
template <class _T> class Matrix {
_T **data;
int rows, cols; // số hàng và số cột
public:
Matrix() : data(0) { }
Matrix(int m, int n = 0); // tạo ma trận mxn hoặc mxm
Matrix(int m, int n, const _T*); // tạo ma trận mxn kiểu ưu tiên
// hàng từ mảng 1 chiều
Matrix(const Matrix& M);
~Matrix() { deleteData(); }
125
V. Kiểu dữ liệu trừu tượng
Bài tập
• Định nghĩa các hàm của Matrix
template <class _T> void Matrix<_T>::createData()
{
data = new _T *[rows];
for (int i = 0; i < rows; i++)
data[i] = new _T[cols];
}
126
V. Kiểu dữ liệu trừu tượng
Bài tập
• Các yêu cầu:
– Hoàn thành tất cả các hàm của class Matrix
– Bổ sung toán tử gán, và cộng ma trận
– Xây dựng class Graphic mô tả đồ thị có hướng không trọng số kế
thừa từ Matrix và có thể sử dụng trong đoạn biểu thức sau:
int M[] = {
0, 1, 1, 0, 1,
1, 0, 1, 0, 0,
1, 0, 0, 1, 1,
0, 0, 1, 0, 1,
0, 1, 0, 1, 0
};
Graphic g(5, M);
g.DFT(2); // in ra màn hình chỉ số các đỉnh
// theo chiều sâu bắt đầu từ đỉnh 2
127
VI. Các cấu trúc dữ liệu cơ bản
Array, BoundStack và
BoundQueue
LinkedList
128
VI. Các cấu trúc dữ liệu cơ bản
6.1. Array, BoundStack và BoundQueue
129
VI. Các cấu trúc dữ liệu cơ bản
6.1. Array, BoundStack và BoundQueue
int IsEmpty();
int IsFull();
int Count();
T operator[](int index);
};
130
VI. Các cấu trúc dữ liệu cơ bản
6.1. Array, BoundStack và BoundQueue
int IsEmpty();
int IsFull();
int Count();
T operator[](int index);
};
131
VI. Các cấu trúc dữ liệu cơ bản
6.1. Array, BoundStack và BoundQueue
while (!s.IsEmpty()) {
Segment b = s.Pop();
if (b.Ub - b.Lb + 1 > n0) {
int j = b.DoPart(a);
133
VI. Các cấu trúc dữ liệu cơ bản
6.1. Array, BoundStack và BoundQueue
int main()
{
int v[] = { 7, 5, 4, 8, 9, 1, 3, 2, 0, 6 };
Array<int> a(10);
a.CopyFrom(v);
Sort<int>::DoSort(a);
for (int i = 0; i < a.Size(); i++) cout << a[i] << ' ';
}
134
VI. Các cấu trúc dữ liệu cơ bản
6.2. LinkedList
• class LinkedList
template <class _Ti> class LinkedList
{
protected:
// Đoạn định nghĩa các lớp con //
baseList<_Ti> h;
int n;
public:
LinkedList() : n(0) { }
~LinkedList() { h.makeEmpty(); }
_Ti PopBegin();
_Ti PopEnd();
void RemoveAll() { h.makeEmpty(); n = 0; }
void PushBegin(const _Ti& i);
void PushEnd(const _Ti& i)
};
135
VI. Các cấu trúc dữ liệu cơ bản
6.2. LinkedList
do {
char c = (char)((x & 1) + 48);
x >>= 1;
stack.PushBegin(c);
} while (x);
while (!stack.IsEmpty())
s += stack.PopBegin();
return s;
}
137
VI. Các cấu trúc dữ liệu cơ bản
6.3. Binary Search Tree
• class cơ sở
template <class _Ti> class baseBST {
public:
baseBST() { }
virtual baseBST * insert(const _Ti& ) = 0;
virtual baseBST * contents(const _Ti& ) { return 0 ; }
virtual baseBST * remove(const _Ti& ) { return this; }
virtual baseBST * getSuccessor() { return 0; }
virtual void makeEmpty() { }
virtual _Ti * Info() { return 0; }
};
138
VI. Các cấu trúc dữ liệu cơ bản
6.3. Binary Search Tree
• class BST
template <class _Ti, int comp(const _Ti&, const _Ti& ) = _compare> class BST {
// Đoạn định nghĩa các class con //
nullBST nullBST;
baseBST<_Ti> * root;
public:
BST() { root = (baseBST<_Ti> *)&nullBST; }
~BST() { root->makeEmpty(); }
139
VI. Các cấu trúc dữ liệu cơ bản
6.3. Binary Search Tree
void makeEmpty();
baseBST * insert(const _Ti& );
baseBST * contents(const _Ti& );
baseBST * remove(const _Ti& );
baseBST * getSuccessor();
};
140
VI. Các cấu trúc dữ liệu cơ bản
6.3. Binary Search Tree
class VarDef
{
public:
string name;
int line;
VarDef() { }
VarDef(const char* s, int l) : name(s), line(l) { }
141
VI. Các cấu trúc dữ liệu cơ bản
6.3. Binary Search Tree
142