Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Trang 1
BÀI 1: SẮP XẾP 1. Chuẩn đầu ra: Sau bài này, người học có thể Xây dựng các chương trình thực hiện sắp xếp. Áp dụng giải thuật sắp xếp cho các kiểu dữ liệu thực tế 2. Chuẩn bị: Đọc trước lý thuyết các giải thuật sắp xếp 3. Phương tiện: Sử dụng 1 trong các phần mềm sau: Borland C 3.1, Visual Studio 6.0, Visual Studio .NET. 4. Thời lượng: 5 tiết 5. Nội dung thực hành: Cài đặt các hàm sắp xếp: 1. InterchangeSort 2. SelectionSort 3. InsertionSort 4. InsertionSort cải tiến 5. BubbleSort 6. QuickSort Áp dụng cho kiểu số nguyên và kiểu SINHVIEN (sắp xếp theo mã số sinh viên, điểm trung bình). Kiểu SINHVIEN được định nghĩa như sau: typedef struct { int mssv; char hoten[50]; float dtb; }SINHVIEN; Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Trang 2
Lưu ý: + Viết hàm main cho phép người dùng lựa chọn 1 trong số các phương pháp sắp xếp. + Xây dựng theo kiểu dữ liệu chung ElementType như sau: #define ElementType int (SINHVIEN, ….). Khi đó các toán tử so sánh cần phải được viết riêng cho từng kiểu dữ liệu: //Kiểu số nguyên int SoSanh(int a, int b) { if(a>b) return 1; return 0; } //Kiểu SINHVIEN (so sánh theo mã số sinh viên) int SoSanh(SINHVIEN a, SINHVIEN b) { if(a.mssv>b.mssv) return 1; return 0; }
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 1
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
BÀI 2: DANH SÁCH 1.
Chuẩn đầu ra: Sau bài này, người học có thể Xây dựng danh sách bằng cách sử dụng kiểu mảng (danh sách đặc) Xây dựng danh sách bằng cách sử dụng con trỏ (danh sách liên kết)
2.
Chuẩn bị: Đọc trước lý thuyết chương danh sách
3.
Phương tiện: Sử dụng 1 trong các phần mềm sau: Borland C 3.1, Visual Studio 6.0, Visual Studio .NET.
4.
Thời lượng: 5 tiết
5.
Nội dung thực hành:
Yêu cầu: Cài đặt cho cấu trúc dữ liệu chung (định nghĩa ở đầu chương trình) #define ElementType int (hoặc float, long, SINHVIEN, ….). 5.1. Cài đặt danh sách đặc #define ElementType …….. typedef struct tagNode { ElementType M[MaxLen]; //Mảng các phần tử của danh sách int len; //Độ dài danh sách } LIST; //Cài đặt các hàm sau o Khởi tạo danh sách: InitList(LIST &) o Chèn một phần tử vào đầu danh sách: InsertList(LIST&, ElementType )
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 2
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
o Chèn một phần tử vào cuối danh sách: InsertList(LIST&, ElementType ) o Hủy một phần tử đầu danh sách: RemoveFist(LIST&) o Hủy một phần tử cuối danh sách: RemoveFist(LIST&) o Tìm một phần tử trong danh sách: ElementType SearchNode(LIST) o Liệt kê danh sách: PrintList(LIST) o Kiểm tra danh sách rỗng: IsEmptyList(LIST) o Kiểm tra danh sách đầy: IsFullList(LIST) o Sắp xếp danh sách: DoSort(LIST &) 5.2. Cài đặt danh sách liên kết đơn #define ElementType …….. typedef struct tagNode { ElementType Info; //Thông tin của Node struct tagNode* pNext; //Con trỏ chỉ đến phần tử node tiếp theo } Node; typedef struct { Node*pHead; Node*pTail; } LIST; //Cài đặt các hàm sau o Tạo 1 node mới: Node* CreateNode(ElementType) o Khởi tạo danh sách: void InitList(LIST&)
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 3
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
o Kiểm tra danh sách rỗng: int IsEmptyList(LIST ) o Thêm một phần tử vào danh sách Thêm vào đầu: void AddFirst(LIST&, Node ) Thêm vào cuối: void AddLast(LIST&, Node ) Thêm vào sau phần tử p: void InsertAfter(LIST&, Node* p, Node) o Hủy một phần tử khỏi danh sách Hủy phần tử đầu: void RemoveHead(LIST&) Hủy phần tử cuối: void RemoveTail(LIST&) Hủy phần tử sau phần tử p: void RemoveAfter(LIST&, Node*p) o Tìm một phần tử trong danh sách: Node* SearchNode(LIST&, ElementType ) o Liệt kê danh sách: void PrintList(LIST) o Sắp xếp danh sách: void SelectionSort(LIST &) void QuickSort(LIST &) 5.3. Cài đặt danh sách liên kết kép (Cấu trúc cài đặt và các hàm xử lý tương tự danh sách liên kết đơn).
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 1
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
BÀI 3: NGĂN XẾP 1. Chuẩn đầu ra: Sau bài này, người học có thể Xây dựng ngăn xếp bằng cách sử dụng kiểu mảng. Xây dựng ngăn xếp bằng cách sử dụng con trỏ. 2. Chuẩn bị: Đọc trước lý thuyết chương ngăn xếp 3. Phương tiện: Sử dụng 1 trong các phần mềm sau: Borland C 3.1, Visual Studio 6.0, Visual Studio .NET. 4. Thời lượng: 5 tiết 5. Nội dung thực hành: Yêu cầu: Cài đặt cho cấu trúc dữ liệu chung (định nghĩa ở đầu chương trình) #define ElementType int (hoặc float, long, SINHVIEN, ….). 5.1. Cài đặt bằng kiểu mảng 5.1.1. Xây dựng cấu trúc ngăn xếp + Cách 1: Cài đặt từ đầu bằng mảng #define ElementType …….. typedef struct tagNode { ElementType M[MAXLEN]; //Mảng các phần tử của ngăn xếp int n; //Độ dài ngăn xếp } STACK; + Cách 2: Sử dụng kiểu danh sách (LIST) đã cài đặt ở chương 4 #define ElementType …….. typedef LIST STACK Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 2
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
5.1.2. Cài đặt các thao tác trên ngăn xếp o Tạo ngăn xếp rỗng: void InitStack(STACK&) o Thêm một phần tử vào ngăn xếp: void Push(STACK&, ElementType ) o Trích hủy phần tử ở đỉnh ngăn xếp: ElementType Pop(STACK&) o Lấy thông tin phần tử ở đỉnh ngăn xếp: ElementType Top(STACK) o Kiểm tra ngăn xếp rỗng: int IsEmptyStack(STACK ) o Kiểm tra ngăn xếp đầy: int IsFullStack(STACK ) Chú ý: Tùy theo trường hợp khai báo ngăn xếp ở trên, các thao tác này được hiện thực theo các cách khác nhau. Ví dụ, với hàm tạo ngăn xếp rỗng: Cách 1: void InitStack(STACK& myStack) { myStack.n=0; } Cách 2: void InitStack(STACK& myStack) { InitList(myStack);//Sử dụng lại hàm khởi tạo danh sách } 5.2. Cài đặt bằng kiểu con trỏ 5.2.1. Xây dựng cấu trúc ngăn xếp Tương tự như trường hợp cài đặt bằng kiểu mảng, có thể cài đặt ngăn xếp theo 2 cách: Cài đặt mới hoặc sử dụng lại kiểu dữ liệu danh sách (LIST) đã cài đặt. + Cách 1: Cài đặt từ đầu bằng con trỏ
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 3
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
typedef struct tagNode { ElementType Info; //Thông tin của Node struct tagNode* pNext; //Con trỏ chỉ đến phần tử node tiếp theo } Node; typedef struct { Node*pHead; Node*pTail; } STACK; + Cách 2: Sử dụng kiểu danh sách (LIST) đã cài đặt ở chương 4 #define ElementType …….. typedef LIST STACK 5.2.2. Cài đặt các thao tác trên ngăn xếp o Tạo 1 node mới: Node* CreateNode(ElementType ) o Tạo ngăn xếp rỗng: void InitStack(STACK&) o Thêm một phần tử vào ngăn xếp: void Push(STACK&, Node* ) o Trích hủy phần tử ở đỉnh ngăn xếp: Node* Pop(STACK&) o Lấy thông tin phần tử ở đỉnh ngăn xếp: Node* Top(STACK) o Kiểm tra ngăn xếp rỗng: int IsEmptyStack(STACK ) o Kiểm tra ngăn xếp đầy: int IsFullStack(STACK ).
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 1
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
BÀI 4: HÀNG ĐỢI 1. Chuẩn đầu ra: Sau bài này, người học có thể Xây dựng hàng đợi bằng cách sử dụng kiểu mảng. Xây dựng hàng đợi bằng cách sử dụng con trỏ. 2. Chuẩn bị: Đọc trước lý thuyết chương hàng đợi 3. Phương tiện: Sử dụng 1 trong các phần mềm sau: Borland C 3.1, Visual Studio 6.0, Visual Studio .NET. 4. Thời lượng: 5 tiết 5. Nội dung thực hành: Yêu cầu: Cài đặt cho cấu trúc dữ liệu chung (định nghĩa ở đầu chương trình) #define ElementType int (hoặc float, long, SINHVIEN, ….). 5.1. Cài đặt bằng kiểu mảng 5.1.1. Xây dựng cấu trúc hàng đợi + Cách 1: Cài đặt từ đầu bằng mảng #define ElementType …….. typedef struct tagNode { ElementType M[MAXLEN]; //Mảng các phần tử của hàng đợi int f; //vị trí phần tử đầu hàng đợi int r;//vị trí phần tử cuối hàng đợi } QUEUE;
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Trang 2
+ Cách 2: Sử dụng kiểu danh sách (LIST) đã cài đặt ở chương 4 #define ElementType …….. typedef LIST QUEUE 5.1.2. Cài đặt các thao tác trên hàng đợi o Khởi tạo một hàng đợi rỗng: void InitQueue(QUEUE&) o Thêm một phần tử vào cuối hàng đợi: void EnQueue(QUEUE&, ElementType ) o Lấy phần tử ở đầu hàng đợi ra khỏi hàng đợi: ElementType DeQueue(QUEUE&) o Lấy thông tin phần tử ở đầu hàng đợi: ElementType Front(QUEUE) o Kiểm tra hàm đợi rỗng: int IsEmptyQueue(QUEUE) o Kiểm tra hàng đợi đầy: int IsFullQueue(QUEUE) o Xử lý hàng đợi tràn: void SolvingOverload(QUEUE&) Chú ý: Tùy theo trường hợp khai báo hàng đợi ở trên, các thao tác này được hiện thực theo các cách khác nhau. Ví dụ, với hàm tạo hàng đợi rỗng: Cách 1: void InitQueue(QUEUE& myQueue) { myQueue.f=-1; myQueue.r=-1; } Cách 2: void InitQueue(QUEUE& myQueue) {
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 3
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
InitList(myQueue);//Sử dụng lại hàm khởi tạo danh sách } 5.2. Cài đặt bằng kiểu con trỏ 5.2.1. Xây dựng cấu trúc hàng đợi Tương tự như trường hợp cài đặt bằng kiểu mảng, có thể cài đặt hàng đợi theo 2 cách: Cài đặt mới hoặc sử dụng lại kiểu dữ liệu danh sách (LIST) đã cài đặt. + Cách 1: Cài đặt từ đầu bằng con trỏ typedef struct tagNode { ElementType Info; //Thông tin của Node struct tagNode* pNext; //Con trỏ chỉ đến phần tử node tiếp theo } Node; typedef struct { Node*pHead;//Có thể đặt tên là pFront Node*pTail;//Có thể đặt tên là pRear } QUEUE; + Cách 2: Sử dụng kiểu danh sách (LIST) đã cài đặt ở chương 4 typedef LIST QUEUE 5.2.2. Cài đặt các thao tác trên hàng đợi o Tạo 1 node mới: Node* CreateNode(ElementType ) o Khởi tạo một hàng đợi rỗng: void InitQueue(QUEUE&) o Thêm một phần tử vào cuối hàng đợi: void EnQueue(QUEUE&, Node* ) o Lấy phần tử ở đầu hàng đợi ra khỏi hàng đợi: Node* DeQueue(QUEUE&)
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Trang 4
o Lấy thông tin phần tử ở đầu hàng đợi: ElementType Front(QUEUE) o Kiểm tra hàm đợi rỗng: int IsEmptyQueue(QUEUE).
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 1
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
BÀI 5: CÂY NHỊ PHÂN, CTDL TRONG LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG 1. Chuẩn đầu ra: Sau bài này, người học có thể Xây dựng cây nhị phân bằng cách sử dụng con trỏ. Biết sử dụng các cấu trúc dữ liệu trừu tượng cơ bản (danh sách, ngăn xếp, hàng đợi) trong ngôn ngữ lập trình C#. 2. Chuẩn bị: Đọc trước lý thuyết chương cây nhị phân 3. Phương tiện: Sử dụng 1 trong các phần mềm sau: Borland C 3.1, Visual Studio 6.0, Visual Studio .NET. 4. Thời lượng: 5 tiết 5. Nội dung thực hành: 5.1.
Cài đặt cây nhị phân bằng kiểu con trỏ
Yêu cầu: Cài đặt cho cấu trúc dữ liệu chung (định nghĩa ở đầu chương trình) #define ElementType int (hoặc float, long, SINHVIEN, ….). typedef struct tagTNode { ElementType key; tagTNode*pLeft, *pRight; } TNode; //Cài đặt các thao tác sau: o Hàm tạo 1 node mới: TNode* CreateNode(ElementType) o Kiểm tra cây rỗng: int IsEmptyTree(TNode*) o Thêm 1 phần tử vào cây: void InsertNode(TNode* , TNode*)
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Trang 2
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
o Xóa 1 phần tử trên cây: void DeleteNode(TNode*, ElementType) o Tìm kiếm phần tử trên cây: TNode* SearchNode(TNode*, ElementType ) o Xuất cây theo kiểu tiền tự: void PrintTree_PreOrder(TNode*) o Xuất cây theo kiểu trung tự: void PrintTree_InOrder(TNode*) o Xuất cây theo kiểu hậu tự: void PrintTree_PostOrder(TNode*) 5.2.
Các cấu trúc dữ liệu trừu tượng cơ bản trong ngôn ngữ lập trình C#
Trong phần này, chúng ta tìm hiểu cách sử dụng các cấu trúc dữ liệu đã được cài đặt trong thư viện của ngôn ngữ lập trình .NET (.NET Framework). Bước 1: Mở ứng dụng Visual Studio.NET
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Trang 3
Bước 2: Tạo 1 project mới
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Trang 4
Chọn ngôn ngữ là C#, chọn chế độ “Console Application” đặt tên project là “testCSharp”
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Trang 5
Bước 3: Cài đặt mã nguồn + Kiểu danh sách static void Main(string[] args) { List<int> myList = new List<int>(); //Thêm phần tử vào danh sách myList.Add(2); myList.Add(5); myList.Add(3); myList.Add(6); myList.Add(1); myList.Add(0); myList.Add(6); //Xuất danh sách for (int i = 0; i < myList.Count; i++) { Console.Write(" " + myList[i]); } //Xóa phần tử myList.Remove(3); //Xuất danh sách Console.WriteLine(); for (int i = 0; i < myList.Count; i++) { Console.Write(" " + myList[i]); } }
+ Kiểu danh sách liên kết static void Main(string[] args) { LinkedList<int> myList = new LinkedList<int>(); //Thêm phần tử vào danh sách myList.AddFirst(new LinkedListNode<int>(2)); myList.AddFirst(new LinkedListNode<int>(6)); myList.AddLast(new LinkedListNode<int>(7));
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh
Simpo PDF Merge and Split Unregistered Version - http://www.simpopdf.com
Trang 6
LinkedListNode<int> p = myList.First; Console.WriteLine(p.Value); LinkedListNode<int> q = p.Next; Console.WriteLine(q.Value); LinkedListNode<int> f = q.Next; Console.WriteLine(f.Value); }
+ Kiểu ngăn xếp static void Main(string[] args) { //Kiểu ngăn xếp Stack<int> myStack = new Stack<int>(); myStack.Push(2); myStack.Push(5); myStack.Push(6); Console.WriteLine(myStack.Pop()); Console.WriteLine(myStack.Pop()); Console.WriteLine(myStack.Pop()); }
+ Kiểu hàng đợi static void Main(string[] args) { //Kiểu hàng đợi Queue<int> myQueue = new Queue<int>(); myQueue.Enqueue(7); myQueue.Enqueue(3); myQueue.Enqueue(8); Console.WriteLine(myQueue.Dequeue()); Console.WriteLine(myQueue.Dequeue()); Console.WriteLine(myQueue.Dequeue()); }
Thực hành CTDL1
Khoa CNTT – ĐH SPKT TP.HCM
ThS.Lê Văn Vinh