Programming Methodology Data Structure

  • June 2020
  • PDF

This document was uploaded by user and they confirmed that they have the permission to share it. If you are author or own the copyright of this book, please report to us by using this DMCA report form. Report DMCA


Overview

Download & View Programming Methodology Data Structure as PDF for free.

More details

  • Words: 2,437
  • Pages: 92
NỘI DUNG  KỸ THUẬT LẬP TRÌNH

Các cấu trúc điều khiển  Chương trình con  Mảng 1 và 2 chiều  Chuỗi  Con trỏ  Đệ Quy  Các hàm xử lý trong C/C++ 

NỘI DUNG  CẤU TRÚC DỮ LIỆU

Chồng (stacks)  Hàng đợi (Queues)  Danh sach lien ket (Don va Doi)  Các thuật tóan tìm kiếm và sắp xếp  Cây nhị phân 

HÌNH THỨC THI TỰ LUẬN KỸ THUẬT LẬP TRÌNH: 5Đ CẤU TRÚC DỮ LIỆU:5Đ

Cấu trúc điều khiển  Cấu trúc chọn lựa

if…else  Switch..case  Tóan tử điều kiện: expression_condition?a:b 

 Cấu trúc lặp

For  While  Do…while 

Cấu trúc điều khiển  Cấu trúc chọn lựa 

if…else

If (Condition_Expression) Statement_1 else Statement_2; Statement_3;

Cấu trúc điều khiển: switch..case switch(value) { case value_1: Block_1; break; case value_2: Block_2; break; -----case value_n: Block_n; break; default: Block_n+1; }

Cấu trúc điều khiển  Cấu trúc lặp: for

for( exp_1;exp_2;exp_3) Block_1; Block_2;

Cấu trúc điều khiển  Cấu trúc lặp: while

while(expression) Block_1; Block_2;

Cấu trúc điều khiển  Cấu trúc lặp: do…while

do { Block_1; }while(Expression); Block_2;

Chương trình con (CTC)  CTC  Biến tòan cục và cục bộ  Truyền tham số cho CTC

Chương trình con (CTC)  Định nghĩa prototype cho CTC

Type_data Fuction_Name (param_list); Type_data: mô tả kiểu dữ liệu trả về của CTC Ví dụ: int sum(float a, float b); Or: int sum(float, float); Đ/N chi tiết cho CTC Type_data Fuction_Name (param_list) { //write code here; // [ return value ] }

Chương trình con (CTC) float sum (float x, float y) { float kq; kq=x+y; return kq; } void outPut ( int n) { int i; for(i=0;i
Chương trình con (CTC)  Cách gọi CTC 

đ/v CTC có giá trị trả về  



Kq=sum (5,7) Cout<<“\n Tong la:”<<sum(5,7)

đ/v CTC không có giá trị trả về 

outPut(10);

Chương trình con (CTC)  Biến trong chương trình

Biến tòan cục  Biến cục bộ 

 Cách truyền tham số cho CTC

Truyền tham biến  Truyền tham thị 

Ví dụ về truyền tham số CTC float sum (float &x, float y) //truyen bang tham tri { float kq; kq=x+y; x--; return kq; } void swap( float &x, float &y)// truyen bang tham bient { //code here }

Mảng 1 và 2 chiều  Khai báo mảng 1 chiều:

Data_type array_name[num];  Data_type array_name[num]={initialize};  Data_type array_name[ ]={initialize} 

Ví dụ: int a[10]; float b[3]={2.4, 5.7, 10}; int c[ ]={4,7,-5,9,15};

Mảng 1 và 2 chiều  Các bài tóan liên quan đến thao tác trên

mảng một chiều: Tính tóan: theo một điều kiện nào đó  Tìm kiếm  Sắp xếp 

Mảng 1 và 2 chiều  Cách xử lý bài tóan liên quan đến thao tác

trên mảng một chiều: Giả sử mảng a có kích thước n phần tử: Xét các phần tử a[i] Nếu a[i] thỏa điều kiện bài tóan xử lý a[i] theo yêu cầu bài tóan

Mảng 1 và 2 chiều for(i=0;i
Mảng 1 và 2 chiều  Ví dụ: Viết chương trình nhập vào mảng a có kích thước n phần tử. Hãy thực hiện các thao tác sau: - Tính tổng các phần tử trong mảng - Tính tổng chẳn các phần tử trong mảng - Tính tổng các số nguyên tố có trong mảng - Đếm có bao nhiêu số nguyên tố có trong mảng Sắp xếp các phần tử chẳn trong mảng theo thứ tự tăng dần.

Mảng 1 và 2 chiều  Khai báo mảng 2 chiều:

Data_type array_name[Row][Col];  Data_type array_name[Row]{Col]={initialize};  Data_type array_name[ ][Col ]={initialize} 

Ví dụ: int a[2][2]; float b[2][2]={{2.4, 5.7},{3.5, 10}}; int c[ ][2]={{4},{7,-5},{9,15}};

Mảng 1 và 2 chiều  Cách xử lý bài tóan liên quan đến thao tác

trên mảng hai chiều: Giả sử mảng a có kích thước m dòng và n cột: Xét các phần tử a[i][j] Nếu a[i][i] thỏa điều kiện bài tóan xử lý a[i][j] theo yêu cầu bài tóan

Mảng 1 và 2 chiều for(i=0;i<m;i++) for(j=0;j
Mảng 1 và 2 chiều  Đối với mảng hai chiều nhưng yêu cầu xử lý

trên một dòng hoặc trên một cột, ta xử lý như sau: 

Nếu xử lý trên dòng: ta cố định dòng đó và chỉ số cột sẽ biến đổi

for( j=0;j
Mảng 1 và 2 chiều 

Nếu xử lý trên cột: ta cố định cột đó và chỉ số dòng sẽ biến đổi.

for( i=0;i<m;i++) if( a[i][const] thỏa đk) xử lý a[i][const];

Mảng 1 và 2 chiều  Ví dụ: Viết chương trình nhập vào mảng a có kích thước mxn Hãy thực hiện các thao tác sau: - Nhập/ xuất - Tính tổng các phần tử trong mảng - Tính tổng các số nguyên tố có trong mảng - Tính tổng các số không âm trên cột k - Tìm số nguyên tố lớn nhất trên dòng r - Sắp xếp các phần tử trong cột k theo thứ tự tăng dần. - Sắp xếp các phần tử nguyên tố trên cột k theo thứ tự giảm dần.

Chuỗi Chuỗi là tập hợp nhiều ký tự. Mỗi chuỗi kết thúc bởi \0. Khai báo: char variable[length]; char str[]={‘H’,’e’,’l’,’l’,’o’,’\0’}; char str[10]; char str[]=“Hello”; char *str=“Hello”;

Chuỗi Nhập: gets(str); cin>>str; Xuất: puts(str); cout<<str;

Chuỗi Bài tập: Cách giải bài tập chuỗi: Chúng ta cần tính chiều dài chuỗi Duyệt từng ký tự trong chuỗi (tương tự mảng) Xóa các ký tự x trong một chuỗi Đếm có bao nhiêu từ trong một chuỗi Đếm số lần xuất hiện của các ký tự trong chuỗi

Con trỏ  Con trỏ lưu địa chỉ của 1 biến

Type_data *pointer ; Ví dụ int x; int *p1,*p2; p=&x; p2=p1;

int a[10]; int *p; p=a; Khi đó: *(p+i) tương ứng với lệnh a[i]

Con trỏ  Phép tóan trên con trỏ (+,-)  Việc tăng lên giá trị tùy thuộc vào kiểu dữ liệu

của con trỏ.  Truy xuất giá trị: *pointer  Cấp phát bộ nhớ động Type_data *pointer; pointer=(type_data*)malloc(sizeof(type-data)) Hàm free(pointer) giải phóng bộ nhớ

Con trỏ  Cấp phát nhớ động trongC++: new, delete

Type_data *pointer; pointer= new type_data; delete pointer;

Đệ qui  Một hàm gọi là đệ qui nếu bên trong thân

hàm của nó gọi chính nó.  Khi viết đệ qui chúng ta cần xác định điều kiện dừng của bài tóan.

Đệ qui int giaiThua(int n) { int gt; if(n==1) return(1); gt =giaiThua(n-1)*n; return gt; }

int tongArray(int a[],int n) { int s; if(n==1) return a[0]; s=tongArray(a,n-1)+a[n-1]; return s; }

Data Structure  Một cấu trúc dữ liệu là một tập hợp của

những kiểu dữ liệu khác nhau được gộp lại với một cái tên duy nhất. Dạng thức của nó như sau: struct model_name { type1 element1; type2 element2; type3 element3; . .} object_name;

Data Structure struct products { char name [30]; float price; } Sanpham; products apple;products orange, melon; Tóan tử dấu chấm (“.”) Toán tử (->)

Data Structure products a,b; products *p; a. name; b. price p-> name; p->price (*p). name; (*p). price

Data Structure Từ khóa : typedef typedef struct { define attribute } type_data; typedef struct { char title[10] float price; } Products;

Ví dụ struct tagStudent { char name[10]; int birthday; 1. int result[5]; 5. }Student; 6. void main() 7. { 8. tagStudent p; 9. cin>>p.name; 10. cin>>p.birthday; 11. cin>>p.result[0]; 12. } 1. 2. 3. 4.

Ví dụ 1. 2. 3. 4. 1. 2. 3. 4. 5. 6. 7. 8.

struct tagStudent { char name[10]; int birthday; int result[5]; }Student; void main() { tagStudent *p; cin>>p->name; cin>>p->birthday; cin>>p->result[0]; }

Ví dụ 1. 2. 3. 4. 1. 2. 3. 4. 5. 6. 7. 8. 9.

struct tagStudent { char name[10]; int birthday; int result[5]; }; typedef tagStudent *Student; void main() { Student p; // tagStudent *p; cin>>p->name; cin>>p->birthday; cin>>p->result[0]; }

Thành phần cấu trúc chứa một cấu trúc 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.

struct tagDMY { int day; int month; int year; }; struct tagPerson { char name[10]; tagDMY birthday; }Person;

Thành phần cấu trúc chứa một cấu trúc 1. tagPerson p; 2. 3. 4. 5. 6.

cin>>p.name; cin>>p.birthday.day; cin>>p.birthday.month; cin>>p.birthday.year;

Cấp phát và hủy vùng nhớ 1. new 2. delete

type_data *p; p=new type_data delete p;

Danh sách liên kết Sự khác nhau giữa mảng và DSLK. Array:

DSLK

Danh sách liên kết Các lọai danh sách liên kết DSLK đơn DSLK kép DSLK vòng

Danh sách liên kết đơn Mỗi phần tử trong danh sách chứa 2 thành phần: - Thông tin(hay dữ liệu) lưu trữ - Thông tin kết nối

Danh sách liên kết đơn infor

infor

pHead

typedef struct tagNode { information infor; struct tagNode *pNext; }NODE;

infor

infor

Danh sách liên kết đơn typedef struct tagList { NODE *pHead; NODE *pTail; }LIST; Mục tiêu lưu con trỏ pHead và pTail?

Cách tạo 1 Node Tạo mới 1 Node cần 2 yếu tố: - Cấp phát vùng nhớ cho Node - Gán thông tin cho Node: + Thông tin lưu trữ + Thông tin liên kết với phần tử kế tiếp.

Cách tạo 1 Node NODE* getNode(information object) { NODE *p; p=new NODE; if(p==NULL) exit(1); p->infor=object; p->pNext=NULL; return p; }

Ví dụ: tagPerson p; NODE *pNode; cin>>p.name; cin>>p.birthday.day; cin>>p.birthday.month; cin>>p.birthday.year; pNode=getNode(p);

Các thao tác trên DSLK đơn 1. Thêm   

Đầu Giữa Cuối

1. Xóa 2. Sửa 3. Duyệt

Các thao tác trên DSLK đơn 1. Thêm đầu

Có 2 trường hợp: - Danh sách rỗng - Danh sách đã có vài node Để thêm vào danh sách chúng ta cần các thông tin: - Danh sách cần thêm - Node cần thêm

Các thao tác trên DSLK đơn pHead

infor pHead

NULL

infor

infor

infor

NULL

Các thao tác trên DSLK đơn void AddFirst(LIST &list, NODE *pNew) { if(list.pHead==NULL) { list.pHead=pNew; list.pTail=list.pHead; } else { pNew->pNext=list.pHead; list.pHead=pNew; } }

Các thao tác trên DSLK đơn 2. Thêm cuối Có 2 trường hợp: - Danh sách rỗng - Danh sách đã có vài node Để thêm vào danh sách chúng ta cần các thông tin: - Danh sách cần thêm - Node cần thêm

Các thao tác trên DSLK đơn pHead

infor

NULL

infor

infor

infor

pHead pTail

NULL

Các thao tác trên DSLK đơn pHead

NULL

pNew

NULL

Các thao tác trên DSLK đơn pHead

pNew

pTail

NULL

Các thao tác trên DSLK đơn infor

infor

infor

infor

NULL

pHead pTail

pNew

NULL

Các thao tác trên DSLK đơn infor

infor

infor

infor

pHead pTail

pNew

NULL

Các thao tác trên DSLK đơn infor

infor

infor

infor

pHead pTail

pNew

NULL

Các thao tác trên DSLK đơn void AddEnd(LIST &list, NODE *pNew) { if(list.pHead==NULL) { list.pHead=pNew; list.pTail=list.Head; } else { list.pTail->pNext=pNew; list.pTail=pNew; } }

Các thao tác trên DSLK đơn 3. Thêm vào sau 1 node Có 2 trường hợp: - Danh sách rỗng - Danh sách đã có vài node Để thêm vào danh sách chúng ta cần các thông tin: - Danh sách cần thêm - Node cần thêm - Cần thêm vào sau node nào.

Các thao tác trên DSLK đơn pHead

NULL

q

infor

infor

infor

infor

pHead pNew

?

pTail

NULL

Các thao tác trên DSLK đơn

q

infor

infor

infor

infor

pHead pNew

?

pTail

NULL

Các thao tác trên DSLK đơn

q

infor

infor

infor

infor

pHead pNew

pTail

NULL

Các thao tác trên DSLK đơn

q

infor

infor

infor

infor

pHead pNew

pTail

NULL

Các thao tác trên DSLK đơn

q

infor pHead

infor

NULL

pTail pNew

?

Các thao tác trên DSLK đơn

q

infor pHead

infor

NULL

pTail pNew

?

Các thao tác trên DSLK đơn

q

infor pHead

infor pTail pNew

NULL

Các thao tác trên DSLK đơn

q

infor pHead

infor pTail pNew

NULL

Các thao tác trên DSLK đơn

q

infor pHead

infor pTail pNew

NULL

Các thao tác trên DSLK đơn void AddAfter(LIST &list, NODE *q, NODE *pNew) { if(q!=NULL) { pNew->pNext=q->pNext; q->pNext=pNew; if(q==list.pTail) list.pTail=pNew; } else { AddFirst(list,pNew); } }

Các thao tác trên DSLK đơn 4. Tìm kiếm 1 node Chúng ta duyệt tuần tự qua các node, xuất phát từ phần tử pHead. Chúng ta sẽ so sánh thông tin trong infor cái mà node lưu trữ so với thông tin tìm kiếm. Nếu không tìm thấy chúng ta sẽ di chuyển qua node kế tiếp dựa vào pNext.

Các thao tác trên DSLK đơn Các thông tin cần thiết cho duyệt 1 một tử: - Danh sách - Thông tin tìm kiếm B1 Tạo 1 con trỏ trỏ đến đầu danh sách. B2 Xét node hiện hành và so sánh với giá trị tìm kiếm B3 Lặp lại B2 đến khi gặp thông tin tìm kiếm hoặc duyệt đến cuối danh sách.

Các thao tác trên DSLK đơn NODE* FindInformation(LIST list, Information object) { NODE *p; p=list.pHead; while((p!=NULL)&&(p->infor!=object) p=p->pNext; return p; }

Các thao tác trên DSLK đơn 5. Hủy 1 node - Đầu -Giữa

Hủy phần tử đầu danh sách pHead

NULL

Hủy

infor pHead

infor

infor

infor

NULL

Hủy phần tử đầu danh sách

Hủy

infor

infor

pHead P

infor

infor

NULL

Hủy phần tử đầu danh sách

Hủy

infor

infor

pHead P

infor

infor

NULL

Hủy phần tử đầu danh sách

Hủy

infor

infor

pHead P

infor

infor

NULL

Hủy phần tử đầu danh sách

Hủy

infor

infor

pHead P

infor

infor

NULL

1. void DeleteNodeFirst(LIST &list) 2. { 3. NODE *p; 4. if(list.pHead!=NULL) 5. { 6. p=list.pHead; 7. list.pHead=p->pNext; 8. delete p; 9. if(list.pHead==NULL) 10. list.pTail=NULL; 11. } 12. }

Hủy phần tử sau một phần tử q pHead

NULL

q

infor

pHead

infor

Hủy

infor

p q

infor

pHead pTail

NULL

Hủy phần tử sau một phần tử q pHead

NULL

q

infor

pHead

infor

Hủy

infor

q

infor

pHead pTail

NULL

Hủy phần tử sau một phần tử q pHead

NULL

q

infor

pHead

infor

Hủy

infor

q

infor

pHead pTail

NULL

Hủy phần tử sau một phần tử q pHead

NULL

q

infor

pHead

infor

Hủy

infor

q

infor

pHead pTail

NULL

1. void DeleteNodeAfter(LIST &list,NODE *q) 2. { 3. NODE *p; 4. if(q!=NULL) 5. { 6. p=q->pNext; 7. if(p!=NULL) 8. { if(list.pTail==p) 9. list.pTail=q; 10. q->pNext=p->pNext; 11. delete p; 12. } 13. } 14. }

Related Documents

Data Structure
June 2020 17
Data Structure
November 2019 33
Data Structure
June 2020 13
Data Structure
November 2019 32