ĐỒ ÁN CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT
ĐẠI HỌC ĐÀ NẴNG TRƯỜNG ĐẠI HỌC BÁCH KHOA KHOA CÔNG NGHỆ THÔNG TIN ĐỒ ÁN CẤU TRÚC DỮ LIỆU & GIẢI THUẬT ĐỀ TÀI SỐ 07 GVHD : Nguyễn Thị Minh Hỷ Sinh viên thực hiện : Trần Thanh Duy Nguyễn Văn Hưng Phan Đăng Mùi Lớp : 09T4 Đà Nẵng tháng 12/2011 LỜI CẢM ƠN ĐỒ ÁN CẤU TRÚC DỮ LIỆU Chúng em xin chân thành cám ơn cô Nguyễn Thị Minh Hỷ đã tận tình hướng dẫn và giúp đỡ chúng em trong quá trình thực hiện đề tài này. Chúng em xin cám ơn các bạn trong và ngoài lớp đã động viên, đóng góp ý kiến và hỗ trợ chúng em trong quá trình thực hiện đồ án. Tuy nhiên do kinh nghiệm còn hạn chế và thời gian có hạn nên còn có nhiều thiếu sót rất mong được sự thông cảm và đóng góp ý kiến của quý thầy cô và các bạn. Chúng em xin chân thành cám ơn! Đà Nẵng, tháng 12 năm 2011 Nhóm sinh viên thực hiện: 1.Trần Thanh Duy 2. Nguyễn Văn Hưng 3. Phan Đăng Mùi LỚP 09T4 TRANG 2 ĐỒ ÁN CẤU TRÚC DỮ LIỆU MỤC LỤC GIỚI THIỆU ĐỀ TÀI Gia phả là cách ghi chép tên tuổi, tiểu sử, phần mộ, ngày giỗ của từng người trong gia tộc, theo thứ tự các đời. Gia phả đã xuất hiện từ thời xa xưa ở phương Tây cũng như ở phương Đông. Nội dung của gia phả thường gồm hai phần: phần đầu ghi chép nguồn gốc của dòng họ, đó là phần phả kí. Tiếp theo là phần tộc hệ, lần lượt ghi chép tên huý (tên tự, tên hiệu), ngày tháng năm sinh, năm mất, chức tước, phần mộ, ngày giỗ của từng người trong họ. Ngoài ra, còn có phần kỉ sự, ghi chép sự nghiệp, công trạng của ông tổ các đời. Để thấy rõ một cách tổng quát các chi lớn, nhỏ, xa, gần của một họ, người ta còn lập ra các phả đồ, với những hình vẽ đơn giản kèm theo tên tuổi ghi vắn tắt ở bên dưới. Trong phạm vi đồ án này, chúng em xin xây dựng một chương trình nhỏ để lưu trữ và hiển thị một cây gia phả đơn giản được biểu diễn dưới cấu trúc cây gồm các chức năng: + Nhập một cây gia phả từ bàn phím. + Hiển thị cây gia phả lên màn hình. + Tìm kiếm một thành viên trong gia phả và hiển thị họ tên, ngày tháng năm sinh và tình trạng gia đình của con cháu, những người ngang hàng với người tìm thấy, và in ra gia phả của người này. LỚP 09T4 TRANG 3 TRẦN VĂN A TRẦN VĂN B TRẦN C TRẦN VĂN D TRẦN THỊ E TRẦN F TRẦN G TRẦN H ĐỒ ÁN CẤU TRÚC DỮ LIỆU CẤU TRÚC DỮ LIỆU YÊU CẦU I. Cấu trúc dữ liệu - Để giải quyết bài toán lưu trữ một cây gia phả của một dòng họ gồm các thông tin : họ và tên, ngày tháng năm sinh và tình trạng gia đình (có hoặc chưa có gia đình) của từng thành viên ta có thể sử dụng cấu trúc cây n phân để lưu trữ. - Đối với kiểu cấu trúc này, rất phù hợp để biểu diễn sơ đồ phả hệ của dòng họ một cách minh bạch, rõ ràng trong tìm kiếm và thích hợp trong lưu trữ. Điều khó khăn ở đây là bậc của cây phụ thuộc vào số con lớn nhất của một thành viên trong gia tộc, vì thế khó có thể xác định trước được n trong lý thuyết. - Với gốc cây lưu trữ thông tin của ông tổ của dòng họ, các nhánh con là thông tin của các thành viên ở các đời tiếp theo. Hình 1: Sơ đồ cây lưu giữ một gia phả. I.1. Giới thiệu sơ lược cấu trúc cây Trong khoa học máy tính, cây là một cấu trúc dữ liệu được sử dụng rộng rãi gồm một tập hợp các nút (tiếng Anh: node) được liên kết với nhau theo quan hệ cha- LỚP 09T4 TRANG 4 ĐỒ ÁN CẤU TRÚC DỮ LIỆU con. Cây trong cấu trúc dữ liệu đầu tiên là mô phỏng (hay nói cách khác là sự sao chép) của cây (có gốc) trong lý thuyết đồ thị. Hầu như mọi khái niệm trong cây của lý thuyết đồ thị đều được thể hiện trong cấu trúc dữ liệu. Tuy nhiên cây trong cấu trúc dữ liệu đã tìm được ứng dụng phong phú và hiệu quả trong nhiều giải thuật. Khi phân tích các giải thuật trên cấu trúc dữ liệu cây, người ta vẫn thường vẽ ra các cây tương ứng trong lý thuyết đồ thị. Hình 2: Cây nhị phân I.2. Các khái niệm trong cây I.2.1. Các nút Một nút có thể chứa một giá trị, một điều kiện, một cấu trúc dữ liệu riêng biệt hoặc chính một cây. Mỗi nút trong một cây có thể không có hoặc có một số nút con, các nút con có mức cao hơn nó (theo quy ước khác với cây tự nhiên, cây trong cấu trúc dữ liệu phát triển từ trên xuống). Một nút có con được gọi là nút cha của các nút con. Một nút có nhiều nhất một nút cha. I.2.2. Nút gốc Trong mỗi cây có một nút đặc biệt được gọi là nút gốc (hay nói đơn giản là gốc). Nút gốc là nút duy nhất không có nút cha. Nút gốc là nơi khởi đầu của nhiều giải thuật trên cây. Tất cả các nút khác được nối về nút gốc bằng một đường đi qua các cạnh hay các liên kết. I.2.3. Các nút lá Các nút không có nút con được gọi là nút lá hay gọi đơn giản là lá. LỚP 09T4 TRANG 5 ĐỒ ÁN CẤU TRÚC DỮ LIỆU I.2.4. Các nút trong Nút trong của một cây là nút trên cây có ít nhất một con, nghĩa là các nút không phải là lá. Các khái niệm về mức của mỗi nút, chiều cao của cây được định nghĩa giống như cây trong lý thuyết đồ thị. I.2.5. Cây con Một cây con là một bộ phận của cấu trúc dữ liệu cây mà tự nó cũng là một cây. Một nút bất kỳ trong cây T, cùng với các nút dưới nó tạo thành một cây con của T. I.3. Biểu diễn cây Có nhiều phương pháp biểu diễn cây. Cách thường dùng nhất là biểu diễn mỗi nút như một dữ liệu kiểu bản ghi, mỗi nút chứa các con trỏ tới các con hoặc cha của nó, hoặc cả hai. Cây cũng có thể biểu diễn bằng các mảng cùng với quan hệ giữa các vị trí trong mảng. I.3.1. Biểu diễn bằng các nút với các con trỏ Mỗi nút là một dữ liệu kiểu bản ghi với ba trường: Một trường thường gọi là INFOR, chứa thông tin lưu trữ tại nút đó. Thông tin này có thể chỉ là một số, một kư tự, cũng có thể là một tập hợp dữ liệu rất phức tạp. Hai trường LLINK và RLINK chứa các liên kết trái và phải. Nếu cây là cây nhị phân, LLINK trỏ tới con trái của nút, RLINK trỏ tới con phải của nút. Nếu cây là cây tổng quát, LLINK trỏ tới con cực trái và RLINK trỏ tới em kế cận phải của nút đó. Do đó danh sách các nút biểu diễn một cây tổng quát, khi được xem là biểu diễn của cây nhị phân sẽ cho một cây nhị phân. Cây nhị phân này được gọi là cây nhị phân tương đương với cây tổng quát ban đầu. I.3.2. Biểu diễn cây nhị phân bằng mảng Cây nhị phân đầy đủ là cây nhị phân, trong đó mỗi nút trong chỉ có hai con. Cây nhị phân hoàn chỉnh là cây nhị phân đầy đủ, trong đó tất cả các lá đều ở mức cao nhất. Một cây nhị phân hoàn chỉnh chiều cao h chỉ có 2 h + 1 − 1 nút. Do đó người ta có thể dùng một mảng gồm 2 h + 1 − 1 phần tử để biểu diễn cây hoàn chỉnh, bằng cách lần lượt lưu trữ thông tin của mỗi nút vào mảng theo thứ tự từ trên xuống dưới, từ trái sang phải. Khi đó con trái của nút thứ i là phần tử thứ 2*i, con phải là phần tử thứ 2*i+1. Cha của phần tử thứ i là phần tử thứ int(i/2). Nếu cây là không hoàn chỉnh, ta gán giá trị Null cho các vị trí còn thiếu so với cây nhị phân hoàn chỉnh. Một cách khác, dùng một mảng hai chiều trong dòng thứ nhất ghi các thông tin của nút, dòng thứ hai ghi chỉ số của nút cha của nút đó với dấu + nếu nút hiện tại là con trái, với dấu - nếu nút hiện tại là con phải của nút cha. I.4. Các phương pháp duyệt cây Duyệt một cây là một trình tự làm việc với các nút trong cây, trình tự này giống như một chuyến đi qua các nút trên cây theo các liên kết cha-con. Các giải thuật duyệt LỚP 09T4 TRANG 6 ĐỒ ÁN CẤU TRÚC DỮ LIỆU khác nhau về thứ tự “viếng thăm” giữa một nút cha và các nút con. Chúng được gọi là duỵệt tiền thứ tự, nếu viếng thăm đỉnh cha trước rồi mới đến các con, là duyệt hậu thứ tự nếu viếng thăm hết các con rồi mới đến cha. II. Chương trình II.1. Các thư viện sử dụng trong chương trình - #include<conio.h> : Thư viện con trỏ màn hình - #include<string.h> : Thư viện các hàm xử lý xâu chuổi - #include<stdio.h> : Thư viện các hàm nhập xuất II.2. Định nghĩa các cấu trúc dữ liệu Để lưu trữ một gia phả, ta xây dựng một struct giapha để lưu các thông tin sau: - Họ tên , ngày tháng năm sinh , gia đình (đã kết hôn hay chưa). - Cha: cho biết tên cha người đó. - Số con : cho biết số con của người đó. - Mức : cho biết thế hệ của người đó tính từ ông trưởng (thế hệ 0). - Biến con trỏ trỏ tới những người con khai báo thành mảng sub[n] struct giapha { infor ch; infor ht; LỚP 09T4 TRANG 7 ĐỒ ÁN CẤU TRÚC DỮ LIỆU int n,t,ns; int gd,socon,muc; giapha *sub[50]; }; Để tạo một cây lưu gia phả ta định nghĩa Tree là con trỏ kiểu bản ghi gia phả và khai báo cây T kiểu Tree. typedef giapha *Tree; Tree T; Như vậy ta đã hoàn thành bước định nghĩa một cây để lưu dữ liệu của gia phả II. 3. Các hàm sử dụng trong chương trình chính Chương trình bao gồm các hàm sau: - Tree taogiapha(infor x,int ngay,int thang,int nam,int z,int socon,int Muc): Hàm này trả vể giá trị là dữ liệu kiểu Tree, nhiệm vụ của hàm này là biến đổi từ thông tin rời rạc gồm họ tên, ngày sinh , gia đình thành một phần tử kiểu bản ghi giapha. - void duyet(Tree T,Tree onggia,int *a): Hàm này duyệt cây theo thứ tự trước . Tức là duyệt theo thứ tự : Gốc Con1 Con2 Con3. Hàm duyệt qua tất cả các phần tử của cây và in ra màn hình, hàm sử dụng trong hàm void hienthi(Tree T). - void hienthi(Tree T): Hàm này để hiển thị toàn bộ cây ra màn hình. - void Search(Tree T,infor x,Tree &vt ): Hàm này để tìm kiếm Người có tên “ x “ lưu vào vùng nhớ Tree vt, nghĩa là tìm kiếm người đó và thông tin con cháu người đó. - void SearchMuc(Tree T,int Muc,Tree vt): Hàm này để tìm thông tin tất cả những người cùng thế hệ với người này. - void nhapnguoi(Tree &T): Hàm này để nhập thông tin của một người vào gia phả từ bàn phím, gồm có : Họ tên , Ngày sinh , Gia đình ,Người sinh thành (cha). - void hienthitimnguoi(): Hàm này hiển thị tất cả thông tin của những người cùng thế hệ. - void inds(Tree T): Hàm này xuất gia phả dưới dạng danh sách. LỚP 09T4 TRANG 8 ĐỒ ÁN CẤU TRÚC DỮ LIỆU - void incc(Tree T): Hàm này để in con cháu của một người. II.4. Hình ảnh chạy chương trình LỚP 09T4 TRANG 9 ĐỒ ÁN CẤU TRÚC DỮ LIỆU Hình 3. Menu của chương trình chính Hình 4. Nhập thông tin một người vào gia phả LỚP 09T4 TRANG 10 [...]...ĐỒ ÁN CẤU TRÚC DỮ LIỆU Hình 5 Sơ đồ cây gia phả của chương trình Hình 6 Tìm kiếm thông tin một người trong gia phả Hình 7: Danh sách gia phả II.5 Mã nguồn chương trình LỚP 09T4 TRANG 11 ĐỒ ÁN CẤU TRÚC DỮ LIỆU #include #include #include typedef char infor[20]; struct giapha {... An phim 5 *"); An phim 0 *"); printf("\n ************************************************************"); printf("\n\n VUI LONG CHON CONG VIEC: "); scanf("%d",&cv); switch(cv) LỚP 09T4 TRANG 12 ĐỒ ÁN CẤU TRÚC DỮ LIỆU { case 1: nhapnguoi(T); break; case 2: clrscr(); hienthi(T,0); getch(); break; case 3: clrscr(); hienthitimnguoi(); getch(); break; case 4: clrscr(); printf("\nDANH SACH GIA PHA"); inds(T);... (*p).t = thang; (*p).ns = nam; (*p).gd = z; (*p).socon=socon; if(socon) { int i; for(i=1;i . thấy, và in ra gia phả của người này. LỚP 09T4 TRANG 3 TRẦN VĂN A TRẦN VĂN B TRẦN C TRẦN VĂN D TRẦN THỊ E TRẦN F TRẦN G TRẦN H ĐỒ ÁN CẤU TRÚC DỮ LIỆU CẤU TRÚC DỮ LIỆU YÊU CẦU I. Cấu trúc dữ liệu -. lý thuyết đồ thị đều được thể hiện trong cấu trúc dữ liệu. Tuy nhiên cây trong cấu trúc dữ liệu đã tìm được ứng dụng phong phú và hiệu quả trong nhiều giải thuật. Khi phân tích các giải thuật trên cấu. sách. LỚP 09T4 TRANG 8 ĐỒ ÁN CẤU TRÚC DỮ LIỆU - void incc(Tree T): Hàm này để in con cháu của một người. II.4. Hình ảnh chạy chương trình LỚP 09T4 TRANG 9 ĐỒ ÁN CẤU TRÚC DỮ LIỆU Hình 3. Menu của