3 array list3

36
CẤU TRÚC DỮ LIỆU & GIẢI THUẬT 1 MẢNG & DANH SÁCH

Upload: devil106

Post on 30-Dec-2015

26 views

Category:

Documents


0 download

DESCRIPTION

cấu trúc dữ liệu giải thuật

TRANSCRIPT

Page 1: 3 Array List3

CẤU TRÚC DỮ LIỆU& GIẢI THUẬT 1

MẢNG & DANH SÁCH

Page 2: 3 Array List3

Nội dung môn học1. Mảng2. Danh sách3. Danh sách kề4. Các thao tác trên danh sách kề5. Danh sách liên kết6. Các thao tác trên danh sách liên kết

2

Page 3: 3 Array List3

Mảng• Mảng là kiểu dữ liệu có cấu trúc gồm nhiều

phần tử cùng kiểu và được bố trí vùng nhớ liêntục.

• Các phần tử trong mảng được truy xuất thôngqua chỉ số. Để truy cập đến phần tử thứ i củamảng a, ta viết a[i].

• Mảng có thể nhiều hơn 1 chiều. Khi đó, số cácchỉ số của mảng sẽ tương ứng với số chiều. Vídụ, trong mảng 2 chiều a, thành phần thuộc cộti, hàng j được viết là a[i][j]. Mảng 2 chiều cònđược gọi là ma trận (matrix).

3

Page 4: 3 Array List3

Mảng• Mảng là cấu trúc dữ liệu dễ sử dụng, tốc độ truy

cập cao.• Nhược điểm: không linh hoạt về kích thước.• Khi đã khai báo một mảng thì kích thước của nó là

cố định, không thể thay đổi trong quá trình thựchiện chương trình Bất tiện khi chưa biết trướcsố phần tử cần xử lý.

• Khai báo mảng lớn Tốn bộ nhớ, ảnh hưởngđến hiệu suất chương trình.

• Khai báo mảng nhỏ Thiếu bộ nhớ.• Việc bố trí các phần tử trong mảng cũng khá phức

tạp, vì mỗi phần tử đã có vị trí cố định trong mảng.Để bố trí 1 phần tử sang 1 vị trí khác, phải tiếnhành dời các phần tử có liên quan.

4

Page 5: 3 Array List3

Danh sách• Danh sách là tập hợp các phần tử có kiểu

dữ liệu xác định và giữa chúng có một mốiliên hệ nào đó.

• Số phần tử của danh sách gọi là chiều dàicủa danh sách. Danh sách rỗng là danhsách có chiều dài bằng 0.

• Có 2 cách cài đặt danh sách: Cài đặt theo kiểu kế tiếp: danh sách kề (danh

sách đặc). Cài đặt theo kiểu liên kết: danh sách liên kết.

5

Page 6: 3 Array List3

Các phép toán trên danh sách1. Tạo mới một danh sách2. Tìm kiếm 1 phần tử trong danh sách3. Thêm 1 phần tử vào danh sách4. Loại bỏ bớt 1 phần tử ra phỏi danh sách5. Cập nhật giá trị 1 phần tử trong danh sách6. Sắp xếp thứ tự các phần tử trong danh sách7. Gộp nhiều danh sách thành 1 danh sách8. Sao chép 1 danh sách9. Hủy danh sách

6

Page 7: 3 Array List3

Danh sách kề• Không gian lưu trữ các phần tử được đặt

liên tiếp nhau trong bộ nhớ.• Các phần tử của danh sách gọi là các

node.• Địa chỉ mỗi phần tử được xác định bằng

chỉ số.• Mảng, chuỗi là một dạng danh sách kề.• Danh sách kề là cấu trúc dữ liệu tĩnh.

7

Page 8: 3 Array List3

Cài đặt danh sách kề• Sử dụng mảng để cài đặt danh sách kề.• Định nghĩa cấu trúc danh sách kề như

sau:#define MAX 100struct LIST{

int n;int e[MAX];

};

8

Page 9: 3 Array List3

Cách thao tác trên danh sách kề• Khởi tạo danh sáchvoid init (LIST &L){

L.n=0;}

9

Page 10: 3 Array List3

Nhập danh sáchvoid input (LIST &L){

cout<<“Nhap so phan tu: ”;cin>>L.n;if (L.n>MAX)

L.n=MAX;for (int i=0; i<L.n; i++){

cout<<“Nhap phan tu thu ”<<i<<“: ”;cin>>L.e[i];

}}

10

Page 11: 3 Array List3

Tìm kiếm một phần tử trong danh sách

int search (LIST L, int x){

for (int i=0; i<L.n; i++)if (L.e[i] == x)

return i;return -1;

}

11

Page 12: 3 Array List3

Thêm 1 phần tử vào danh sách Thêm 1 phần tử x tại vị trí k vào danh sách.void insert (LIST &L, int x, int k){

if (k>=0 && k<=L.n){

for (int i=L.n; i>k; i--)L.e[i] = L.e[i-1];

L.e[k] = x;L.n++;

}}

12

Page 13: 3 Array List3

Xóa 1 phần tử khỏi danh sách Xóa 1 phần tử tại vị trí k khỏi danh sách.void remove (LIST &L, int k){

if (k>=0 && k<L.n){

for (int i=k; i<L.n-1; i++)L.e[i] = L.e[i+1];

L.n--;}

}

13

Page 14: 3 Array List3

Sắp xếp thứ tự các phần tử trong danh sách

Sắp xếp danh sách theo thứ tự tăng (giảm) dần.void sort (LIST &L){

int i, j, t;for (i=0; i<L.n-1; i++)

for (j=i+1; j<L.n; j++)if (L.e[i] > L.e[j]){

t=L.e[i];L.e[i]=L.e[j];L.e[j]=t;

}}

14

Page 15: 3 Array List3

Sao chép danh sách• Sao chép danh sách L vào danh sách A.void copy (LIST L, LIST &A){

A.n=L.n;for (int i=0; i<L.n; i++)

A.e[i]=L.e[i];}

15

Page 16: 3 Array List3

Gộp nhiều danh sách thành một ds• Gộp danh sách L1 và L2 vào danh sách H.void concat (LIST L1, LIST L2, LIST &H){

int i,j;if (L1.n+L2.n>MAX) return;for (i=0; i<L1.n; i++)

H.e[i]=L1.e[i];for (j=0; j<L2.n; i++, j++)

H.e[i]=L2.e[j];H.n=L1.n+L2.n;

}

16

Page 17: 3 Array List3

Hủy danh sách• Nếu danh sách được cấp phát động thì tiến

hành hủy bỏ (xóa bỏ) toàn bộ các phần tửtrong danh sách bằng toán tử hủy bỏ (trongC/C++ là free / delete).

• Nếu danh sách được cấp phát tĩnh thì việchủy bỏ chỉ là tạm thời cho chiều dài của danhsách về 0 còn việc thu hồi bộ nhớ sẽ do ngônngữ tự thực hiện.void removeall (LIST &L){

L.n=0;}

17

Page 18: 3 Array List3

Danh sách liên kết• Danh sách liên kết (linked list) là một cấu trúc

dữ liệu có kiểu truy cập tuần tự.• Mỗi phần tử trong danh sách liên kết có chứa

thông tin về phần tử tiếp theo.• Danh sách liên kết là cấu trúc dữ liệu động.• Các phần tử của danh sách gọi là node (nút).• Danh sách liên kết là một cấu trúc dữ liệu

được định nghĩa đệ quy, vì trong định nghĩa 1nút của danh sách có tham chiếu tới kháiniệm nút.

18

Page 19: 3 Array List3

Danh sách liên kết đơn• Danh sách liên kết đơn là dãy các node,

được tổ chức theo thứ tự tuyến tính.

• Mỗi node gồm 2 thành phần: Phần dữ liệu (data, info): lưu trữ các thông tin

về phần tử. Phần con trỏ (next, link): lưu trữ địa chỉ của

phần tử kế tiếp trong danh sách, hoặc lưu trữgiá trị NULL nếu là phần tử cuối danh sách.

19

data next

Page 20: 3 Array List3

Khai báo nodestruct node{

int data;node *next;

};typedef node *Pnode;

struct SV{

char masv[10];char hoten[30];int ns;float dtb;

};struct node{

SV data;node *next;

};typedef node *Pnode;

20

Page 21: 3 Array List3

Một số thao tác trên DSLK đơn• Khởi tạo danh sách• Thêm 1 phần tử đầu danh sách• Thêm 1 phần tử cuối danh sách• Tạo danh sách• Xuất danh sách• Tìm kiếm 1 phần tử trong danh sách• Hủy 1 phần tử đầu danh sách• Hủy 1 phần tử cuối danh sách• Hủy toàn bộ danh sách

21

Page 22: 3 Array List3

Khởi tạo danh sáchvoid init (Pnode &H){

H=NULL;}

22

Page 23: 3 Array List3

Thêm 1 phần tử đầu danh sáchvoid addfirst (Pnode &H,int x){

Pnode p;p=new node;p->data=x;p->next=H;H=p;

}

23

Page 24: 3 Array List3

Thêm 1 phần tử cuối danh sáchvoid addlast (Pnode &H,int x){

if(H==NULL){

H=new node;H->data=x;H->next=NULL;return;

}Pnode p;p=H;while(p->next!=NULL)

p=p->next;p->next=new node;p=p->next;p->data=x;p->next=NULL;

}24

Page 25: 3 Array List3

Tạo danh sáchvoid input (Pnode &H){

int n,x;cout<<"Nhap so luong phan tu: ";cin>>n;for(int i=0;i<n;i++){

cout<<"Nhap so thu "<<i+1<<": ";cin>>x;addlast(H,x);

}}

25

Page 26: 3 Array List3

Xuất danh sáchvoid output (Pnode H){

Pnode p;p=H;while(p!=NULL){

cout<<p->data<<" ";p=p->next;

}}

26

Page 27: 3 Array List3

Xóa phần tử đầu danh sáchvoid removefirst (Pnode &H){

Pnode p;p=H;H=H->next;delete p;

}

27

Page 28: 3 Array List3

Xóa phần tử cuối danh sáchvoid removelast (Pnode &H){

Pnode p;if(H->next==NULL){

removefirst(H);return;

}p=H;while(p->next->next!=NULL)

p=p->next;delete p->next;p->next=NULL;

}

28

Page 29: 3 Array List3

Xóa danh sáchvoid removeall (Pnode &H){

while(H!=NULL)removefirst(H);

}

29

Page 30: 3 Array List3

Tìm kiếm 1 phần tửPnode search (Pnode H, int x){

Pnode p;p=H;while(p!=NULL){

if (p->data == x)return p;

p=p->next;}return NULL;

}30

Page 31: 3 Array List3

• Nếu thường xuyên thực hiện thao tác thêmcuối, thay vì sử dụng một con trỏ chỉ nodeđầu của danh sách liên kết, ta sử dụng 2 contrỏ: 1 con trỏ chỉ đầu danh sách và 1 con trỏchỉ cuối danh sách.

• Có thể định nghĩa kiểu cấu trúc gồm 2 con trỏnhư sau:

struct List{

Pnode H, T;};List L;

31

Page 32: 3 Array List3

Danh sách liên kết vòng• Phần tử cuối danh sách liên kết với phần

tử đầu danh sách.

• Ưu điểm: bất kỳ nút nào cũng có thể đượccoi là đầu danh sách.

• Nhược điểm: có thể không biết khi nào đãduyệt qua toàn bộ phần tử của danh sách,dẫn đến một quá trình duyệt vô hạn,không có điểm dừng.

32

Page 33: 3 Array List3

Danh sách liên kết kép• Mỗi phần tử liên kết với các phần tử đứng

trước và sau nó trong danh sách.

• Định nghĩa kiểu cho 1 node:struct node{

<kiểu> data;node *left, *right;

};typedef node *Pnode;

33

Page 34: 3 Array List3

Bài tập1. Sử dụng cấu trúc mảng để cài đặt danh sách và

các thao tác trên danh sách.2. Định nghĩa cấu trúc danh sách sinh viên, mỗi sinh

viên có các thông tin: mã SV, họ tên, năm sinh,điểm trung bình. Viết chương trình thực hiện cácthao tác:

- Nhập, xuất danh sách sinh viên.- Xuất danh sách sinh viên có ĐTB>=5.- Sắp xếp DS sinh viên giảm dần theo điểm.- Sắp xếp DS sinh viên tăng dần theo mã SV.- Tìm kiếm sinh viên theo mã số / theo họ tên.- Thêm 1 sinh viên.- Xóa 1 sinh viên (nhập vào mã số, tìm và xóa theo

mã SV). 34

Page 35: 3 Array List3

Bài tập3. Cài đặt danh sách liên kết đơn các số nguyên vàcác thao tác trên danh sách.4. Định nghĩa cấu trúc danh sách liên kết đơn sinhviên, mỗi sinh viên có các thông tin: mã SV, họ tên,năm sinh, điểm trung bình. Viết chương trình thực hiệncác thao tác:- Nhập, xuất danh sách sinh viên.- Xuất danh sách sinh viên có ĐTB>=5.- Sắp xếp DS sinh viên giảm dần theo điểm.- Sắp xếp DS sinh viên tăng dần theo mã SV.- Tìm kiếm sinh viên theo mã số / theo họ tên.- Thêm 1 sinh viên.- Xóa 1 sinh viên (nhập vào mã số, tìm và xóa theo

mã SV). 35

Page 36: 3 Array List3

Bài tập5. Cài đặt danh sách liên kết đơn các phân số, viết

chương trình thực hiện các thao tác:- Tối giản phân số.- Tính tổng các phân số.- Xuất các phân số lớn hơn 1.- Sắp xếp các phân số theo thứ tự tăng dần.6. Thông tin của một máy tính bao gồm: Loại máy, nơi

sản xuất, thời gian bảo hành. Viết chương trình tạomột danh sách liên kết đơn các máy tính của mộtcửa hàng, thực hiện các thao tác:

- Nhập danh sách máy tính có thông tin như trên.- Thống kê xem có bao nhiêu máy có thời gian bảo

hành là 1 năm.- In ra danh sách các máy tính có xuất xứ từ Mỹ. 36