Giáo trình Cấu trúc dữ liệu và giải thuật

200 7 0
Giáo trình Cấu trúc dữ liệu và giải thuật

Đ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

MỤC LỤC MỤC LỤC CHƢƠNG 1: MỞ ĐẦU 1.1 Giải thuật 1.1.1 Khái niệm giải thuật 1.1.2 Các đặc trưng giải thuật 1.2 Cấu trúc liệu vấn đề liên quan 1.2.1 Cấu trúc liệu giải thuật 1.2.2 Cấu trúc liệu ngơn ngữ lập trình 1.3 Ngôn ngữ diễn đạt giải thuật 1.3.1 Đặt vấn đề 1.3.2 Quy cách cấu trúc chương trình 1.3.3 Ký tự biểu thức 1.3.4 Các câu lệnh CHƢƠNG : THIẾT KẾ VÀ PHÂN TÍCH GIẢI THUẬT 11 2.1 Từ toán đến chương trình 11 2.1.1 Mơ - đun hố việc giải toán 11 2.1.2 Phương pháp tinh chỉnh bước 13 2.2 Phân tích giải thuật 21 2.2.1 Đặt vấn đề 24 2.2.2 Phân tích thời gian thực giải thuật 24 2.3 Bài tập 26 CHƢƠNG : ĐỆ QUY VÀ GIẢI THUẬT ĐỆ QUY 35 3.1 Khái niệm đệ quy 35 3.2 Giải thuật đệ quy chương trình đệ quy 35 3.3 Thiết kế giải thuật đệ quy 37 3.3.1 Hàm N ! 37 3.3.2 Bài toán Tháp Hà Nội 38 3.3.3 Bài toán quân hậu giải thuật quay lui 40 3.4 Hiệu lực đệ quy 44 3.5 Đệ quy quy nạp toán học 45 3.6 Bài tập 48 CHƢƠNG 4: MẢNG VÀ DANH SÁCH 50 4.1 Các khái niệm 50 4.2 Cấu trúc lưu trữ mảng 51 4.3 Lưu trữ danh sách tuyến tính 54 4.4 Ngăn xếp (Stack) 55 4.4.1 Định nghĩa 55 4.4.2 Lưu trữ Stack 55 4.4.3 Các giải thuật PUSH, POP 53 4.4.4 Ứng dụng Stack 58 4.4.5 Stack việc cài đặt thủ tục đệ quy 63 4.5 Hàng đợi (Queue) 66 4.5.1 Định nghĩa 66 4.5.2 Lưu trữ Queue 66 4.5.3 Các giải thuật chèn (INSERT), xoá (DELETE) 67 4.6 Bài tập 69 CHƢƠNG 5: DANH SÁCH MÓC NỐI 73 5.1 Danh sách nối đơn 73 5.1.1 Nguyên tắc 73 5.1.2 Một số giải thuật 74 5.2 Danh sách nối vòng 76 5.2.1 Nguyên tắc 76 5.2.2 Một số giải thuật 77 5.3 Danh sách nối kép 78 5.3.1 Nguyên tắc 78 5.3.2 Một số giải thuật 79 5.4 Ví dụ áp dụng 77 5.4.1 Biểu diễn đa thức 81 5.4.2 Giải thuật cộng hai đa thức 82 5.4.3 Biểu diễn tập hợp 84 5.4.3 Các phép toán 84 5.5 Ngăn xếp Hàng đợi móc nối 82 5.6 Cấu trúc đa danh sách 91 5.6.1 Biểu diễn ma trận thưa 91 5.6.2 Một số giải thuật 92 5.7 Danh sách tổng quát 96 5.7.1 Định nghĩa 96 5.7.2 Biểu diễn danh sách tổng quát 96 5.7.3 Một số giải thuật xử lý danh sách tổng quát 97 5.8 Bài tập 101 5.9 Kiểm tra 102 CHƢƠNG : CÂY 103 6.1 Định nghĩa khái niệm 103 6.2 Cây nhị phân 106 6.2.1 Định nghĩa tính chất 106 6.2.2 Biểu diễn nhị phân 108 6.2.3 Phép duyệt nhị phân 110 6.3 Cây nhị phân nối vòng 115 6.3.1 Khái niệm lưu trữ 115 6.3.2 Các giải thuật 117 6.4 Cây tổng quát 115 6.4.1 Biểu diễn tổng quát 120 6.4.2 Giải thuật duyệt tổng quát 122 6.4.3 Áp dụng 123 6.5 Bài tập 127 6.6 Kiểm tra 129 CHƢƠNG : SẮP XẾP 130 7.1 Đặt vấn đề 130 7.2 Một số phương pháp xếp 130 7.2.1 Sắp xếp lựa chọn (selection - Sort) 132 7.2.2 Sắp xếp thêm dần (Insert - Sort) 133 7.2.3 Sắp xếp bọt (Bubble - Sort) 134 7.2.4 Sắp xếp nhanh (Quick- Sort) 135 7.2.5 Sắp xếp vun đống (Heap –Sort) 137 7.2.6 Sắp xếp hoà nhập (Merge – Sort) 141 7.3 Phân tích đánh giá thuật toán 143 7.4 Bài tập 145 CHƢƠNG 8: TÌM KIẾM 147 8.1 Bài tốn tìm kiếm 147 8.2 Tìm kiếm 147 8.3 Tìm kiếm nhị phân 148 8.4 Cây nhị phân tìm kiếm 150 8.4.1 Định nghĩa 150 8.4.2 Các giải thuật 147 8.5 Bài tập – Tổng kết ôn tập 155 TÀI LIỆU THAM KHẢO 182 CHƢƠNG 1: MỞ ĐẦU 1.1 GIẢI THUẬT 1.1.1 Khái niệm giải thuật Giải thuật (Algorithms): dãy câu lệnh (statements) chặt chẽ rõ ràng xác định trình tự thao tác số đối tượng cho sau số hữu hạn bước thực ta đạt kết mong muốn Để minh hoạ cho khái niệm giải thuật ta xét giải thuật giải tốn tìm phần tử lớn dãy hữu hạn số nguyên Giải thuật gồm bước sau: Bước Đặt giá trị cực đại tạm thời số nguyên dãy Bước So sánh số nguyên tiếp sau với giá trị cực đại tạm thời, lớn giá trị cực đại tạm thời, đặt cực đại tạm thời số nguyên Bước Lặp lại bước số nguyên dãy Bước Cực đại tạm thời thu bước số nguyên lớn dãy 1.1.2 Các đặc trƣng giải thuật Giải thuật có đặc trưng sau:  Đầu vào (Input): Giải thuật nhận liệu đầu vào từ tập  Đầu (Output): Với tập liệu đầu vào, giải thuật đưa liệu tương ứng với lời giải tốn  Tính xác: Các bước giải thuật phải xác định cách xác  Tính hữu hạn: Một giải thuật cần phải tạo giá trị đầu mong muốn sau số hữu hạn ( lớn) bước tập đầu vào  Tính hiệu quả: Mỗi bước giải thuật cần phải thực cách xác khoảng thời gian hữu hạn  Tính tổng quát: Thủ tục cần phải áp dụng cho tốn có dạng mong muốn, khơng phải cho tập đặc biệt giá trị đầu vào Ví dụ 1.1: Cho số nguyên a, b, c Mơ tả giải thuật tìm số lớn số cho Giải: Tuy toán đặt đơn giản, mục đích dùng để giải thích khái niệm giải thuật Giải thuật gồm bước sau: Bước 1: Đặt x := a; Bước 2: Nếu b > x đặt x := b; Bước 3: Nếu c > x đặt x := c; Tư tưởng giải thuật duyệt giá trị số giữ lại giá trị lớn vào biến x Kết thúc giải thuật x cho số nguyên lớn số cho 1.2 CẤU TRÖC DỮ LIỆU VÀ CÁC VẤN ĐỀ LIÊN QUAN 1.2.1 Cấu trúc liệu giải thuật Có thể có lúc nói đến việc giải tốn máy tính người ta ý đến giải thuật, nhiên giải thuật phản ánh phép xử lý, đối tượng để xử lý máy tính điện tử liệu (data), chúng biểu diễn thông tin cần thiết cho toán: Các kiện đưa vào (input), kết trung gian, Bản thân phần tử liệu thường có mối quan hệ với nhau: Với mơ tả kiểu liệu trừu tượng có nhiều cách cài đặt khác để hình thành nhiều cấu trúc liệu khác Ngoài ra, lại biết “tổ chức” theo cấu trúc thích hợp việc thực phép xử lý liệu thuận lợi hơn, đạt hiệu cao Với cấu trúc liệu chọn ta có giải thuật xử lý tương ứng Cấu trúc liệu thay đổi, giải thuật thay đổi theo Như vậy, cấu trúc liệu giải thuật có mối quan hệ mật thiết: Khơng thể nói tới giải thuật mà khơng nghĩ tới giải thuật tác động cấu trúc liệu nào, xét tới cấu trúc liệu phải xét đến liệu cần tác động giải thuật để đưa lại kết mong muốn 1.2.2 Cấu trúc liệu ngơn ngữ lập trình Các ngơn ngữ lập trình ngồi việc cung cấp kiểu liệu bản, cịn cung cấp chế hiệu dễ sử dụng cho phép định nghĩa kiểu liệu (kiểu liệu trừu tượng) theo yêu cầu Việc chọn ngôn ngữ lập trình tức chấp nhận cấu trúc tiền định ngôn ngữ phải biết linh hoạt vận dụng chúng để mô cấu trúc liệu cho cho toán cần giải Tuy nhiên, thực tế việc lựa chọn ngôn ngữ xuất phát từ yêu cầu tốn mà cịn phụ thuộc vào nhiều yếu tố khách quan chủ quan người lập trình Thoạt đầu, ứng dụng máy tính điện tử có phạm vi tốn khoa học kỹ thuật ta gặp cấu trúc liệu đơn giản biến, véctơ, ma trận, ứng dụng mở rộng sang lĩnh vực khác mà ta thường gọi toán phi số (non-numerical proplems), với đặc điểm thể chỗ: khối lượng liệu lớn, đa dạng, biến động; phép xử lý thường không phép số học cấu trúc liệu tiền định ngơn ngữ lập trình cung cấp thường không đủ đặc trưng cho mối quan hệ liệu Vì vậy, việc sâu nghiên cứu cấu trúc liệu phức tạp quan tâm giáo trình Bài tốn phi số đơi với cấu trúc liêu xuất phép toán tác động cấu trúc liệu này, phép tốn có tác dụng khác cấu trúc liệu Có phép hữu hiệu cấu trúc lại tỏ không hữu hiệu cấu trúc khác Cách biểu diễn cấu trúc liệu nhớ gọi cấu trúc lưu trữ Đó cách cài đặt cấu trúc máy tính điện tử sở cấu trúc lưu trữ mà ta thực phép xử lý Có thể có nhiều cấu trúc lưu trữ khác cho cấu trúc liệu; có cấu trúc liệu khác mà thể nhớ kiểu cấu trúc lưu trữ Khi đề cập đến cấu trúc lưu trữ ta cần phân biệt cấu trúc lưu trữ tương ứng với nhớ trong- lưu trữ trong, hay ứng với nhớ ngồi- lưu trữ ngồi 1.3 NGƠN NGỮ DIỄN ĐẠT GIẢI THUẬT 1.3.1 Đặt vấn đề Để diễn đạt giải thuật mà ta trình bày giáo trình, ta cần ngơn ngữ diễn đạt Ta lựa chọn ngơn ngữ lập trình C, Pascal, v.v , ta gặp hạn chế sau: - Phải luôn tuân thủ quy tắc chặt chẽ cú pháp ngơn ngữ đó, khiến cho việc trình bày giải thuật cấu trúc liệu có thiên hướng nặng nề, gị bó - Phải phụ thuộc vào cấu trúc liệu tiền định ngơn ngữ, nên có lúc đầy đủ ý nghĩa cấu trúc mà ta muốn biểu đạt - Ngôn ngữ chọn không hẳn người ưa thích muốn sử dụng Vì vậy, ta dùng ngơn ngữ “thơ hơn”, có đủ khả diễn đạt giải thuật cấu trúc đề cập đến (mà ta giới thiệu tiếng Việt), với mức độ linh hoạt định, khơng q gị bó, khơng câu nệ nhiều cú pháp gần gũi với ngôn ngữ chuẩn, để cần thiết dễ dàng chuyển đổi Ta tạm gọi tên: “ngơn ngữ tựa PASCAL” 1.3.2 Quy cách cấu trúc chƣơng trình Mỗi chương trình gắn tên để phân biệt, tên viết chữ in hoa, có thêm dấu gạch nối khoá Program Ví dụ 1.2: Program NHAN_MA_TRAN Độ dài tên khơng hạn chế Sau tên kèm theo lời thuyết minh (ở ta quy ước dùng tiếng Việt) để giới thiệu tóm tắt nhiệm vụ giải thuật số chi tiết cần thiết Phần thuyết minh đặt hai dấu { …… } Chương trình bao gồm nhiều đoạn (bước), đoạn phân biệt số thứ tự, kèm theo lời thuyết minh 1.3.3 Ký tự biểu thức Ký tự dùng giống ngôn ngữ chuẩn, nghĩa gồm: - 26 chữ latinh in hoa in thường - 10 chữ số thập phân - Các dấu phép toán số học +, -, *, /,  (luỹ thừa) - Các dấu phép toán quan hệ , ≤, ≥, ≠ - Giá trị logic: true, false - Dấu phép toán logic: and, or, not - Tên biến: dãy chữ chữ số, bắt đầu chữ - Biến số có dạng: A[i], B[i, j], v.v Còn biểu thức thứ tự ưu tiên phép toán biểu thức theo quy tắc PASCAL hay ngôn ngữ chuẩn khác 1.3.4 Các câu lệnh Các câu lệnh chương trình viết cách dấu ; chúng bao gồm: 1- Câu lệnh gán Có dạng V := E; Với V tên biến, tên hàm; E biểu thức Ở cho phép dùng phép gán chung Ví dụ: A :=B := 0.1; 2- Câu lệnh ghép Có dạng: begin S1; S2; …; Sn; end; Với Si (i = 1, , n) câu lệnh Nó cho phép ghép nhiều câu lệnh lại để coi câu lệnh 3- Câu lệnh điều kiện Có dạng: if B then S; Với B biểu thức logic, S câu lệnh khác Có thể diễn tả sơ đồ true B S false if B then S1 else S2; true B S1 false S2 4- Câu lệnh tuyển Có dạng: Case B1: S1; … Bn: Sn; Else: Sn+1; End case; Với Bi (i = 1, 2, , n) điều kiện, Si (i = 1, 2, , n) câu lệnh Câu lệnh cho phép phân biệt tình xử lý khác điều kiện khác mà dùng tới câu lệnh if- then- else lồng Có thể biểu diễn sơ đồ: B1 true false B2 true S1 false… Bn true S2 S2 false Sn+1  Vài điểm linh động Else khơng có mặt Si (i = 1, 2, , n) thay dãy câu lệnh thể dãy xử lý có điều kiện Bi mà khơng cần phải đặt begin end 5- Câu lệnh lặp  Với số lần lặp biết trước For i := m to n S; Nhằm thực câu lệnh S với i lấy giá trị nguyên từ m tới n ( n >= m) với bước nhảy tăng 1; Hoặc: For i:= n downto m S; Tương tự câu lệnh với bước nhảy giảm  Với số lần lặp trước While B S; true B S false Chừng mà B có giá trị true thực S Hoặc: Repeat S until B; Lặp lại S B có giá trị true (S dãy lệnh) S B true false 6- Câu lệnh chuyển Goto n; (n số hiệu bước chương trình) Thường người ta hạn chế việc sử dụng goto Tuy nhiên, với mục đích diễn đạt cho tự nhiên, chừng mực ta sử dụng 7- Câu lệnh vào, Có dạng: Read (); Write (); Các biến danh sách cách dấu phẩy Dòng ký tự dãy ký tự đặt hai dấu nháy „ „ 8- Câu lệnh kết thúc chương trình End 1.3.4 Chương trình  Chương trình hàm Có dạng: Function () S1; S2; … ; Sn; Return ; Câu lệnh kết thúc chương trình return thay cho end  Chương trình thủ tục Procedure () S1; S2; … ; Sn; Return ; Lời gọi chương trình hàm thể tên hàm danh sách tham số thực sự, nằm biểu thức Còn với chương trình thủ tục lời gọi thể câu lệnh call có dạng: Call () Chú ý: Trong chương trình diễn đạt số giải thuật phần khai báo liệu bỏ qua Nó thay phần mô tả cấu trúc liệu ngôn ngữ tự nhiên, mà ta nêu trước bước vào giải thuật Như vậy, nghĩa chương trình nêu đoạn thể phép xử lý theo giải thuật định, cấu trúc liệu mơ tả trước đó, ngôn ngữ tự nhiên dt *p,*q,*c,*k; p=a; q=b; c=NULL; while((p!= NULL)&&(q!=NULL)) { if(p->somu==q->somu) { if((p->heso-q->heso)!=0) c=Bosung(c,p->heso-q->heso,p->somu); p=p->link; q=q->link; } else if(p->somu>q->somu) { c=Bosung(c,p->heso,p->somu); p=p->link; } else { c=Bosung(c,-q->heso,q->somu); q=q->link; } } if(q==NULL) while(p!=NULL) { c=Bosung(c,p->heso,p->somu); p=p->link; } else while(q!=NULL) { c=Bosung(c,-q->heso,q->somu); q=q->link; } return c; } dt *tich(dt*a,dt*b) { dt *p,*q,*c,*k; p=a; c=NULL; while(p!= NULL) { q=b; while(q!=NULL) { k=c; while((k!=NULL)&&(k->somu!=p->somu+q->somu)) k=k->link; if(k!=NULL) k->heso=k->heso+p->heso*q->heso; else c=Bosung(c,p->heso*q->heso,p->somu+q->somu); q=q->link; } p=p->link; } return c; } //Dao ham bac nhat dt *Dao_ham(dt*a) { dt *p,*c; p=a; c=NULL; while(p!= NULL) { if(p->somu>0)c=Bosung(c,p->heso*p->somu,p->somu-1); p=p->link; } return c; } //Nguyen ham dt *Nguyen_ham(dt*a) { dt *p,*c; p=a; c=NULL; while(p!= NULL) { c=Bosung(c,p->heso/(p->somu+1),p->somu+1); p=p->link; } return c; } void main() { dt *a,*b,*c; int chon; float x; { clrscr(); printf("\n1 Dao ham bac nhat"); printf("\n2 Nguyen ham"); printf("\n3 Tinh gia tri da thuc"); printf("\n4 Tong hai da thuc"); printf("\n5 Hieu hai da thuc"); printf("\n6 Tich hai da thuc"); printf("\n7 Ket thuc chuong trinh"); printf("\nChon chuc nang(1->7):"); scanf("%d",&chon); switch(chon) { case 1: printf("\nNhap da thuc can tinh:"); a=nhap(); b=Dao_ham(a); printf("\nDao ham cua da thuc la:");hienthi(b); getch(); break; case 2: printf("\nNhap da thuc can tinh:"); a=nhap(); b=Nguyen_ham(a); printf("\nNguyen ham cua da thuc la:");hienthi(b); getch(); break; case 3: printf("\nNhap da thuc can tinh:"); a=nhap(); printf("x=");scanf("%f",&x); printf("\nGia tri cua da thuc tai x=%5.2f la:%5.2f",x,Gia_tri(a,x)); getch(); break; case 4: printf("\nNhap da thuc thu nhat:"); a=nhap(); printf("\nNhap da thuc thu hai:"); b=nhap(); c=tong(a,b); printf("Tong hai da thuc la:");hienthi(c); getch(); break; case 5: printf("\nNhap da thuc thu nhat:"); a=nhap(); printf("\nNhap da thuc thu hai"); b=nhap(); c=hieu(a,b); printf("Hieu hai da thuc la:");hienthi(c); getch(); break; case 6: printf("\nNhap da thuc thu nhat:"); a=nhap(); printf("\nNhap da thuc thu hai"); b=nhap(); c=tich(a,b); printf("Tich hai da thuc la:");hienthi(c); getch(); break; case 7:exit(1); } }while (chon!=7); } CÀI ĐẶT ĐA DANH SÁCH BIẺU DIỄN MA TRẬN THƢA Chương trình cài đặt cấu trúc đa danh sách biểu diễn ma trận thưa, nhập vào từ bàn phím ma trận thưa, tính tích hai ma trận in ma trận kết hình Chƣơng trình minh hoạ #include #include #include struct node { node *left,*up; int v,r,c; }; node *arow[10],*acol[10],*brow[10],*bcol[10],*crow[10],*ccol[10]; struct mt { int m,n,k; }; void input(mt &A) { printf("So hang:");scanf("%d",&A.m); printf("So cot:");scanf("%d",&A.n); printf("So phan tu khac khong:");scanf("%d",&A.k); } void createA(mt A) { int i,value,row,col; node *p,*q; for(i=1;ic=0; arow[i]->left=arow[i]; } for(i=1;ir=0; acol[i]->up=acol[i]; } for(i=1;iv=value; p->r=row; p->c=col; q=arow[p->r]; while(p->cleft)->c) q=q->left; p->left=q->left; q->left=p; q=acol[p->c]; while(p->rup)->r) q=q->up; p->up=q->up; q->up=p; } } void createB(mt B) { int i,value,row,col; node *p,*q; for(i=1;ic=0; brow[i]->left=brow[i]; } for(i=1;ir=0; bcol[i]->up=bcol[i]; } for(i=1;iv=value; p->r=row; p->c=col; q=brow[p->r]; while(p->cleft)->c) q=q->left; p->left=q->left; q->left=p; q=bcol[p->c]; while(p->rup)->r) q=q->up; p->up=q->up; q->up=p; } } void display(node *q) { node *p; p=q->left; while(p!=q) { printf("%3d cot %d;",p->v,p->c); p=p->left; } } void ht(mt A) { int i; for(i=1;ileft=crow[i]; } for(i=1;ir=0; ccol[i]->up=ccol[i]; } for(i=1;iup; result=0; while((p->c!=0)&&(q->r!=0)) if(p->c>q->r) p=p->left; else if(p->cr) q=q->left; else { result+=p->v*q->v; p=p->left; q=q->up; } if(result!=0) { t=(node*)calloc(1,sizeof(node)); t->v=result; t->r=i; t->c=j; t->left=crow[i]->left; t->up=ccol[j]->up; crow[i]->left=t; ccol[j]->up=t; } } } else printf("Hai ma tran khong cung kich thuoc"); } void main() { mt A,B,C; clrscr(); printf("\nNhap kich thuoc ma tran A\n"); input(A); printf("\nNhap gia tri cac phan tu khac khong cua A\n"); createA(A); printf("\nNhap kich thuoc ma tran B\n"); input(B); printf("\nNhap gia tri cac phan tu khac khong cua B\n"); createB(B); multi(A,B,C); printf("\nTich hai ma tran\n"); ht(C); getch(); } CÀI ĐẶT CÂY NHỊ PHÂN TÌM KIẾM Chương trình cài đặt nhị phân tìm kiếm kiểu móc nối, có nút chứa khố số ngun nhập từ bàn phím Chương trình gồm chức sau: a) Tạo nhị phân b) Duyệt nhị phân theo thứ tự trước giải thuật duyệt không đệ qui c) Duyệt nhị phân theo thứ tự giải thuật duyệt không đệ qui d) Duyệt nhị phân theo thứ tự sau giải thuật duyệt không đệ qui e) Bổ sung nút vào f) Loại bỏ nút có khố x cho trước g) Đếm số nút h) Tìm nút có khố tương ứng có giá trị lớn i) Tráo đổi tất nút trái phải Chƣơng trình minh hoạ #include”stdio.h” #include”conio.h” #include”alloc.h” typedef struct tree { int info; tree *lptr,*rptr; }; //Tao nut moi co info=x tree *taonut(int x) { tree *p; p = (tree*)malloc(sizeof(tree)); p->info = x; p->lptr = p->rptr = NULL; return p; } //Bo sung nut co info=x vao cay nhi phan tim kiem tree *Bosung(tree*t,int x) { tree *p,*r,*q; r = taonut(x); if(t==NULL) t = r; else { q = t; while(q!=NULL) { if(q->info==x) { printf(“\n nut da ton tai”); return t; } else if(x < q->info) { p = q; q = q->lptr; } else { p = q; q = q->rptr; } } if (x < p->info) p->lptr = r; else p->rptr = r; return t; } } //Tao cay nhi phan tim kiem tree *taocay() { int x; char ch; tree *t; t = NULL; { printf(“\nnhap khoa x=”);scanf(“%d”,&x); t = Bosung(t,x); printf(“Continue ? Y/N:”);fflush(stdin); scanf(“%c”,&ch); }while((ch!=‟N‟)&&(ch!=‟n‟)); return t; } //Loai bo nut co info=x tren cay nhi phan tim kiem tree *Loaibo(tree *t, int x) { tree *p, *q, *s,*r; p = t; while ((p!= NULL) && (p->info!=x)) { r = p; if(xinfo) p = p->lptr; else p = p->rptr; } if (p==NULL) printf(“khong co nut can loai bo”); else { if((p==t)&&(p->lptr==NULL)&&(p->rptr==NULL)) t=NULL; else { while((p->lptr!=NULL)||(p->rptr!=NULL)) { if(p->lptr!=NULL) { q=p->lptr; while(q->rptr!=NULL) { r=q; q=q->rptr; } } else { q=p->rptr; while(q->lptr!=NULL) { r=q; q=q->lptr; } } p->info=q->info; p=q; } free(p); } return t; } } void push(tree *s[30],int *top,tree *x) { if(*top < 30) { *top=*top+1; s[*top]=x; } else printf(“\n stack tran”); } tree *pop(tree *s[30],int *top) { if(*toplptr); printf(“%5d”,t->info); duyetdq(t->rptr); } } //Duyet cay nhi phan tim kiem theo thu tu truoc ko de qui void duyettruoc(tree *t) { tree *p; tree *s[30]; int top=0; if(t==NULL) printf(“\n cay rong:”); else { push(s,&top,t); while(top>0) { p=pop(s,&top); while(p!=NULL) { printf(“%5d”,p->info); if(p->rptr!=NULL) push(s,&top,p->rptr); p=p->lptr; } } } } //Duyet cay nhi phan tim kiem theo thu tu giua khong de qui void duyetgiua(tree *t) { tree *p; tree *s[30]; int top=0,tt; if(t==NULL) printf(“\n cay rong:”); else { p=t; { while(p!=NULL) { push(s,&top,p); p=p->lptr; } if(top>0) { p=pop(s,&top); printf(“%5d”,p->info); p=p->rptr; tt=1; } else tt=0; }while(tt==1); } } //Dem so nut la tren cay nhi phan tim kiem int demla(tree *t) { tree *p; tree *s[30]; int top=0, d=0; if(t!=NULL) { push(s,&top,t); while(top>0) { p=pop(s,&top); while(p!=NULL) { if(p->lptr==p->rptr) d++; if(p->rptr!=NULL) push(s,&top,p->rptr); p=p->lptr; } } } return d; } //Duyet cay nhi phan tim kiem khong de qui theo thu tu sau void duyetsau(tree *t) { int i=0,top=0,d[30]; tree *s[30]; tree *p; if(t==NULL) printf(“\n cay rong “); else { p=t; while(1) { while(p!=NULL) { push(s,&top,p); d[top]=1; p=p->lptr; } while(d[top]info); if(top==0) return ; } p=s[top]->rptr; d[top]=-d[top]; } } } //Dem so nut tren cay nhi phan tim kiem int demnut(tree *t) { if(t==NULL) return 0; else return 1+demnut(t->lptr)+demnut(t->rptr); } //Trao doi cay trai va cay phai void trao(tree *t) { tree *tg; if(t!=NULL) { trao(t->lptr); trao(t->rptr); tg=t->lptr; t->lptr=t->rptr; t->rptr=tg; } } //Tim nut co info lon nhat int Max(tree *t) { tree *p; p=t; if(p==NULL) printf(“Cay rong”); else while(p->rptr!=NULL) p=p->rptr; return p->info; } void main() { clrscr(); tree *t; int x,chon; { clrscr(); printf(“1 Tao cay\n”); printf(“2 Duyet cay theo thu tu truoc khong de qui\n”); printf(“3 Duyet cay theo thu tu giua khong de qui\n”); printf(“4 Duyet cay theo thu tu sau khong de qui\n”); printf(“5 Bo sung nut vao cay\n”); printf(“6 Loai bo nut khoi cay\n”); printf(“7 Dem so nut tren cay\n”); printf(“8 Tim nut co gia tri lon nhat tren cay\n”); printf(“9 Trao doi cay trai va cay phai\n”); printf(“Chon cong viec(1->9):”);scanf(“%d”,&chon); switch (chon) { case 1: clrscr(); printf(“\nNhap gia tri khoa cho cac nut tren cay”); t=taocay(); break; case 2: clrscr(); printf(“\nCac nut duyet cay theo thu tu truoc”); duyettruoc(t); getch(); break; case 3: clrscr(); printf(“\nCac nut duyet cay theo thu tu giua”); duyetgiua(t); getch(); break; case 4: clrscr(); printf(“\nCac nut duyet cay theo thu tu sau”); duyetsau(t); getch(); break; case 5: clrscr(); printf(“Gia tri khoa cua nut can bo sung x=”); scanf(“%d”,&x); Bosung(t,x); printf(“\nCac nut tren cay sau bo sung “); printf(“duoc duyet theo thu tu giua\n”); duyetdq(t); getch(); break; case 6: clrscr(); printf(“Gia tri khoa cua nut can loai bo x=”); scanf(“%d”,&x); Loaibo(t,x); printf(“\nCac nut lai sau loai bo “); printf(“duoc duyet theo thu tu giua\n”); duyetdq(t); getch(); break; case 7: clrscr(); printf(“\nSo nut tren cay:%5d”,demnut(t)); getch(); break; case 8: clrscr(); printf(“\nKhoa lon nhat tren cay:%5d”,Max(t)); getch(); break; case 9: clrscr(); printf(“\nCay sau trao doi “); printf(“traiphai duyet theo thu tu giua\n”); trao(t); duyetdq(t); getch(); break; } }while(chon!=10); } tài liệu tham khảo [1] Đỗ Xuân Lôi Cấu trúc liệu giải thuật Nhà xuất Thống kê 2001 [2] Đinh Mạnh Tường Cấu trúc liệu & giải thuật Nhà xuất Khoa học kỹ thuật 2003 [3] ROBERT SEDGEWICK Cẩm nang thuật toán Nhà xuất Khoa học kỹ thuật 2001 Vol Vol [4] LARRY NYHOFF, SANFORD LEEDSTMA Người dịch Lê Minh Trung Lập trình nâng cao Pascal với cấu trúc liệu Nhà xuất Đà Nẵng 2002.Vol.1 Vol.2 ... cấu trúc liệu giải thuật có mối quan hệ mật thiết: Khơng thể nói tới giải thuật mà khơng nghĩ tới giải thuật tác động cấu trúc liệu nào, xét tới cấu trúc liệu phải xét đến liệu cần tác động giải. .. đặc trƣng giải thuật Giải thuật có đặc trưng sau:  Đầu vào (Input): Giải thuật nhận liệu đầu vào từ tập  Đầu (Output): Với tập liệu đầu vào, giải thuật đưa liệu tương ứng với lời giải tốn ... cứu cấu trúc liệu phức tạp quan tâm giáo trình Bài tốn phi số đơi với cấu trúc liêu xuất phép toán tác động cấu trúc liệu này, phép tốn có tác dụng khác cấu trúc liệu Có phép hữu hiệu cấu trúc

Ngày đăng: 26/12/2021, 17:27

Tài liệu cùng người dùng

  • Đang cập nhật ...

Tài liệu liên quan