Tài liệu tham khảo công nghệ thông tin Báo cáo bài tập thực hành môn cấu trúc dữ liệu và giải thuật
Trang 1BÁO CÁO BÀI TẬP THỰC HÀNH MÔN CẤU TRÚC DỮ LIỆU & GIẢI THUẬT
Bài 1 Viết chương trình con bằng gaiir thuật đệ qui để thực hiện các công việc sau:
else if(n<=1) return 1;
else return n*giaithua(n-1);
Trang 2else if(a>b) return UCLN(a-b,b);
else return UCLN(a,b-a);
Trang 3DS.n=0;
}
//them vao dau sanh sach
void ThemDau(DanhSach &DS,int phantu)
//them vao cuoi danh sach
void ThemCuoi(DanhSach &DS,int phantu)
{
DS.n++;
DS.PhanTu[DS.n]=phantu;
}
//nhap va luu tru theo thu tu
void Nhap(DanhSach &DS)
//nhap va luu tru nguoc voi thu tu nhap
void NhapNguoc(DanhSach &DS)
Trang 4Bài 3 Tương tự bài tập 1, nhưng cài đặt bằng con trỏ.
//hien thi danh sach
void Display(List &L)
Trang 5void Add_LIFO(List &L,int phantu)
//vao truoc ra sau (them vao cuoi danh sach)
void Add_FILO(List &L,int phantu)
//nhap va luu tru theo thu tu nhap vao hoac nguoc lai
void Add_And_Insert(List &L)
{
char ch='1';int sx=0;
cout<<"Ban muon sap xep day so theo thu tu nao ?";
cout<<"\n Nhan phim '1' neu theo thu tu nhap\n Nhan phim bat ky neu nguoc
lai";cin>>sx;
cout<<"Nhap vao mot day so nguyen: ";
while(int(ch)>=48 && int(ch)<= 57)
- Danh sách được cài đặt bằng mảng(DS đặc)
- Danh sách được cài đặt bằng con trỏ(DS liên kết)
Trang 6Node *tam1=new Node;
Node *tam2=new Node;
Trang 7Node *tam=new Node;
//tim vi tri thich hop
if(tam->PhanTu>=pt && tam->Right->PhanTu<=pt)
Trang 8//them vao vi tri k trong sanh sach
void ThemK(DanhSach &DS,int phantu,int k)
//tim vi tri thich hop va them vao sanh sach
void Them(DanhSach &DS,int phantu)
// Doi voi danh sach duoc luu tru dac
-void NhapVaSapXep(DanhSach &DS)
{
char ch='1';
int i=0;
cout<<"Nhap vao mot day so nguyen: ";
while(int(ch)>=48 && int(ch)<= 57)
Trang 9//xoa phan tu tai vi tri K
void XoaK(DanhSach &DS,int k)
//xoa nhung phan tu trung nhau trong danh sach
void XoaPTTrung(DanhSach &DS)
// - doi voi danh sach luu tru bang con tro
-void Delete(List &L)
Trang 10Bài 9 Viết chương trình con đếm số lần xuất hiện của mỗi ký tự trong 1 chuỗi ký tự.
void Dem(DanhSach &DS)
// - doi voi danh sach luu tru bang con tro
-void Count(List &L)
Trang 11// - doi voi danh sach luu tru bang con tro
-void Change(List &L)
Trang 12Bài 11 vctc nhận vào từ bàn phím 1 dãy số nguyên, lưu trữ nó trong 1 danh sách có thứ tự tăng không có 2 phần tử trùng nhau, theo cách sau: Với mỗi phần tử được nhập vào chương trình con phải tìm kiếm xem nó có trong danh sách chưa? Nếu chưa có thì xen nó vào danh sách cho đúng thứ tự vctc trên trường hợp danh sách được cài đặt bằng mảng và cài đặt bằng con trỏ.
//them vao vi tri k trong sanh sach
void ThemK(DanhSach &DS,int phantu,int k)
//tim vi tri thich hop va them vao sanh sach
void Them(DanhSach &DS,int phantu)
{
if(DS.n==0) ThemDau(DS,phantu);
else if(phantu<DS.PhanTu[1]) ThemDau(DS,phantu);
else if(phantu>DS.PhanTu[DS.n]) ThemCuoi(DS,phantu);
//them vao vi tri thich hop trong danh sach
void Add(List &L,int phantu)
{
if(Emty(L)) Add_LIFO(L,phantu);
else if(phantu <= L.First->Right->Info) Add_LIFO(L,phantu);//them dau
else if(phantu >= L.Last->Left->Info) Add_FILO(L,phantu); //them cuoi
Trang 13Bài 12 Viết chương trình con trộn 2 danh sách liên kết chứa các số nguyên theo thứ
tự tăng để được 1 danh sách cũng có thứ tự
void TronDS(DanhSach &A,DanhSach &B,DanhSach &C)
// - doi voi danh sach luu tru bang con tro
-void Combine(List &A,List &B,List &C)
Trang 14Bài 13 Viết chương trình con xóa khỏi danh sách lưu trữ cá số nguyên các phần tử
là là số nguyên lẻ,cũng trong 2 trường hợp là cài đặt bằng mảng và con trỏ.
void XoaLe(DanhSach &DS)
// - doi voi danh sach luu tru bang con tro
-void Del_(List &L)
Trang 15// - doi voi danh sach luu tru bang con tro
-void Tach2(List &P,List &Q,List &R)
//them vao vi tri thich hop trong danh sach
void Add(List &L,int hs,int sm)
Trang 16Bài 16 Để lưu trữ 1 số nguyên lớn ta có thể dùng danh sách liên kết chứa các chữ
số của nó Hãy tìm cách lưu trữ các chũa só của 1 số nguyên lớn theo ý tưởng trên sap cho viêc cộng 2 số nguyên lớn là dễ dàng thực hiện Viết chương trình con cộng 2 số nguyên lớn.
//cong hai so nguyen lon
void Cong(List &A,List &B,List &C)
Trang 17//hien thi ngan xep
void Display(Stack &S)
Trang 18//vao sau ra truoc (them vao dau danh sach)
void Push(Stack &S,int phantu)
//lay mot phan tu o dinh ngan xep
int Pop(Stack &S)
//doi 1 so thap phan sang nhi phan
void Thap2NhiPhan(Stack &S,long n)
Trang 19Bài 19 vctc kiểm tra 1 chuỗi dấu ngoặc đúng (chuỗi dấu ngoặc đúng là chuỗi dấu
mở đóng khớp nhau như trong biểu thức toán học)
Bài 20 vctc kiểm tra 1 biểu thức được cho dưới dạng hậu tố có chuẩn không? (thông báo lỗi nếu không chuẩn ) giả sử mỗi toán hạng là 1 ký tự.
//nhap vao chuoi hau to
void Add_And_Insert(Stack &S)
//kiem tra chuoi hau to
void Check(Stack &S,Stack &K)
{
char c;int i;
while(!Emty(S)) //chuyen chuoi hau to ve dang 1,0
{ //toan hang(0,1, ,9) =1, toang tu(+-*/)=0
Trang 20cout<<"\ntoan hang(0,1, ,9) =1, toang tu(+-*/)=0";
Display(K);
//kiem tra Node N,N+1,N+2 co dang 110 hay ko?
//neu co thi xoa N+1va N+2
cout<<"\nChuoi hau to nhap vao la dung";
else cout<<"\nChuoi hau to vua nhap vao sai";getch();
}
Bài 21 Cho 1 Stack S Hãy viets chương trình con thực hiện các công việc sau:
- Đếm số phần tử của Stack S
- Xuất nội dung phần tử thứ n của Stack S
- Xuất nội dung của Stack S
- Loại Phần tử thứ n của Stack S.
Trong các chương trình con trên yêu cầu bảo toàn thứ tứ các phần tử của Stack S.
//hien thi ngan xep
void Display(Stack &S)
Trang 21int Count(Stack &S)
{
Stack K;Create(K);char c;int check=0;
while(!Emty(S)) //dem so phan tu cua ngan xep
//lay noi dung cua phan tu thu n
Stack K;Create(K);int kt=n;char c;
while(kt!=0)
{c=Pop(S); Push(K,c); kt ;}
cout<<"Phan tu thu "<<n<<"= "<<c;getch();
//tra lai ngan xep ban dau
//lay noi dung cua phan tu thu n
Stack K;Create(K);int kt=n;char c,tmp;
while(kt!=0)
{
c=Pop(S);
Trang 22c=Pop(K);//bo di phan tu thu n
//tra lai ngan xep sau khi xoa
Trang 23int Emty(Queue &Q)
{
return(Q.First->Right==Q.Last);
}
//hien thi ngan xep
void Display(Queue &Q)
//vao sau ra truoc (them vao dau danh sach)
void Push(Queue &Q,char phantu)
//lay mot phan tu o dinh hang doi
char Pop(Queue &Q)
//nhap vao cac phan tu cua ngan xep
void Add(Queue &Q)
{
char ch='1';
Trang 24cout<<"\nNhap vao cac phan tu cua hang doi, nhan ENTER de ket thuc\n\t: ";
Queue K;Create(K);char c;int check=0;
while(!Emty(Q)) //dem so phan tu cua hang doi
//lay noi dung cua phan tu thu n
Queue K;Create(K);int kt=0;char c,tam;
while(!Emty(Q))
{c=Pop(Q); Push(K,c); kt++;if(kt==n)tam=c;}
cout<<"Phan tu thu "<<n<<"= "<<tam;getch();
//tra lai ngan xep ban dau
Trang 25getch();return;
}
//lay noi dung cua phan tu thu n
Queue K;Create(K);int kt=n-1;char c,tmp;
Trang 26Bài 23 Viết chương trình con đảo ngược 1 stack.
//dao nguoc mot stack
void DaoNguoc(Stack &S)
Trang 27}
Bài 24 Viết chương trình con đảo ngược 1 Queue.
Bài 25 Dùng Stack và Queue để kiểm tra 1 chuỗi kí tự có đới xứng không?
Bài 26 Ta có thể cài đặt ngăn xếp trong cùng 1 mảng, gọi là ngăn xếp 2 đầu hoạt động của 2 ngăn xếp này theo sơ đồ sau:
Đáy ngăn xếp 1
Đỉnh(TOP) ngăn xếp 1
Phần mảng còn trống
Đỉnh(TOP) ngăn xếp 2
Đáy ngăn xếp 2 Hãy viết chương trình con cần thiết đẻ cài đặt ngăn xếp 2 đầu.
Trang 2831 29
43 36
54
65
78 59
31 29
43 36
15
Trang 2931 29
43 36
15
45
54 31
29
43 36
15
45
65
78 59
55
Trang 30Câu38: Vẽ lại cây tìm kiếm nhị phân khi lần lượt
31 29
20
43 36
54
78 59
31
36
Trang 31Xóa nút 54
Bài 39
Dựng cây tìm kiếm nhị phân ứng với dãy khóa : HAIPHONG,
CANTHO, NHATRANG, DALAT, HANOI, ANGIANG, MINHHAI, HUE,
SAIGON, VINHLONG
Đường đi trên cây khi tìm kiếm khóa: DONGTHAP
Đường đi là những mũi tên đậm
59
78 31