Tải bản đầy đủ (.doc) (31 trang)

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

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (188.97 KB, 31 trang )

Bài bá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Á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:
- Tính n!
- Tính S=1+2+3+…+n
- Tính s=1+3+5+…+(2k+1) với 2k+1<=n
- Đổi số nguyên n hệ 10 sang hệ 2
- Đảo ngược
double giaithua(int n)
{
if(n<0) return 0;
else if(n<=1) return 1;
else return n*giaithua(n-1);
}
double S1(int n)
{
if(n<=0) return 0;
else return n+S1(n-1);
}
double S2(int n)
{
if(n<=0) return 0;
else if(n%2==0)
return S2(n-1);
else return n+S2(n-2);
}
void he10to2(long n)
{
if(n==0) return;
he10to2(n/2);
if(n%2==0) cout<<"0";


else cout<<"1";
}
void DaoNguoc(long n)
{
if(n==0)return;
else
{
cout<<n%10;
DaoNguoc(n/10);
}
}
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 1
Bài báo cáo bài tập thực hành môn : Cấu Trúc Dữ Liệu & Giải Thuật.
int fibonaci(int n)
{
if(n<=2)return 1;
else return fibonaci(n-1)+fibonaci(n-2);
}
int UCLN(int a,int b)
{
if(a==b) return a;
else if(a>b) return UCLN(a-b,b);
else return UCLN(a,b-a);
}
float HaiMuN(int n)
{
if(n<0) return 1/HaiMuN(-n);
if(n==0)return 1;
else return 2*HaiMuN(n-1);
}

float XmuY(int x,int y)
{
if(y<0) return 1/XmuY(x,-y);
if(x==0)return 0;
else if(y==0)return 1;
else return x*XmuY(x,y-1);
}
Bài 2. Viết hàm khai báo cac chương trình con cài đặt danh sách mảng. Dùng các
chương trình con này để:
- Chương trình con nhận một dãy các số nguyên nhập từ bàn phím, lưu trữ nó
trong danh sách theo thứ tự nhập vào.
- Chương trình con nhận một dãy các số nguyên nhập từ bàn phím, lưu trữ nó
trong danh sách thứ tự ngược với thú tự nhập vào.
- Viết chương trình con in ra màn hình các phần tử trong danh sách theo thứ tự
của nó trong danh sách.
struct DanhSach
{
int PhanTu[100];
int n; //so phan tu cua danh sach
};
void TaoRong(DanhSach &DS)
{
DS.n=0;
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 2
Bài báo cáo bài tập thực hành môn : Cấu Trúc Dữ Liệu & Giải Thuật.
}
//them vao dau sanh sach
void ThemDau(DanhSach &DS,int phantu)
{
for(int i=DS.n;i>=1;i--)

DS.PhanTu[i+1]=DS.PhanTu[i];
DS.PhanTu[1]=phantu;
DS.n++;
}
//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)
{
char str[99];
cout<<"\nNhap vao mot day so nguyen";
gets(str);
for(int i=1;i<=strlen(str);i++)
ThemCuoi(DS,int(str[i-1])-48);
}
//nhap va luu tru nguoc voi thu tu nhap
void NhapNguoc(DanhSach &DS)
{
char str[99];
cout<<"\nNhap vao mot day so nguyen";
gets(str);
for(int i=1;i<=strlen(str);i++)
ThemDau(DS,int(str[i-1])-48);
}
void Xuat(DanhSach DS)
{

for(int i=1;i<=DS.n;i++)
cout<<DS.PhanTu[i];
getch();
}
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 3
Bài bá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 3. Tương tự bài tập 1, nhưng cài đặt bằng con trỏ.
struct Node
{
int Info;
Node *Left;
Node *Right;
};
struct List
{
Node *First;
Node *Last;
int n;
};
void Create(List &L)
{
L.First=new Node;
L.Last= new Node;
L.First->Left=NULL;
L.First->Right=L.Last;
L.Last->Left=L.First;
L.Last->Right=NULL;
L.n=0;
}
int Emty(List &L)

{
return(L.First->Right==L.Last);
}
//hien thi danh sach
void Display(List &L)
{
cout<<"\n\n";
Node *N=new Node;
N=L.First->Right;
for(int i=1;i<=L.n;i++)
{
cout<<N->Info;
N=N->Right;
}
}
//vao sau ra truoc (them vao dau danh sach)
void Add_LIFO(List &L,int phantu)
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 4
Bài báo cáo bài tập thực hành môn : Cấu Trúc Dữ Liệu & Giải Thuật.
{
Node *N=new Node;
N->Info=phantu;
N->Left=L.First;
N->Right=L.First->Right;
L.First->Right->Left=N;
L.First->Right=N;
L.n++;
}
//vao truoc ra sau (them vao cuoi danh sach)
void Add_FILO(List &L,int phantu)

{
Node *N=new Node;
N->Info=phantu;
N->Right=L.Last;
N->Left=L.Last->Left;
L.Last->Left->Right=N;
L.Last->Left=N;
L.n++;
}
//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)
{
ch=getch();cout<<ch;
if(int(ch) >= 48 && int(ch) <= 57)
if(sx==1) Add_FILO(L,int(ch)-48);
else Add_LIFO(L,int(ch)-48);
}
}
Bài 4. Viết chương trình con sắp xếp một danh sách chứa các số nguyên, trong các
trường hợp:
- 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)
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 5

Bài báo cáo bài tập thực hành môn : Cấu Trúc Dữ Liệu & Giải Thuật.
void SapXepTang(DanhSach DS)
{
int tam;
for(int i=1;i<DS.n;i++)
for(int j=i+1;j<=DS.n;j++)
if(DS.PhanTu[i]>DS.PhanTu[j])
{
swap(DS.PhanTu[i],DS.PhanTu[j]);
}
}
void SapXepTang(List &L)
{
Node *tam1=new Node;
Node *tam2=new Node;
tam1=L.First;
while(tam1->Right->Right!=L.Last) //chay tu Node dau tien cho den Node ke cuoi
{
tam1=tam1->Right;
while(tam2->Right!=L.Last) //chay tu Node tam den Node cuoi
{
tam2=tam1->Right;
if(tam1->PhanTu > tam2->PhanTu)
swap(tam1,tam2);
}
}
}
Bài 5. Viết chương trình con thêm 1 phần tử trong danh sách liên kết đã có thứ tự
sao cho ta vẫn có 1 danh sách có thứ tự.
void SapXepTang(DanhSach DS)

{
int tam;
for(int i=1;i<DS.n;i++)
for(int j=i+1;j<=DS.n;j++)
if(DS.PhanTu[i]>DS.PhanTu[j])
{
swap(DS.PhanTu[i],DS.PhanTu[j]);
}
}
void ThemPhanTu(List &L,int pt)
{
Node *tam=new Node;
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 6
Bài báo cáo bài tập thực hành môn : Cấu Trúc Dữ Liệu & Giải Thuật.
tam=L.First;
while(tam->Right!=L.Last&&tam->PhanTu < pt) //chay tu Node dau tien cho den
Node cuoi
{ //Dieu kien dung la pt lon hon PhanTu tai Node tam
tam=tam->Right;
//tim vi tri thich hop
if(tam->PhanTu>=pt && tam->Right->PhanTu<=pt)
{
//chen vao vi tri vua tim duoc
tam->Right->Left=tam;
tam->Left->Right=tam;
tam->Left=tam->Left->Right;
}
}
}
Bài 6. Viết chương trình con tìm kiếm và xóa 1 phần tử trong danh sách liên kết có

thứ tự.
void XoaPhanTu(List &L,int pt)
{
Node *tam=new Node;
tam=L.First;
while(tam->Right!=L.Last&&tam->PhanTu < pt) //chay tu Node dau tien cho den
Node cuoi
{ //Dieu kien dung la pt lon hon PhanTu tai Node tam
tam=tam->Right;
//tim vi tri thich hop
if(tam->PhanTu==pt)
{
//xoa phan tu tai vi tri vua tim duoc
delete tam->Left->Right;
tam->Right->Left=tam->Left;
tam->Left->Right=tam->Right;
delete tam;
}
}
}
Bài 7.Viết chương trình con nhập vào từ bàn phím 1 dãy số nguyên, lưu trữ nó trong
một danh sách có thứ tự không giảm, 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 vị trí thích hợp để xen nó vào danh sách cho đúng
thứ tự. vctc trên cho trường hợp danh sách được cài đặt bằng mảng và cài đặt bằng
con trỏ.
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 7
Bài báo cáo bài tập thực hành môn : Cấu Trúc Dữ Liệu & Giải Thuật.
//them vao vi tri k trong sanh sach
void ThemK(DanhSach &DS,int phantu,int k)
{

for(int i=DS.n;i>=k;i--)
DS.PhanTu[i+1]=DS.PhanTu[i];
DS.PhanTu[k]=phantu;
DS.n++;
}
//tim vi tri thich hop va them vao sanh sach
void Them(DanhSach &DS,int phantu)
{
if(DS.n==0||phantu<DS.PhanTu[1]) ThemDau(DS,phantu);
else if(phantu>=DS.PhanTu[DS.n]) ThemCuoi(DS,phantu);
else
for(int i=1;i<=DS.n-1;i++)
if(DS.PhanTu[i]<=phantu&&DS.PhanTu[i+1]>=phantu)
{
ThemK(DS,phantu,i);i=DS.n;cout<<DS.PhanTu[DS.n];getch();//ket thuc vong
lap(chi them 1 lan)
}
}
//------ 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)
{
if(int(ch)<48&&int(ch)>57)
{
i++;
ch=getch();cout<<ch;

Them(DS,int(ch)-48);
}
}
}
Bài 8. Viết chương trình con loại bỏ các phần tử trùng nhau(giứ lại duy nhất 1 phần
tử) trong 1 danh sách có thứ tự không giảm trong 2 trường hợp: Cài đặt bằng mảng
và cài đặt bằng con trỏ.
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 8
Bài báo cáo bài tập thực hành môn : Cấu Trúc Dữ Liệu & Giải Thuật.
//xoa phan tu tai vi tri K
void XoaK(DanhSach &DS,int k)
{
cout<<"\n\t\txoa phan tu tai vi tri "<<k<<" co gia tri= "<<DS.PhanTu[k];
for(int i=k;i<=DS.n;i++)
DS.PhanTu[i]=DS.PhanTu[i+1];
DS.n--;Xuat(DS);
}
//xoa nhung phan tu trung nhau trong danh sach
void XoaPTTrung(DanhSach &DS)
{
for(int i=1;i<=DS.n-1;i++)
{
if(DS.PhanTu[i]==DS.PhanTu[i+1]) {XoaK(DS,i+1);i--;}
}
}
//------ doi voi danh sach luu tru bang con tro -------
void Delete(List &L)
{
Node *N,*tam;
N=L.First;

while(N->Right!=L.Last)
{
if(N->Info==N->Right->Info)
{
cout<<"\n\t\tN->Info= "<<N->Info;
cout<<"\tM->Info= "<<N->Right->Info;
cout<<"\tXoa M="<<N->Right->Info;getch();
tam=N->Right;
N->Right->Right->Left=N;
N->Right=N->Right->Right;
delete tam;
L.n--;
Display(L);//kiem tra
}
else N=N->Right;
}
}
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 9
Bài bá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 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)
{
int i,so[10];
for(i=0;i<=10;i++)so[i]=0;
for(i=1;i<=DS.n;i++)
{
switch (DS.PhanTu[i])
{case 1:so[1]++;break;
case 2:so[2]++;break;
case 3:so[3]++;break;

case 4:so[4]++;break;
case 5:so[5]++;break;
case 6:so[6]++;break;
case 7:so[7]++;break;
case 8:so[8]++;break;
case 9:so[9]++;break;
case 0:so[0]++;break;
}
}
for(i=0;i<10;i++)
{
cout<<"\nSo "<<i<<" Xuat hien "<<so[i]<<" lan.";
}
}
//------ doi voi danh sach luu tru bang con tro -------
void Count(List &L)
{
int i,so[10];
for(i=0;i<=10;i++)so[i]=0;
Node *N;
N=L.First;
for(i=1;i<=L.n;i++)
{
N=N->Right;
switch (N->Info)
{case 1:so[1]++;break;
case 2:so[2]++;break;
case 3:so[3]++;break;
case 4:so[4]++;break;
case 5:so[5]++;break;

SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 10
Bài báo cáo bài tập thực hành môn : Cấu Trúc Dữ Liệu & Giải Thuật.
case 6:so[6]++;break;
case 7:so[7]++;break;
case 8:so[8]++;break;
case 9:so[9]++;break;
case 0:so[0]++;break;
}
}
for(i=0;i<10;i++)
{
cout<<"\nSo "<<i<<" Xuat hien "<<so[i]<<" lan.";
}
}
Bài 10. Viết chương trinhf con đảo ngược 1 danh sách trong cả 2 trường hợp là lưu
bằng mảng và lưu bằng con trỏ.
void DaoNguoc(DanhSach &DS)
{
int i=0,j=DS.n;
for(i=1;i<=DS.n/2;i++)
{
DS.PhanTu[0]=DS.PhanTu[i];//phan tu 0 lam trung gian
DS.PhanTu[i]=DS.PhanTu[j];
DS.PhanTu[j]=DS.PhanTu[0];
j--;
}
}
//------ doi voi danh sach luu tru bang con tro -------
void Change(List &L)
{

Node*N=L.First->Right->Right;//bat dau tu phan tu so 2
int tam;
while(N->Right!=NULL)
{
Node*tmp=N;tam=N->Info;
//xoa Node
N->Left->Right=N->Right;
N->Right->Left=N->Left;
N=N->Right;
delete tmp;L.n--;
//them Node vua xoa vao dau danh sach
Add_LIFO(L,tam);
}
}
SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 11
Bài bá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 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)
{
int i,n=DS.n,j=DS.n-k+1;
for(i=1;i<=j;i++) //dich chuyen cac phan tu sau vi tri k lui 1
{
DS.PhanTu[n+1]=DS.PhanTu[n];
n--;
}

//them vao vi tri k
DS.PhanTu[k]=phantu;
DS.n++;
}
//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);
else
for(int i=1;i<=DS.n-1;i++)
if(DS.PhanTu[i]<phantu&&DS.PhanTu[i+1]>phantu)
{
ThemK(DS,phantu,i+1);i=DS.n;//ket thuc vong lap(chi them 1 lan)
}
}
//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
else
{
Node *N;Node *M;
N=L.First; M=L.First->Right;
for(int i=1;i<=L.n-1;i++)
{
N=N->Right;

SVTH: Tống Văn Chình – Lớp 06I Trường CĐ Công Nghệ Thông Tin- ĐH ĐN. Page 12

×