Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống
1
/ 96 trang
THÔNG TIN TÀI LIỆU
Thông tin cơ bản
Định dạng
Số trang
96
Dung lượng
505,51 KB
Nội dung
TRƯỜNG ĐẠI HỌC SƯ PHẠM KỸ THUẬT HƯNG YÊN KHOA CÔNG NGHỆ THÔNG TIN BÀI TẬP THỰC HÀNH HỌC PHẦN: CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT Trình độ đào tạo : Đại học Hệ đào tạo : Chính quy Hưng Yên năm 2012 Bài tập thực hành CTDL & GT Trang MỤC LỤC BÀI THỰC HÀNH KIỂU DỮ LIỆU CÓ CẤU TRÚC BÀI THỰC HÀNH ĐỘ PHỨC TẠP TÍNH TỐN 16 BÀI THỰC HÀNH 3+4 DANH SÁCH NỐI ĐƠN 22 BÀI THỰC HÀNH NGĂN XẾP - STACK 42 BÀI THỰC HÀNH HÀNG ĐỢI - QUEUE 53 BÀI THỰC HÀNH DANH SÁCH LIÊN KẾT KÉP 59 BÀI THỰC HÀNH DANH SÁCH LIÊN KẾT VÒNG 70 BÀI THỰC HÀNH CÂY NHỊ PHÂN 81 BÀI THỰC HÀNH 10 Kiểm tra thực hành 96 Bài tập thực hành CTDL & GT BÀI THỰC HÀNH Trang KIỂU DỮ LIỆU CÓ CẤU TRÚC * Mục tiêu Hệ thống lại kiến thức kiểu liệu mảng, xâu, tệp, cấu trúc: Cách khai báo, thao tác trên, cách thức tổ chức nhớ mảng, xâu, tệp, cấu trúc * Yêu cầu: A Bài tập mẫu Bài 1: Cho n số nguyên dương a0,a1,a2, ,an-1 a.Chèn phần tử x vào vị trí k dãy b.Xóa tất số nguyên tố dãy Gợi ý: a.Khởi tạo mảng trung gian tmp có độ dài (a.Length+1) sau gán giá trị : tmp[i]=a[i] với i từ ->k-1 (k-1 vị trí trước vị trí cần chèn) tmp[k]=giá trị cần chèn tmp[i+1]=a[i] với i từ k->a.Length-1 Cuối gán mảng a=tmp b.Thực duyệt phần tử mảng kiểm tra xem phần tử có phải số nguyên tố hay không (số nguyến tố số chia hết cho nó) : + Nếu số ngun tố: Duyệt mảng từ trái sang phải.Từ vị trí số nguyên tố tiến hành dời phần tử phía trước kết thúc mảng, sau giảm kích thước mảng +Ngược lại, chuyển sang kiểm tra phần tử Lời giản mẫu using System; class VD static int[] a; { static void Nhap() { int n; Console.Write("Nhap n="); n = int.Parse(Console.ReadLine()); a = new int[n]; Bài tập thực hành CTDL & GT for (int i = 0; i < a.Length; ++i) { Console.Write("a[" + i + "]="); a[i] = int.Parse(Console.ReadLine()); } } static void Chen(int x, int k) { if (k >= && k DS[i].LuongCB) = DS[i].LuongCB; Console.WriteLine("Danh sach luong cb min"); for (int i = 0; i < DS.Length; ++i) if (DS[i].LuongCB == min) Console.WriteLine(DS[i].MaNV + "\t" + DS[i].Hoten + "\t" + DS[i].Namsinh + "\t" + DS[i].Phongban + "\t" + DS[i].LuongCB + "\t" + DS[i].Thuong + "\t" + ThucLinh(i)); } static void TongLuongCTy() { int t = 0; for (int i = 0; i < DS.Length; ++i) t += ThucLinh(i); Console.WriteLine("Tong luong cty:" + t); } static void Main() { Nhap(); TongLuongCTy(); HienMin(); Console.ReadKey(); } } B Bài tập tự giải Bài 1: Cho n số nguyên dương a0,a1,a2, ,an-1 a.Chèn phần tử x vào vị trí k dãy b.Xóa tất số nguyên tố dãy c.Kiểm tra dãy có tăng dần hay khơng ? d.Tìm số nhỏ chia hết cho tất số dãy Bài tập thực hành CTDL & GT Trang e.Tìm cặp số nguyên tố (hai số nguyên dương gọi nguyên tố ước số chung lớn chúng 1) f.Tìm tần số xuất số dãy Gợi ý: a Khởi tạo mảng trung gian tmp có độ dài (a.Length+1) sau gán giá trị : tmp[i]=a[i] với i từ ->k-1 (k-1 la vị trí trước vị trí cần chèn) tmp[k]=giá trị cần chèn tmp[i+1]=a[i] với i từ k->a.Length-1 Cuối gán mảng a=tmp b Thực duyệt phần tử mảng kiểm tra xem phần tử có phải la số nguyên tố hay không (số nguyến tố số chia hết cho nó) : + Nếu số nguyên tố: Duyệt mảng từ trái sang phải Từ vị trí số ngun tố tiến hành dời phần tử phía trước kết thúc mảng,sau giảm kích thước mảng + Ngược lại,chuyển sang kiểm tra phần tử c Duyệt qua phần tử a[i] mảng với i từ 0->n-2, phần tử kiểm tra xem có nhỏ phần tử a[j] không với j=i+1->n-1 + Nếu khơng, khỏi vòng lặp trả giá trị False (không tăng dần) + Ngược lại, kiểm tra phần tử a[i] d Đầu tiên ta xây dựng hàm BCNN(int x,int y) tính BCNN số Sau ta khởi tạo giá trị int bc = thực tính BCNN bc với phần tử mảng, kết thu đưa vào bc e Xây dựng hàm tìm UCLN số Thực duyệt qua phần tử a[i] mảng với i từ 0->n-2, với phần tử ta tìm UCLN phần tử với phần tử a[j] với j từ i+1 -> n-1 UCLN =1 ta in cặp a[i],a[j] f Ta tạo mảng mới: mảng b chứa phần tử không trùng mảng a, mảng c chứa tần số xuất số tương ứng mảng b ( khởi tạo phần tử c =0) Khởi tạo b[0]=a[0] Duyệt qua phần tử mảng a: +Nếu a[i] = b[i] c[i] =c[i]+1 +Nếu a[i] !=b[i] b[i+1]=a[i] Bài tập thực hành CTDL & GT Trang 10 Bài 2: Cho ma trận vng n dòng n cột; phần tử số nguyên (0≤ n < 100) Viết hàm thực yêu cầu sau: a.Tính tổng tất phần tử ma trận b.Tìm giá trị dương nhỏ ma trận c.Tính tổng phần tử nằm đường chéo phụ d.Kiểm tra xem phần tử nằm đuờng chéo có tăng dần hay khơng ? (theo chiều từ góc bên trái xuống góc bên phải) Gợi ý: a Khởi tạo giá trị t=0.Sau duyệt qua phần tử ma trận , thực cộng t với phần tử ma trận: b Khởi tạo giá trị dương vô int = int.MaxValue; Thực duyệt qua phần tử ma trận,nếu thấy phần tử nhỏ lớn gán vào c.Ta nhận thấy phần tử a[i,j] thuộc đường chéo ma trận cấp n có j=(n-1)-i với i ,j chạy từ ->n-1 Để tính tổng phần tử đường chéo phụ ta duyệt qua phần tử a[i,j] ma trận phần tử thỏa mãn j=(n-1)-i ta thực cộng phần tử lại d.Ta thấy ma trận cấp n số phần tử đường chéo la n + Đầu tiên , ta thực việc khai báo mảng chiều []tg có n phần tử chứa phần tử a[i,j] đường chéo ma trận(với i=j) theo chiều từ góc bên trái phía đến bên phải phía + Duyệt qua phần tử tg[i] mảng tg với i từ 0->n-2, phần tử kiểm tra xem có nhỏ phần tử tg[j] khơng với j=i+1 ->n-1 *Nếu khơng ,thốt khỏi vòng lặp trả giá trị False (không tăng dần) *Ngược lại,kiểm tra phần tử tg[i] Bài 3: Cho ma trận vng n dòng n cột; phần tử ma trận phân số (giả thiết tử số mẫu số phân số số nguyên) Hãy thực yêu cầu sau: a.Tìm phân số có giá trị nhỏ nằm khoảng.(0;1) b.Đếm số lượng phân số nằm ma trận tam giác có giá trị nằm khoảng (0,1) Bài tập thực hành CTDL & GT Console.Write(nut.Data + "->"); } static void Pinorder(Node nut) { if (nut != null) { Pinorder(nut.Left); Duyet(nut); Pinorder(nut.Right); } } //Ham thuc hien cac chuc nang cua chuong trinh static void Main() { Node root = null; int newdata; { Console.Write("Ket thuc nhap nhan Enter"); newdata = int.Parse("0" + Console.ReadLine()); if (newdata != 0) InSert(ref root, newdata); } while (newdata != 0); Console.WriteLine("Duyet thu tu giua_LNR su dung de quy:"); Pinorder(root); Console.ReadKey(); } } Câu 2: Thực thao tác sau với nhị phân tìm kiếm a) Tạo nhị phân tìm kiếm với khóa cho trước b) Khiểm tra xem khóa có khơng? c) Hiện thị kết duyệt theo thứ tự d) Đếm số node e) Đếm số nút có Trang 82 Bài tập thực hành CTDL & GT Trang 83 f) Đếm số nút có hai g) Đếm số h) Chiều cao Lời giải mẫu using System; class Node { public int value; public Node left, right; } class Tree { static Node Root = null;//Goc cua cay nhi phan //Phuong thuc them mot nut co khoa la X vao cay nhi phan p static void Insert(ref Node Root, int X) { if (Root == null) { Root = new Node(); Root.value = X; Root.left = null; Root.right = null; } else { if (Root.value < X) Insert(ref Root.right, X); else if (Root.value > X) Insert(ref Root.left, X); } } static void Search(Node Root, int x, ref Node p) { //Nếu tìm thấy p tới nút có trường khoá x, ngược lại p = null} p = Root; if (p != null) if (x < p.value) Search(Root.left, x, ref p); else if (x > p.value) Search(Root.right, x, ref p); else Console.WriteLine("Da tim thay nut co gia tri"+x); else Console.WriteLine("Khong tim thay nut co gia tri" + x); } //Phuong thuc duyet cay nhi phan tho thu tu giua static void LNR(Node Root) { if (Root != null) Bài tập thực hành CTDL & GT { LNR(Root.left); Console.Write("{0} -> ", Root.value); LNR(Root.right); } } //Dem so nut cua cay nhi phan, luu bien dem static void CountNode(Node Root,ref int dem) { if (Root != null) { dem++; CountNode(Root.left, ref dem); CountNode(Root.right, ref dem); } } static int Count1Node(Node Root) { if (Root == null) return 0; else if ((Root.left == null) && (Root.right == null)) return 0; else if (Root.left == null) return + Count1Node(Root.right); else if (Root.right == null) return + Count1Node(Root.left); else return Count1Node(Root.left) + Count1Node(Root.right); } static int Count2Node(Node Root) { if (Root == null) return 0; else if ((Root.left == null) && (Root.right == null)) return 0; else if (Root.left == null) return Count2Node(Root.right); else if (Root.right == null) return Count2Node(Root.left); else return + Count2Node(Root.left) + Count2Node(Root.right); } static int CountLeaf(Node Root) { if (Root == null) return 0; else if ((Root.left == null) && (Root.right == null)) return 1; Trang 84 Bài tập thực hành CTDL & GT Trang 85 else return CountLeaf(Root.left) + CountLeaf(Root.right); } static int max(int a, int b) { int max; if (a > b) max = a; else max = b; return max; } static int high_tree(Node Root) { if (Root == null) return 0; else return + max(high_tree(Root.left), high_tree(Root.right)); } static void Main() { int[] A = new int[] { 6, 13, 25, 14, 51, 42, 12, 31, 56, 67, 34 }; //Lan luot them cac phan tu cua mang A vao cay nhi phan thoa man dieu kien la cay nhi phan tim kiem for (int i = 0; i < A.Length; i++) Insert(ref Root, A[i]); //In cay nhi phan bang cach duyet theo thu tu giua LNR(Root); Console.WriteLine(); Node p = null; Search(Root, 56, ref p); //Dem so luong nut tren cay nhi phan int dem = 0; CountNode(Root, ref dem); Console.Write("\nSo nut tren cay nhi phan {0}", dem); Console.Write("\nSo node co mot con: {0}", Count1Node(Root)); Console.Write("\nSo node co hai con: {0}", Count2Node(Root)); Console.Write("\nSo la: {0}", CountLeaf(Root)); Console.Write("\nChieu cao: {0}", high_tree(Root)); Console.ReadKey(); } } Câu 3: Viết chương trình cài đặt biểu thức với yêu cầu sau: a) Tạo biểu thức b) Tính giá trị biểu thức c) Hiển thị giá trị node theo thứ tự sau Gợi ý Bài tập thực hành CTDL & GT Trang 86 Thuật toán yêu cầu sử dụng stack: - OperatorStack: Chứa toán tử - NodeStack: Chứa node tạo nên cấu trúc (node gốc xây dựng từ lên) Các bước tiến hành thuật toán Tạo phương thức phụ CreateSubTree() có nhiệm vụ tạo biểu thức gồm node Node gốc toán tử Pop từ OperatorStack, hai node toán hạng Pop từ NodeStack Cuối đưa node gốc vào lại NodeStack Lặp qua token biểu thức infix - Nếu toán hạng: Push vào NodeStack - Nếu dấu mở ngoặc “(“: Push vào OperatorStack - Nếu dấu đóng ngoặc “)”: + Lặp lấy dấu mở ngoặc “(“ OperatorStack, lần lặp gọi phương thức CreateSubTree() + Pop dấu mở ngoặc khỏi OperatorStack - Nếu toán tử: + Lặp OperatorStack rỗng độ ưu tiên toán tử đỉnh OperatorStack nhỏ độ ưu tiên toán tử Mỗi lần lặp gọi phương thức CreateSubTree() + Push toán tử vào OperatorStack Khi hết vòng lặp, OperatorStack phần tử, gọi phương thức CreateSubTree() OperatorStack rỗng Node cuối nằm NodeStack node gốc Ví dụ chuyển biểu thức infix sau thành biểu thức: (a+b)*c-d/e Token OperatorStack NodeStack Description ( ( {Empty} a ( a Push “a” vào NodeStack + (+ a Push “+” vào OperatorStack b (+ ab ) {Empty} + Cho “a”, “b” thành node “+” Push “+” vào NodeStack * * + Push “*” vào OperatorStack c * +c - - * d - *d Push “(“ vào OperatorStack Push “b” vào NodeStack Push “c” vào NodeStack Cho “+”, “c” thành node “*” Push “*” vào node Stack Push “-“ vào OperatorStack Push “d” vào NodeStack Bài tập thực hành CTDL & GT Trang 87 / -/ *d Push “/” vào OperatorStack e -/ *de Push “e” vào NodeStack -/ *de Kết thúc vòng lặp - */ Cho “d” “e” thành node “/” Push “/” vào NodeStack {Empty} - Cho “*” “/” thành node “-“ Push “-“ vào NodeStack Lời giải mẫu using System; using System.Collections.Generic; using System.Text; using System.Text.RegularExpressions; class BinaryTreeNode { public BinaryTreeNode LeftChild; public BinaryTreeNode RightChild; public string Value; public bool IsLeaf { get { return this.LeftChild == null && this.RightChild == null; } } public BinaryTreeNode(string value) { Value = value; } } class Expression { static string Infix2Prefix(string infix) { List prefix = new List(); Stack stack = new Stack(); for(int i=0;i && Priority(infix[i].ToString()) < Priority(stack.Peek())) prefix.Add(stack.Pop()); stack.Push(infix[i].ToString()); } } while (stack.Count > 0) prefix.Add(stack.Pop()); StringBuilder str = new StringBuilder(); for (int i = prefix.Count - 1; i >= 0; i ) { str.Append(prefix[i]); } return str.ToString(); } static double EvaluateExpressionTree(BinaryTreeNode node) { double t = 0; if (node.IsLeaf) t = double.Parse(node.Value); else { double x = EvaluateExpressionTree(node.LeftChild); double y = EvaluateExpressionTree(node.RightChild); switch (node.Value) { case "+": t = x + y; break; case "-": t = x - y; break; case "*": t = x * y; break; case "/": t = x / y; break; case "%": t = x % y; break; Trang 88 Bài tập thực hành CTDL & GT Trang 89 } } return t; } static void CreateSubTree(Stack opStack, Stack nodeStack) { BinaryTreeNode node = opStack.Pop(); node.RightChild = nodeStack.Pop(); node.LeftChild = nodeStack.Pop(); nodeStack.Push(node); } static BinaryTreeNode Infix2ExpressionTree(string infixExpression) { List prefix = new List(); Stack operatorStack = new Stack(); Stack nodeStack = new Stack(); for (int i = 0; i < infixExpression.Length; ++i) { if (IsOperator(infixExpression[i])) { while (operatorStack.Count > && Priority(operatorStack.Peek().Value) >= Priority(infixExpression[i].ToString())) CreateSubTree(operatorStack, nodeStack); operatorStack.Push(new BinaryTreeNode(infixExpression[i].ToString())); } else if (infixExpression[i] == '(') operatorStack.Push(new BinaryTreeNode(infixExpression[i].ToString())); else if (infixExpression[i] == ')') { while (operatorStack.Peek().Value != "(") CreateSubTree(operatorStack, nodeStack); operatorStack.Pop(); } else nodeStack.Push(new BinaryTreeNode(infixExpression[i].ToString())); } while (operatorStack.Count > 0) CreateSubTree(operatorStack, nodeStack); return nodeStack.Peek(); } static bool IsOperator(char str) { return str == '+' || str == '-' || str == '*' || str == '/'; Bài tập thực hành CTDL & GT Trang 90 } static bool IsOperand(char str) { return str >= '0' && str duyệt trái theo thứ tự trước->duyệt phải theo thứ tự trước -Duyệt trung tự: duyệt trái theo thứ tự giữa->thăm gốc->duyệt phải theo thứ tự Bài tập thực hành CTDL & GT Trang 92 -Duyệt hậu tự: duyệt trái theo thứ tự sau->duyệt phải theo thứ tự sau->thăm gốc -Duyệt theo mức: ta sử dụng kiểu hàng đợi queue để duyệt Nếu khơng rỗng thực đưa vào queue, queue chưa rỗng in giá trị queue, trái khơng rỗng duyệt mức bên trái,ngược lại duyệt mức bên phải Duyệt rỗng số nút cây=gốc+cây bên trái+cây bên phải 7.Chiều cao xác định cơng thức h=[log2(n+1)], n số nút 8.Đầu tiên ta phải duyệt theo thứ tự trước để chuyển biểu thức dạng tiền tố duyệt theo thứ tự sau để chuyển biểu thức dạng hậu tố Sau ta thực tính tốn giá trị biểu thức giống tính toán biểu thức phần stack Bài 2: Viết chương trình cài đặt tìm kiếm nhị phân (nhãn nút nhập từ bàn phím) Yêu cầu chi tiết: Viết phần khai báo để cài đặt tìm kiếm nhị phân Viết thủ tục khởi tạo rỗng Viết hàm kiểm tra rỗng Viết thủ tục xen nút vào tìm kiếm nhị phân Viết thủ tục xóa nút tìm kiếm nhị phân Viết thủ tục nhập tìm kiếm nhị phân với nhản nút nhập vào từ bàn phím Viết thủ tục duyệt cây: Duyệt tiền tự, trung tự, hậu tự Duyệt theo mức Viết hàm xác định số nút Thiết kế hàm xác định chiều cao 10 Viết hàm xác định mức nút Gợi ý: Bài tập thực hành CTDL & GT Trang 93 1.Trước tiên ta khai báo lớp node gồm thành phần lưu trữ thông tin ,2 thành phần chứa địa bên trái bên phải khai báo node root (gốc)mới class node { public int info; public node left, right; } 2.Cây rỗng gốc nghĩa root=null.cây trái rỗng root.left=null, phải rỗng root.next=null 3.Trả giá trị root=null 4.Ta xen nút vào nhị phân vào nhiều chỗ khác thêm vào nút thuận tiện Trước tiên ta tạo node p gán p.info=x(x giá trị nút muốn thêm vào) Sau kiểm tra gốc rỗng gán ln nút gốc, trái,phải gốc null, ngược lại x mà lớn giá trị gốc ta them vào bên phải, nhỏ them vào bên trái 5.Xóa nút xảy trường hợp: -x nút -x nút nửa lá(chỉ có trái phải) -x có đủ hai con(trường hợp tổng quát) Nếu nút muốn xóa khơng có trái phải ta cần xóa nút xong, ngược lại có trái phải thì cho trái phải móc nối với cha nút Nếu nút muốn xóa có phải trái ta so sánh phải trái nút với cha trái nhỏ cha nút cần xóa cho chúng móc nối với nhau, ngược lại ta cho phải móc nối với cha nút cần xóa 6.Nếu rỗng gán ln giá trị nhập vào gốc, ngược lại so sánh với gốc nhỏ gán trái gốc, ngược lại gán phải gốc,c ứ kết thúc việc nhập vào thơi Duyệt tiền tự: thăm gốc->duyệt trái theo thứ tự trước->duyệt phải theo thứ tự trước Bài tập thực hành CTDL & GT Trang 94 -Duyệt trung tự: duyệt trái theo thứ tự giữa->thăm gốc->duyệt phải theo thứ tự -Duyệt hậu tự: duyệt trái theo thứ tự sau->duyệt phải theo thứ tự sau->thăm gốc -Duyệt theo mức: ta sử dụng kiểu hàng đợi queue để duyệt Nếu khơng rỗng thực đưa vào queue,trong queue chưa rỗng in giá trị queue,nếu trái không rỗng duyệt mức bên trái,ngược lại duyệt mức bên phải Duyệt rỗng số nút cây=gốc+cây bên trái+cây bên phải Chiều cao xác định công thức h=[log2(n+1)],trong n số nút Bài 3: Viết chương trình cài đặt tổng quát ( dùng mảng hay trỏ ) Yêu cầu chi tiết: Viết phần khai báo để cài đặt Viết thủ tục khởi tạo rỗng Viết hàm kiểm tra rỗng Viết thủ tục nhập với nhản nút nhập từ bàn phím Viết thủ tục duyệt cây: Duyệt tiền tự Duyệt trung tự Duyệt hậu tự Duyệt theo mức Viết hàm xác định số nút Thiết kế hàm xác định chiều cao Viết hàm xác định mức nút (nút có nhản cần xác định) Thiết lập hàm kiểm tra hữu nút 10 Thiết lập hàm xác định nhản nút trái nút với nhản nút nhập từ bàn phím 11 Thiết lập hàm xác định nhản nút anh ruột phải nút với nhản nút nhập từ bàn phím Bài tập thực hành CTDL & GT Trang 95 12 Thiết lập hàm xác định nhản nút cha nút với nhản nút với nhản nút nhập từ bàn phím Gợi ý: 1.Khai báo lớp node gồm thành phần lưu trữ kiểu giá trị nút,1 trường lưu trữ địa nút Class node { Public int x; Public node con1; Public node con2; … } 2.Cây khai báo rỗng nút gốc khai báo rỗng 3.Hàm kiểm tra rỗng trả giá trị True nút gốc rỗng (root=null) 4.Sử dụng đệ quy Thực kiểm tra + Nếu rỗng (root=null) gán gốc có giá trị vừa nhập nút trỏ vào null +Ngược lại,Kiểm tra thứ (root.con1) rỗng gán cho giá trị vừa nhập nút trỏ vào null,nếu không rỗng thực kiểm tra nút việc gán thực tương tự 5.Xây dựng hàm duyệt hiển thị giá trị nút Trong thuật toán duyệt ta sử dụng hàm đệ quy *Duyệt tiền tự : gọi hàm duyệt hiển thị nút gốc ,rồi duyệt đệ quy nút *Duyệt trung tự : *Duyệt hậu tự: gọi hàm duyệt đệ quy nút nút gốc gọi hàm duyệt hiển thị nút gốc *Duyệt mức:khởi tạo QUEUE ,duyệt qua nút cây,tại nút thực đưa tất nút vào Queue phần tử Queue.Tiếp đến thực gọi hàm đệ quy Duyệt mức 6.Duyệt qua nút ,qua nút ta thực tăng giá trị biến đếm nút với khởi tạo 7.hàm xác định chiều cao trả giá trị loga số của( số nút +1) Bài tập thực hành CTDL & GT BÀI THỰC HÀNH 10 Trang 96 Kiểm tra thực hành * Yêu cầu: - Cài đặt thuật tốn kiểu liệu - Có khả áp dụng thuật tốn để lập trình giải toán theo yêu cầu .. .Bài tập thực hành CTDL & GT Trang MỤC LỤC BÀI THỰC HÀNH KIỂU DỮ LIỆU CÓ CẤU TRÚC BÀI THỰC HÀNH ĐỘ PHỨC TẠP TÍNH TOÁN 16 BÀI THỰC HÀNH 3+4 DANH SÁCH NỐI ĐƠN 22 BÀI... 70 BÀI THỰC HÀNH CÂY NHỊ PHÂN 81 BÀI THỰC HÀNH 10 Kiểm tra thực hành 96 Bài tập thực hành CTDL & GT BÀI THỰC HÀNH Trang KIỂU DỮ LIỆU CÓ CẤU TRÚC * Mục tiêu Hệ... THỰC HÀNH NGĂN XẾP - STACK 42 BÀI THỰC HÀNH HÀNG ĐỢI - QUEUE 53 BÀI THỰC HÀNH DANH SÁCH LIÊN KẾT KÉP 59 BÀI THỰC HÀNH DANH SÁCH LIÊN KẾT VÒNG 70 BÀI