Cấu trúc dữ liệu là môn học căn bản nhưng là ác mộng của hơn 80% sinh viên học chuyên ngành công nghệ thông tin. Bài giảng trên lớp nhanh, ít ví dụ minh họa, ít thực hành. Sinh viên tự phải xoay sở lập trình bài tập để nộp.Đây là toàn bộ bài giảng về môn cấu trúc dữ liệu. Gồm 299 slide giúp hiểu hết về môn Cấu trúc dữ liệu, có cả bài tập để sinh viên thực hànhH
Trang 1CẤU TRÚC DỮ LIỆU
Nội dung gồm 6 chương:
Trang 2KHOA KHOA HỌC MÁY TÍNH – BỘ MÔN LẬP TRÌNH
Trang 3
1 Ý nghĩa cấu trúc dữ liệu
2 Cấu trúc dữ liệu và các vấn đề liên quan
3 Thuật toán
NỘI DUNG TRÌNH BÀY
Trang 4
1 Ý nghĩa cấu trúc dữ liệu
DATA STRUCTURE + ALGORITHM = PROGRAM
Niklaus wirth
• Để giải bài toán trên máy tính: cần thuật toán
• Thuật toán phản ánh các phép xử lý
• Đối tượng để xử lý (trên máy tính) là dữ liệu
• Dữ liệu biểu diễn thông tin cần thiết của bài toán
• vd:
•Cấu trúc dữ liệu thay đổi thuật toán thay đổi theo
Trang 5
a Dữ liệu và lưu trữ dữ liệu
b Các kiểu dữ liệu đơn giản
c Các kiểu dữ liệu cấu trúc
2 Cấu trúc dữ liệu và các vấn đề liên quan
Trang 6
a Dữ liệu và lưu trữ dữ liệu
2 Cấu trúc dữ liệu và các vấn đề liên quan
Dữ liệu là vật mang thông tin đã được chuẩn hóa Cần phân biệt dữ liệu với thông tin:
- Dữ liệu tồn tại khách quan
- Thông tin có ý nghĩa chủ quan.
Trang 7
a Dữ liệu và lưu trữ dữ liệu
2 Cấu trúc dữ liệu và các vấn đề liên quan
Trong một bài toán, dữ liệu gồm một tập các phần
tử cơ sở, gọi là dữ liệu nguyên tử Nó có thể là
một chữ số, một ký tự, một từ,…tùy vào bài toán
cụ thể.
Trên cơ sở các dữ liệu nguyên tử, các cung cách liên kết chúng với nhau sẽ dẫn tới các cấu trúc dữ liệu khác nhau
Trang 8
a Dữ liệu và lưu trữ dữ liệu
2 Cấu trúc dữ liệu và các vấn đề liên quan
- Khi chọn một cấu trúc dữ liệu phải nghĩ ngay tới các phép toán tác động lên cấu trúc ấy và ngược lại
- Cách biểu diễn một cấu trúc dữ liệu trong bộ nhớ
được gọi là cấu trúc lưu trữ (storage structure)
- Có thể có nhiều CTLT khác nhau cho cùng một CTDL, cũng có thể có nhiều CTDL khác nhau mà được cài đặt trong bộ nhớ bởi cùng một kiểu cấu trúc lưu trữ
- CTDL trong và CTDL ngoài
Trang 9
a Dữ liệu và lưu trữ dữ liệu
b Các kiểu dữ liệu đơn giản
c Các kiểu dữ liệu cấu trúc
2 Cấu trúc dữ liệu và các vấn đề liên quan
Trang 10
2 Cấu trúc dữ liệu và các vấn đề liên quan
Các kiểu dữ liệu Các kiểu dữ liệu đơn giản Các kiểu dữ liệu cấu trúc
Kiểu int Kiểu float
Kiểu char Kiểu lôgic
b Các kiểu dữ liệu đơn giản
Kích thước: 2Byte PVBD: -32768 -> 32767 Kích thước: 4Byte
PVBD: 3.4E-38 ->3.4E+38
Kích thước: 1Byte PVBD: -128 ->127 Kích thước: 1Byte PVBD: True, False
Trang 11
a Dữ liệu và lưu trữ dữ liệu
b Các kiểu dữ liệu đơn giản
c Các kiểu dữ liệu cấu trúc
2 Cấu trúc dữ liệu và các vấn đề liên quan
Trang 12
c Các kiểu dữ liệu cấu trúc
2 Cấu trúc dữ liệu và các vấn đề liên quan
Các kiểu dữ liệu
Các kiểu dữ liệu đơn giản Các kiểu dữ liệu cấu trúc
Kiểu mảng (array) Kiểu chuỗi (string) Kiểu bản ghi (record) Kiểu tập hợp (set) Kiểu tập tin (file) Kiểu con trỏ (pointer)
Trang 13
c Các kiểu dữ liệu cấu trúc
2 Cấu trúc dữ liệu và các vấn đề liên quan
Trang 15Các tính chất cơ bản của thuật toán:
Trang 23
Tổng kết
1.Người ta chia dữ liệu ra làm mấy loại? Kể tên?
2.Phân biệt sự khác nhau giữa CTDL và CTLT?
3.Theo bạn học CTDL để làm gì?vì sao phải học nó? 4.Để học tốt học phần CTDL bạn phải học ntn?
Trang 24
Chúc các bạn thành công !
KHOA KHOA HỌC MÁY TÍNH – BỘ MÔN LẬP TRÌNH
Lê Tân – Bộ môn lập trình – Khoa CNTT
Mail: tanleddt @yahoo.com
Trang 254 Viết một hàm thay thế một chuỗi con trong một
chuỗi bằng một chuỗi con khác.
5 Dúng cấu trúc mảng Viết
chương trình quản lý danh sách sinh viên (gồm
họ tên, mã sinh viên) Chương trình có khả năng thêm, bớt, tìm kiếm.
BÀI TẬP
Trang 26
1 Viết chương trình giải phương trình bậc nhất ax + b = 0
/* Bai tap1 - Giai phuong trinh bac nhat AX + B = 0 */
#include <stdio.h>
void main()
{
float a, b;
printf("\nGiai phuong trinh bac nhat AX + B = 0");
printf("\nCho biet cac he so A B : ");
scanf("%f%f", &a, &b);
Trang 27printf("\nNhap hai vao so nguyen duong : ");
scanf("%u%u", &n, &m);
printf("\nUCLN cua %u va %u = %u", n, m, UCLN(n,m));
printf("\nBCNN cua %u va %u = %u", n, m, BCNN(n,m));
getch();
}
Trang 28printf("\nMa tran %c : ", id);
for (i=0; i<n; i++)
Trang 29{ int A[MAX][MAX], B[MAX][MAX], C[MAX][MAX], n, m, p, i, j, k;
nhap_so_nguyen(&n, 2, MAX, 'n'); nhap_so_nguyen(&m, 2, MAX, 'm'); nhap_so_nguyen(&p, 2, MAX, ‘p'); printf("\nNhap ma tran A : ");
for (i=0; i<n; i++)
{ printf("B[%d,%d] = ", i, j); scanf("%d", &(B[i][j])); }
in_ma_tran(A, n, m, 'A'); in_ma_tran(B, n, m, 'B');
for (i=0; i<n; i++)
Trang 30char *tim_thay(char *source, char *substr, char *replace)
{ char *found, *temp, *stemp; int pos = 0;
stemp = strdup(source); found = strstr(stemp + pos, substr); while (found)
{ pos = found - stemp + strlen(replace) - strlen(substr) + 1;
temp = (char *) malloc(sizeof(stemp) + strlen(replace) -
strlen(substr) + 1);
strncpy(temp, stemp, found - stemp);
temp[found-stemp] = 0; strcat(temp, replace);
strcat(temp, found + strlen(substr));
free(stemp); stemp = (char *)malloc(sizeof(temp) + 1);
strcpy(stemp, temp); free(temp);
found = strstr(stemp + pos, substr);
} return stemp;
}
Trang 31char source[255], substr[50], replace[50], *result;
printf("\nNhap chuoi nguon : ");
result = tim_thay(source, substr, replace);
printf("\nKet qua = %s", result);
getch();
}
Trang 32
5 Dúng cấu trúc mảng Viết chương trình quản lý danh sách sinh viên (gồm
họ tên, mã sinh viên) Chương trình có khả năng thêm, bớt, tìm kiếm.
char hoten[35];
float diem[3];
} danhsach[MAX];
int n = 0;
Trang 33
5 Dúng cấu trúc mảng Viết chương trình quản lý danh sách sinh viên (gồm
họ tên, mã sinh viên) Chương trình có khả năng thêm, bớt, tìm kiếm.
void nhapmoi() { char masv[5], tmp[3];
int i; float diem[3];
do { printf("\nCho biet ma sinh vien: ");
gets(masv);
if (strlen(masv)) { strcpy(danhsach[n].masv, masv);
printf("\nCho biet ho ten : ");
gets(danhsach[n].hoten);
printf("\nCho biet diem so : ");
for (i=0; i<3; i++) { scanf("%f", &diem[i]);
danhsach[n].diem[i] = diem[i];
} gets(tmp);
n++;
} } while (strlen(masv));
}
Trang 34
5 Dúng cấu trúc mảng Viết chương trình quản lý danh sách sinh viên (gồm
họ tên, mã sinh viên) Chương trình có khả năng thêm, bớt, tìm kiếm.
void timkiem()
{ char masv[5]; int i = 0, found = 0;
printf("\nCho biet ma so lop : ");
gets(masv);
if (strlen(masv))
while (i<n)
if (stricmp(danhsach[i].masv, masv) == 0)
{ printf("\nMa so lop : %s", danhsach[i].masv);
printf("\nHo va ten : %s", danhsach[i].hoten);
printf("\nDiem Toan : %f", danhsach[i].diem[TOAN]);
Trang 35
5 Dúng cấu trúc mảng Viết chương trình quản lý danh sách sinh viên (gồm
họ tên, mã sinh viên) Chương trình có khả năng thêm, bớt, tìm kiếm.
void xoa()
{ char masv[5], traloi; int i = 0, j;
printf("\nCho biet ma sinh vien : "); gets(masv);
if (strlen(masv))
while (i<n)
if (stricmp(danhsach[i].masv, masv) == 0)
{ printf("\nMa so lop : %s", danhsach[i].masv);
printf("\nHo va ten : %s", danhsach[i].hoten);
printf("\nDiem Toan : %f", danhsach[i].diem[TOAN]);
printf("\nDiem Ly : %f", danhsach[i].diem[LY]);
printf("\nDiem Hoa : %f", danhsach[i].diem[HOA]);
printf("\nCo muon xoa khong (C/K)? ");
Trang 36
5 Dúng cấu trúc mảng Viết chương trình quản lý danh sách sinh viên (gồm
họ tên, mã sinh viên) Chương trình có khả năng thêm, bớt, tìm kiếm.
void menu()
{ printf("\n***************"); printf("\n* 1 Them *");
printf("\n* 2 Xoa *"); printf("\n* 3 Tim kiem *");
printf("\n* 0 Thoat *"); printf("\n***************");
{ case '1' : nhapmoi(); break;
case '2' : xoa(); break;
case '3' : timkiem(); break;
}
} while (traloi != '0');
}
Trang 38CẤU TRÚC DỮ LIỆU
BÀI GIẢNG
KHOA KHOA HỌC MÁY TÍNH – BỘ MÔN LẬP TRÌNH
Trang 42
1 Danh sách
Phép duyệt danh sách: là phép thăm tất cả các
phần tử của danh sách thỏa mãn <điều kiện> nào
đó để thực hiện công việc <xử lý>
Ví dụ: Duyệt danh sách sinh viên để xác định
học bổng
Phép tìm kiếm: là thao tác tìm phần tử trong danh
sách thỏa mãn điều kiện nào đó
Ví dụ: Tìm các sinh viên có học bổng trong danh sách
b Các phép toán trên danh sách
Trang 43
1 Danh sách
Thêm phần tử vào danh sách: là thao tác thêm
phần tử mới vào danh sách Phần tử có thể được thêm vào cuối, đầu hoặc giữa danh sách.
Chú ý danh sách đầy
Ví dụ: Thêm sinh viên mới vào lớp
b Các phép toán trên danh sách
Trang 44
1 Danh sách
Loại bỏ phần tử khỏi danh sách: là thao tác loại
bỏ phần tử khỏi danh sách Trước khi loại bỏ phải xác định phần tử cần loại bỏ (tìm kiếm).
Chú ý: sau khi loại bỏ, số phần tử của danh sách giảm đi 1 đơn vị
Ví dụ: Sinh viên chuyển lớp
b Các phép toán trên danh sách
Trang 45
1 Danh sách
Sửa đổi phần tử trong danh sách: là thao tác
hiệu chỉnh phần tử trong danh sách Trước khi
hiệu chỉnh cần phải xác định phần tử cần hiệu
chỉnh (tìm kiếm)
Ví dụ: Hiệu chỉnh học bổng sau mỗi học kỳ
Sắp xếp thứ tự danh sách: là thao tác sắp lại thứ
tự các phần tử trong danh sách theo một quy tắc nào đó
Ví dụ: Sắp xếp sinh viên giảm dần theo điểm
b Các phép toán trên danh sách
Trang 46Ghép nhiều danh sách thành danh sách mới: là
thao tác ngược lại của quá trình tách.
Trộn nhiều danh sách thành danh sách mới
b Các phép toán trên danh sách
Trang 48
2 Danh sách đặc
Danh sách đặc là danh sách mà các phần tử được sắp xếp kế tiếp nhau trong bộ nhớ, phần tử ai+1 đứng sau phần tử ai.
a Định nghĩa
a1 a2 … ai ai+1 … an-1 an
add[i] = add[1] + (i-1)*d
Trang 49
2 Danh sách đặc
#define MaxLength 50 //độ dài tối đa của danh sách
typedef int ElementType ; //kiểu phần tử trong danh sách
ElementType DS[ MaxLength ]; //mảng các phần tử
int n;
b Khai báo
Trang 50
2 Danh sách đặc
1 Danh sách A để quản lý các số thực
2 Danh sách F để quản lý các kí tự
3 Danh sách B để quản lý họ và tên sinh viên
4 Danh sách C để quản lý các sinh viên gồm mã sinh viên, họ tên, điểm trung bình
5 Danh sách D để quản lý các phân số
6 Danh sách E để quản lý sinh viên giống câu 4 nhưng trường điểm là danh sách điểm các môn học
b Khai báo cấu trúc dữ liệu
Trang 51
2 Danh sách đặc
Cho danh sách A có cấu trúc như sau:
b Khai báo cấu trúc dữ liệu
Tran Xuan Anh
0909509735
Nguyen Ngoc Hai 01215586270
Hoang Tuan Vu 0905323114
Hãy khai báo CTDL theo cấu trúc danh sách đặc
để quản lý danh sách trên
Trang 52
2 Danh sách đặc
Cho danh sách A có cấu trúc như sau:
b Khai báo cấu trúc dữ liệu
Trang 53
2 Danh sách đặc
i Tìm kiếm phần tử trong danh sách
ii Chèn phần tử vào danh sách
iii Loại bỏ phần tử khỏi danh sách
c Các phép toán
Trang 54
2 Danh sách đặc
v Tìm kiếm phần tử trong danh sách
Trường hợp danh sách không thứ tự
int Search_List (int x, ElementType DS[],int n){ int i=1;
while (i<=n){
if(DS[i]==x) return i;
i++;
} return -1;
}
Trang 55Minh Họa Thuật Toán Tìm Kiếm
Trang 572 3 4 5 6 7 1
X=10
i
i=8, không tìm thấy
Minh Họa Thuật Toán Tìm Kiếm
Trang 59
2 Danh sách đặc
ii Loại bỏ phần tử khỏi danh sách
Để loại bỏ phần tử vị trí p ra khỏi danh sách L ta dời các phần tử từ vị trí p+1 đến cuối danh sách sang trái
1 vị trí.
Lưu ý: độ dài của danh sách giảm đi 1 đơn vị
c Các phép toán
Trang 60
2 Danh sách đặc
i Giải thuật Chèn phần tử vào danh sách
void Insert_List ( ElementType X, int p, ElementType DS[], int
Trang 612 4 1 5 1
2 8
Trang 62
2 Danh sách đặc
ii Loại bỏ phần tử khỏi danh sách
void Delete_List (int p ,ElementType DS[],int &n ){
if ((p<0) || (p>n)) printf("Vi tri khong hop le"); else{
for(int i=p;i<n;i++) DS[i] = DS[i+1];
n=n - 1;
} }
Trang 63
2 Danh sách đặc
i Ưu điểm
d Đặc điểm của danh sách đặc
Sử dụng 100% ô nhớ để lưu trữ thông tin
Truy xuất trực tiếp phần tử Elements[i]
Dễ dàng tìm kiếm phần tử bằng phương pháp nhị phân, nếu danh sách có thứ tự.
Trang 64
2 Danh sách đặc
ii Nhược điểm
d Đặc điểm của danh sách đặc
Không phù hợp với phép chèn và loại bỏ Số lần
di chuyển trung bình cho một phép chèn hoặc loại bỏ là n/2.
Trang 65
2 Danh sách đặc
1 Cho dãy số n nguyên và số nguyên x Kiểm tra
xem x có thuộc dãy đã cho hay không Nếu có cho biết vị trí của x Xóa tất cả các số lớn hơn x.
2 Cho n số nguyên dương Xóa các số trong dãy nhỏ
hơn 10 Chèn số 20 vào vị trí thứ 10.
3 Cho n số nguyên Tìm phần tử nhỏ nhất của dãy.
4 Nhập vào một dãy n số nguyên Kiểm tra xem dãy
đã cho có tăng hay không.
5 Cho 2 dãy A, B Viết chương trình trộn 2 dãy A, B
thành dãy C.
Bài tập
Trang 66
Chúc các bạn thành công !
KHOA KHOA HỌC MÁY TÍNH – BỘ MÔN LẬP TRÌNH
Trang 67
3 Danh sách liên kết
a Định nghĩa và khai báo
b Các phép toán
Trang 68+ và phần kết nối (chứa địa chỉ của nút kế tiếp).
a Định nghĩa và khai báo
Trang 69
3 Danh sách liên kết
typedef int ElementType ; //kiểu của phần tử trong danh sách
struct List {
ElementType Element ; //Chứa nội dung của phần tử
List * link ; /*con trỏ đến phần tử kế tiếp trong danh sách*/
};
List *First ;
a Định nghĩa và khai báo
Trang 70
2 Danh sách liên kết
1 Danh sách A để quản lý các số thực
2 Danh sách F để quản lý các kí tự
3 Danh sách B để quản lý họ và tên sinh viên
4 Danh sách C để quản lý các sinh viên gồm mã sinh viên, họ tên, điểm trung bình
5 Danh sách D để quản lý các phân số
6 Danh sách E để quản lý sinh viên giống câu 4 nhưng trường điểm là danh sách điểm các môn học
a Khai báo cấu trúc dữ liệu
Trang 71
3 Danh sách liên kết
i Khởi tạo danh sách rỗng
ii Kiểm tra danh sách rỗng
iii Xác định vị trí của phần tử trong DS
iv Chèn phần tử vào danh sách
v Loại bỏ phần tử khỏi danh sách
vi Ghép danh sách
vii Trộn danh sách
b Các phép toán
Trang 72
3 Danh sách liên kết
i.Khởi tạo danh sách rỗng
void Make_List ( List *& First ) {
First = NULL;
}
b Các phép toán
Trang 73
3 Danh sách liên kết
ii Kiểm tra danh sách rỗng
Danh sách rỗng nếu First == NULL int Empty_List ( List * First )
{
return First ==NULL;
}
b Các phép toán
Trang 74
3 Danh sách liên kết
iii Xác định vị trí n trong danh sách
List * Locate (int n , List * T )
{ List * P ; int count = 1; P = T ;
while (( P !=NULL)&&( count < n ))
Trang 765
q 5f
5f
N
p->link=q->link q->link=p
3 Danh sách liên kết (chèn vào vị trí khác)
Trang 773 Danh sách liên kết
iv Chèn phần tử vào danh sách
void in_sert ( ElementType x , List *& T , int k) { List * p , * q ;
p =new List ; p -> Element = x ;
Trang 783 Danh sách liên kết (xóa đầu DS)
…
Trang 792f
Trang 80
3 Danh sách liên kết
v Xóa phần tử khỏi danh sách
void Delete (int k, List *& T ){
if(( q ==NULL)||( q -> link ==NULL))
printf(“ Vi tri khong hop le ”);
Trang 81
3 Danh sách liên kết
i Ưu điểm
- Thích hợp phép chèn, loại bỏ, trộn, ghép danh sách
- Rất phù hợp với các loại danh sách có nhiều biến động
c Đặc điểm của danh sách liên kết
Trang 82
3 Danh sách liên kết
ii Nhược điểm
- Tốn vùng nhớ cho chỉ điểm liên kết
- Không thích hợp cho tìm kiếm
c Đặc điểm của danh sách liên kết
Trang 83
3 Danh sách liên kết
1 Viết thuật toán tạo danh sách liên kết chứa các số
nguyên nhập từ bàn phím, sau đó hiển thị danh sách vừa tạo
2 Viết thuật toán chèn phần tử vào danh sách liên kết sau
vị trí n được nhập từ bàn phím
3 Viết thuật toán xóa phần tử sau vị trí m trong danh sách liên kết
4 Viết thuật toán đếm số nút trong danh sách liên kết
5 Viết thuật toán tính giá trị trung bình của các phần tử trong danh sách
6 Viết thuật toán đảo ngược một danh sách liên kết
7 Viết thuật toán trộn 2 danh sách liên kết cho trước
Bài tập