1. Trang chủ
  2. » Công Nghệ Thông Tin

Cấu Trúc Dữ Liệu và Giải Thuật - chương 3 pdf

80 236 0

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Tiêu đề Chương 3: Cấu Trúc Dữ Liệu Động
Trường học Trường Đại học Kỹ thuật Công nghệ TP.HCM
Chuyên ngành Cấu Trúc Dữ Liệu Và Giải Thuật
Thể loại Chương
Định dạng
Số trang 80
Dung lượng 3,17 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương Ví du: Hồ sơ các học sinh của một trường ñược tổ chức thành danh sách gồm nhiều hồ sơ của từng học sinh; số lượng học

Trang 1

3.1 Kiểu dữ liệu con trỏ 3.2 Danh sách liên kết (link list) 3.3 Danh sách liên kết ñơn

3.4 Sắp xếp danh sách 3.5 Các cấu trúc ñặc biệt của danh sách liên kết ñơn

Trang 2

3.1 Kiểu Dữ Liệu Con Trỏ

3.1.1 Biến không ñộng

3.1.2 Kiểu con trỏ

3.1.3 Biến ñộng

Trang 3

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

Dùng ñề lưu trữ những ñối tượng dữ liệu ñược sử dụng không có nhu cầu thay ñổi và kích thước, số lượng

• ðược khai báo tường minh

• Tồn tại trong phạm vi khái báo

• Kích thước không thay ñổi trong suốt quá trình sống

Ví dụ:

int a;

char b[10];

3.1.1 Biến không ñộng

Trang 4

Kiểu con trỏ là kiểu cơ sở dùng lưu ñịa chỉ của một ñối tượng dữ liệu khác.

Biến thuộc kiểu con trỏ là biến mà giá trị của nó là ñịa chỉ một vùng nhớ của một biến hoặc là giá trị Null Tùy vào loại con trỏ gần (near pointer) hay con trỏ xa (far pointer) mà kiểu dữ liệu con trỏ có các kích thước khác nhau:

+ Con trỏ gần: 2 bytes + Con trỏ xa: 4 bytes

3.1.2 Kiểu con trỏ

Trang 5

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

Cú pháp ñịnh nghĩa một kiểu con trỏ

typedef <kiểu con trò> *<kiểu cơ sở>;

Trang 6

cout<<"\nGia tri cua bien a="<<a;

cout<<"\nGia tri cua bien b="<<b;

pa=&a;

pb=&b;

cout<<"\nDia chi cua o nho con tro pa tro toi="<<pa;

cout<<"\nDia chi cua o nho con tro pb tro toi="<<pb;

cout<<"\nNoi dung cua o nho con tro pa tro toi="<<*pa;

cout<<"\nNoi dung cua o nho con tro pb tro toi="<<*pb;

*pa=20; /* Thay doi giá tr cua *pa*/

*pb=20; /* Thay doi giá tri cua *pb*/

Trang 7

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

Trong trường hợp, tại thời ñiểm biên dịch không thể xác ñịnh trước kích thước chính xác của ñối tượng dữ liệu(do chúng phụ thuộc vào ngữ cảnh) Các ñối tượng

dữ liệu này ñược khai báo như biến ñộng.

Biến ñộng là những biến thỏa:

3.1.3 Biến ñộng

 Không ñược khai báo tường minh

 ðược cấp phát/giải phóng bộ nhớ khi yêu cầu.

 Các biến này không theo qui tắc phạm vi

 Vùng nhớ của biến ñược cấp phát trong Heap

 Kích thước thay ñổi trong quá trình sống

Trang 8

Các thao tác trên biến ñộng:

Tạo biến ñộng và cho con trỏ p trỏ ñến:

Các hàm cấp phát bộ nhớ:

void* malloc(size); // trả về con trỏ chỉ ñến một vùng

// nhớ size byte vừa ñược cấp phát

void* calloc(n,size);// trả về con trỏ chỉ ñến một vùng

// nhớ vừa ñược cấp phát gồm n

//phần tử,mỗi phần tử có kích

//thước size byte

new // hàm cấp phát bộ nhớ trong C++

Trang 10

Ví dụ:

//Trong C int* p1, p2;

//Cấp phát vùng nhớ cho 1 biến ñộng kiểu int p1 = (int*)malloc(sizeof(int));

//ðặt giá trị 5 cho biến ñộng p1 p1* = 5;

//Cấp phát biến ñộng kiểu mảng 10 p.tử kiểu int p2 = (int*)calloc(10, sizeof(int));

//ðặt giá trị 0 cho phần tử thứ 4 của mảng p2 (p2+3)* = 0;

free(p1); free(p2);

//Trong C++

Trang 11

3.2 Danh Sách Liên Kết

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

3.2.1 Ðịnh nghĩa 3.2.2 Các hình thức tổ chức danh sách

Trang 12

 Ox = {Tạo danh sách; Tìm 1 phần tử trong danh sách; Chèn một phần tử vào danh sách; Huỷ một phần

tử khỏi danh sách ; Liệt kê danh sách, Sắp xếp danh sách }

Trang 13

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

Ví du: Hồ sơ các học sinh của một trường ñược tổ chức thành danh sách gồm nhiều hồ sơ của từng học sinh; số lượng học sinh trong trường có thể thay ñổi

do vậy cần có các thao tác thêm, hủy một hồ sơ; ñể phục vụ công tác giáo vụ cần thực hiện các thao tác tìm hồ sơ của một học sinh, in danh sách hồ sơ

Trang 14

3.2.2 Các hình thức tổ chức danh sách

 Mối liên hệ giữa các phần tử ñược thể hiện ngầm:

 Mỗi phần tử trong danh sách ñược ñặc trưng bằng chỉ số

 Cặp phần tử xi, xi+1 ñược xác ñịnh là kế cận

 Với hình thức tổ chức này, các phần tử của danh sách phải lưu trữ liên tiếp trong bộ nhớ, công thức xác ñịnh ñịa chỉ phần tử thứ I là.

Cách biểu diễn này cho phép truy xuất ngẫu nhiên, ñơn giản và nhanh chóng ñến một phần tử bất kỳ

Trang 15

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

Mối liên hệ giữa các phần tử thể hiện tường minh:

 Mỗi phần tử ngoài các thông tin còn chứa một liên kết (ñịa chỉ) ñến phần tử kế trong danh sách nên còn ñược gọi là danh sách móc nối

 Với hình thức này các phần tử trong danh sách không cần phải lưu trữ kế cận trong bộ nhớ nên khắc phục ñược các khuyết ñiểm của hình thức tổ chức mảng, nhưng việc truy xuất ñến một phần tử ñòi hỏi phải thực hiện truy xuất qua một số phần tử khác

Trang 16

Có các kiểu tổ chức liên kết giữa các phần tử

 Danh sách liên kết ñơn

 Danh sách liên kết kép

 Danh sách liên kết vòng

Trang 17

3.3 Danh Sách Liên Kết ðơn

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

3.3.1 Tổ chức danh sách ñơn theo cách cấp phát liên kết 3.3.2 Các thao tác cơ bản trên danh sách ñơn

Trang 18

3.3.1 Tổ chức danh sách ñơn theo cách cấp phát liên kết

Mỗi phần tử là một cấu trúc chứa 2 thông tin :

- Thành phần dữ liệu: Lưu trữ các thông tin về bản thân

phần tử

- Thành phần mối liên kết: 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

Ta có ñịnh nghĩa tổng quát

struct tNode {

DataType key;

tNode* pNext;

Trang 19

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

Ví dụ: Ðịnh nghĩa danh sách ñơn lưu trữ hồ sơ SV

struct tSinhVien {

Trang 20

Nếu biết ñược ñịa chỉ của phần tử ñầu tiên trong danh sách ñơn thì có thể dựa vào thông tin pNext của nó ñể truy xuất ñến phần tử thứ 2, thứ 3 ðể quản lý một xâu ñơn chỉ cần biết ñịa chỉ phần tử ñầu xâu Con trỏ Head dùng ñể lưu trữ ñịa chỉ phần tử ñầu xâu

Trang 21

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

3.3.2 Các thao tác cơ bản trên danh sách ñơn

Trang 22

Các ñịnh nghĩa, Khởi tạo danh sách LK ðơn:

struct tNode{

int key;

tNode *pnext;

};

typedef struct tNode *Node;

void Khoitao(List &L){

Trang 23

© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM

Các hàm con tạo Nút và Huỷ nút :

L.pHead=L.pHead->pNext;

delete p;

}}

Trang 24

 Chèn một phần tử vào ñầu danh sách

L.pHead=p;

}}

Trang 25

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

void Nhap(List &L){

int x;

Node *p;

Khoitao(L);

do{cout<<"Nhap gia tri vao danh sach (Nhap 0 ket thuc): ";

cin>>x;

if(x==0)break;

p=Taonut(x);

Themdau(L,p);

}while(true);

}

Trang 26

void Xuat(List L){

Node *p=L.pHead;

while(p)

{cout<<p->Key<<" ";

p=p->pNext;

}}

void main(){

List L;

Nhap(L);

cout<<"\nDanh sach vua nhap: ";

Trang 27

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

 Chèn một phần tử vào cuối danh sách

L.pTail=p;

}}

Trang 28

 Chèn một phần tử vào sau phần tử q

Bắt ñầu : Nếu ( q != NULL) thìB1: new_ele -> pNext = q->pNext;

B2: q->pNext = new_ele

void Thempsauq(List &L, Node *p, Node *q){

if(q->pNext!=NULL)

Trang 29

© Dương Thành Phết-www.thayphet.net Khoa CNTT Trường Cð CNTT TP.HCM

 Tìm một phần tử trong danh sách ñơn

Thuật toán : Áp dụng thuật toán tìm tuyến tính ñể xác ñịnhphần tử trong xâu có khoá k:

Nếu p != NULL thì p trỏ tới phần tử cần tìmNgược lại không có phần tử cần tìm

Node *Search(LIST l, int k){

Trang 30

NODE *Search(LIST l, Data k) {

Trang 31

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

 Hủy một phần tử ñầu danh sách ñơn

Bắt ñầu:

Nếu (Head != NULL) thìB1: p = Head;

B2:

B21 : Head = Head->pNext; // tách p ra khỏi xâu

B3: Nếu Head=NULL thì Tail = NULL; //Xâu rỗng

Trang 32

Data RemoveHead(LIST &l) {

NODE *p;

Data x = NULLDATA;

if ( l.pHead != NULL) {

p = l.pHead; x = p->Info;

l.pHead = l.pHead->pNext;

delete p;

if(l.pHead == NULL)l.pTail = NULL;

} return x;

}

Trang 33

B21 : q->Next = p->Next; // tách p ra khỏi xâu

Trang 34

void RemoveAfter (LIST &l, NODE *q) {

if ( q != NULL) {

p = q ->pNext ;

if ( p != NULL) {

if(p == l.pTail)l.pTail = q;

q->pNext = p->pNext;

delete p;

} } else

RemoveHead(l);

Trang 35

Nếu (p!= NULL) thì // tìm thấy k Hủy p ra khỏi xâu tương tự hủy phần tử sau q;

Ngược lạiBáo không có k;

Trang 36

int RemoveNode(LIST &l, Data k) {

if(p == l.pTail) l.pTail = q;

Trang 37

- Ðếm các phần tử của danh sách,

- Tìm tất cả các phần tử thoả ñiều kiện,

- Huỷ toàn bộ danh sách (và giải phóng bộ nhớ)

Trang 38

void ProcessList (LIST &l) {

NODE *p;

p = l.pHead;

while (p!= NULL) {

ProcessNode(p); // xử lý cụ thể tùy ứng dụng

p = p->pNext;

} }

Trang 39

3.4 Sắp Xếp Danh Sách

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

3.4.1 Các cách tiếp cận 3.4.2 Một số phương pháp sắp xếp trên danh sách

Trang 40

3.4.1 Các cách tiếp cận

DS có thứ tự là DS mà các phần tử ñược sắp xếp theo một thứ tự nào ñó dựa trên trường khoá Ðể sắp xếp một danh sách, có 2 phương án:

Phương án 1: Hoán vị nội dung các phần tử trong danh sách

 Sử dụng các thuật toán sắp xếp như trên mảng, dựa trên việchoán vị nội dung của các phần tử

 Phương pháp này ñòi hỏi sử dụng vùng nhớ trung gian, số lần

không tận dụng ñược các ưu ñiểm của DSLK

Trang 41

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

Ví dụ : Cài ñặt thuật toán sắp xếp Chọn trực tiếp

void ListSelectionSort (LIST &l){

q= q->pNext;

}tam=min->Key;

min->Key=p->Key;

p->Key=tam;

p = p->pNext;

}}

Trang 42

Phương án 2: Thay ñổi các mối liên kết (trên vùng Next)

Thay ñổi trình tự móc nối của các phần tử sao cho tạo lập nênñược thứ tự mong muốn,

Tuy nhiên thao tác trên các mọc nối thường sẽ phức tạp hơn làthao tác trực tiếp trên dữ liệu

Bước1: Khởi tạo danh sách mới Result là rỗng;

Bước2: Tìm trong danh sách cũ l phần tử nhỏ nhất;

Bước3: Tách min khỏi danh sách l;

Bước4: Chèn min vào cuối danh sách Result;

Bước5: Lặp lại bước 2 khi chưa hết danh sách Head;

Trang 43

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

void ListSelectionSort2 (LIST &l){

p = q; q = q->pNext;

} if(minprev != NULL) minprev->pNext = min->pNext;

else l.pHead = min->pNext;

Trang 44

3.4.2 Một số phương pháp sắp xếp trên danh sách

 Thuật toán Quick Sort

Bước 1: Chọn X là phần tử ñầu DS L làm phần tử cầm canh Loại X ra khỏi L

Bước 2: Tách DS L ra làm 2 DS L1 (gồm các phần tử nhỏ hơnhay bằng X) và L2 (gồm các phần tử lớn hơn X)

Bước 3: Nếu L1 != NULL thì Quick Sort (L1)

Bước 4: Nếu L2 != NULL thì Quick Sort (L2)

Bước 5: Nối L1, X, và L2 theo trình tự ta có DS L ñược sắp xếp

Trang 46

Sắp xếp L2:

Chọn X = 6 làm phần tử cầm canh và tách L2 thanh L21, L22

Nối L12, X2, L22 thành L2:

Nối L1, X, L2 thành L:

Trang 47

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

void ListQSort(LIST & l){

NODE *p, *X; // X chỉ ñến phần tử cầm canh LIST l1, l2;

if(l.pHead == l.pTail) return;//ñã có thứ tự l1.pHead == l1.pTail = NULL; //khởi tạo l2.pHead == l2.pTail = NULL;

X = l.pHead; l.pHead = X->pNext;

while(l.pHead != NULL) //Tách l thành l1, l2;{

p = l.pHead;

l.pHead = p->pNext; p->pNext = NULL;

if (p->Info <= X->Info) AddTail(l1, p);

else AddTail(l2, p);

} ListQSort(l1); ListQSort(l2); //Gọi ñệ qui ñể sorl1, sort l2 //Nối l1, X và l2 lại thành l ñã sắp xếp

if(l1.pHead != NULL) { l.pHead = l1.pHead; l1.pTail->pNext = X;

} else l.pHead = X;

X->pNext = l2;

if(l2.pHead != NULL) l.pTail = l2.pTail;

else l.pTail = X;

}

Trang 48

Ngoài ra còn một số thuật toán khác như Merge

Sort, Radix Sort

Trang 49

3.5 Các Cấu Trúc ðặc Biệt Của Danh Sách Liên Kết ðơn

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

3.5.1 Stack 3.5.2 Hàng ñợi (Queue)

Trang 50

Stack là một vật chứa (container) làm việc theo cơ

chế LIFO (Last In First Out) "Vào sau ra trước".

Thao tác thêm 1 ñối tượng vào stack gọi là "Push" Thao tác lấy 1 ñối tượng ra khỏi stack gọi là "Pop".

Stack có nhiều ứng dụng: khử ñệ qui, tổ chức lưu vết các quá trình tìm kiếm theo chiều sâu, quay lui, vét cạn, ứng dụng trong tính toán biểu thức, ñồ thị

3.5.1 Stack

Trang 51

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

CTDL Stack hỗ trợ các thao tác:

 Push(o): Thêm ñối tượng o vào ñầu stack

 Pop(): Lấy ñối tượng ở ñầu stack ra khỏi stack và trả về giá trị của nó Nếu stack rỗng thì lỗi sẽ xảy ra.

 isEmpty(): Kiểm tra xem stack có rỗng không.

 isFull(): Kiểm tra xem stack có ñầy không.

 StackTop(): Trả về giá trị của phần tử nằm ở ñầu stack Nếu stack rỗng thì lỗi sẽ xảy ra.

Trang 52

Ðể biểu diễn Stack: Dùng mảng 1 chiều hoặc danh sách liên kết.

Trang 53

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

// Giả sử Stack chứa các phần tử kiểu nguyên// Khai báo cấu trúc Stack

typedef struct STACK {

int* StkArray; // mảng chứa các phần tửint StkMax; // số phần tử tối ña

int StkTop; // vị trí ñỉnh Stack};

//Thao tác “Khởi tạo Stack rỗng”

int InitStack(STACK& s, int MaxItems){

s.StkArray = new int[MaxItems];

Trang 54

//Thao tác “Kiểm tra Stack rỗng”

int IsEmpty(const STACK &s){

if (s.StkTop==-1)

return 1; // Stack rỗng return 0; // Stack không rỗng

}

//Thao tác “Kiểm tra Stack ñầy”

int IsFull(const STACK &s){

if (s.StkTop==s.StkMax-1)

return 1; // Stack ñầy return 0; // Stack chưa ñầy

}

Trang 55

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

//Thao tác “Push”: thêm một phần tử vào ñỉnh Stack

int Push (STACK& s, int newitem){

//Thao tác “Pop”: lấy ra 1 phần tử từ ñỉnh Stack

int Pop(STACK& s, int& outitem){

Trang 56

//truy xuất 1 phần tử ở ñỉnh Stack, không làm thay ñổi Stack

int StackTop(const STACK s, int& outitem){

Trang 57

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

// Giả sử Stack chứa các phần tử kiểu nguyên

// Khai báo cấu trúc một phần tử trong stack

typedef struct tagSTACK_NODE{

int Data;

tagSTACK_NODE *pNext;

} STACK_NODE;

// Khai báo cấu trúc stack

typedef struct STACK{

int StkCount;

STACK_NODE *StkTop;

};

Ngăn xếp sử dụng DSLK

Trang 58

//Thao tác “Khởi tạo stack rỗng”:

void InitStack(STACK& s){

s.StkTop = NULL;

s.StkCount = 0;

}

//Thao tác “Kiểm tra stack rỗng”

int IsEmpty(const STACK& s){

if (s.StkTop == NULL)

}

Trang 59

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

//Thao tác “Kiểm tra stack ñầy”

int IsFull (const STACK s){

// thử tạo mới một phần tử

STACK_NODE* temp = new STACK_NODE;

// nếu không tạo ñược  stack ñầy

Trang 60

//Thao tác “Push”: thêm 1 phần tử vào ñỉnh stack

int Push(STACK &s, int newitem){

if (IsFull(s))

return 0; // Stack ñầy, không thêm vào ñược

STACK_NODE *pNew = new STACK_NODE;

Trang 61

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

//Thao tác “Pop”: lấy ra 1 phần tử từ ñỉnh stack

int Pop(STACK &s, int& outitem){

if (IsEmpty(s))

return 0; // Stack rỗng, không lấy ra ñược

// lưu lại con trỏ ñến ptử ñầu

STACK_NODE *temp = s.StkTop;

Trang 62

//Thao tác “StackTop”: truy xuất 1 phần tử ở ñỉnh stack

int StackTop(STACK &s, int& outitem){

Trang 63

© Dương Thành Phết-www.thayphet.net Khoa KTCN Trường ðH KTKT B.Dương

3.5.2 Hàng ñợi (Queue)

 Hàng ñợi là một vật chứa (container) các ñối tượng

 Làm việc theo cơ chế FIFO (First In First Out) "Vào

trước ra trước".

Phòng vé

Hình ảnh queue

Trang 64

CTDL Queue hỗ trợ các thao tác:

InitQueue: Khởi tạo hàng ñợi rỗng

IsEmpty: Kiểm tra hàng ñợi rỗng ?

IsFull: Kiểm tra hàng ñợi ñầy ?

EnQueue: Thêm 1 phần tử vào cuối hàng ñợi, có thể làm hàng ñợi ñầy

DeQueue: Lấy ra 1 phần tử từ ñầu Queue, có thể làm Queue rỗng

QueueFront: Kiểm tra phần tử ñầu Queue

 QueueRear: Kiểm tra phần tử cuối Queue

Ngày đăng: 11/08/2014, 03:25

HÌNH ẢNH LIÊN QUAN

Hình ảnh queue - Cấu Trúc Dữ Liệu và Giải Thuật - chương 3 pdf
nh ảnh queue (Trang 63)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w