NODE* GetNodePointerLIST l, DATA info; NODE* GetPreviousNodePointerLIST l; void AddHeadLIST &l; NODE* AddHeadLIST &l, DATA info; void AddTailLIST &l; NODE* AddTailLIST &l, DATA info; NOD
Trang 1THỰC HÀNH CẤU TRÚC DỮ LIỆU VÀ GIẢI THUẬT -CẤU TRÚC -
// CauTrucNgay.cpp : Defines the entry point for the console application
typedef struct ngay NGAY;
// Nguyen mau ham
void Nhap(NGAY &ng);
NGAY TinhNgayHomTruoc(NGAY ng);
NGAY TinhNgayHomSau(NGAY ng);
Trang 2printf("Nam %d khong la nam nhuan\n", ng1.nam);
printf("Ngay 1 la ngay thu %d trong nam %d\n", TinhSTTNgayTrongNam(ng1), ng1.nam);
printf("Ngay 1 la ngay thu %d ke tu 1/1/1\n", TinhSTTNgay(ng1));
Xuat(TinhNgayHomTruoc(ng1), "Ngay hom truoc cua Ngay 1 la: ");
Xuat(TinhNgayHomSau(ng1), "Ngay hom sau cua Ngay 1 la: ");
Trang 3// Dinh nghia ham
Trang 5// Tinh tong so ngay cac thang truoc do
for (int i=1; i<ng.thang; i++)
// Tinh tong so ngay cac nam truoc do
for (int i=1; i<ng.nam; i++)
Trang 6} }
Trang 7if (ng.ngay == max) // Ngay cuoi cung cua thang
Trang 8for (int i=0; i<k; i++)
Trang 9// TamGiac.cpp : Defines the entry point for the console application.
//Cấu trúc dữ liệu tam giác
typedef struct tamgiac TAMGIAC;
// Nguyen mau ham
void NhapDiem(DIEM &d);
float TinhKhoangCach(DIEM d1, DIEM d2);
void NhapTamGiac(TAMGIAC &tg);
float TinhChuVi(TAMGIAC tg);
float TinhDienTich(TAMGIAC tg);
Trang 10{
TAMGIAC tg;
NhapTamGiac(tg);
XuatTamGiac(tg, "Toa do ba diem cua Tam giac:\n");
printf("Chu vi Tam giac = %.2f\n", TinhChuVi(tg));
printf("Dien tich Tam giac = %.2f\n", TinhDienTich(tg)); getch();
}
// Dinh nghia ham
void NhapDiem(DIEM &d)
Trang 11XuatDiem(tg.dA, "- Toa do Diem A: ");
XuatDiem(tg.dB, "- Toa do Diem B: ");
XuatDiem(tg.dC, "- Toa do Diem C: ");
Trang 13// Diem.cpp : Defines the entry point for the console
typedef struct diem DIEM;
// Nguyen mau ham
void Nhap(DIEM &d);
float TinhKhoangCach(DIEM d1, DIEM d2);
Xuat(d2, "Toa do Diem 2: ");
printf("Khoang cach giua 2 diem = %.2f\n",
TinhKhoangCach(d1, d2));
Trang 14Xuat(TimDoiXungQuaGoc(d1), "Toa do diem doi xung qua goc cua Diem 1: ");
Xuat(TimDoiXungQuaOx(d1), "Toa do diem doi xung qua Ox cua Diem 1: ");
Xuat(TimDoiXungQuaOy(d1), "Toa do diem doi xung qua Oy cua Diem 1: ");
getch();
}
// Dinh nghia ham
void Nhap(DIEM &d)
Trang 16// DaThuc.cpp : Defines the entry point for the console
// Khai bao kieu DATHUC
// anx^n + an-1x^n-1 + + a1x + a0
typedef struct dathuc DATHUC;
// Nguyen mau ham
void Nhap(DATHUC &dt);
DATHUC Tong(DATHUC dt1, DATHUC dt2);
DATHUC Hieu(DATHUC dt1, DATHUC dt2);
DATHUC Tich(DATHUC dt1, DATHUC dt2);
DATHUC DaoHamCap1(DATHUC dt);
float TinhGiaTri(DATHUC dt, float x0);
Trang 17Nhap(dt2);
Xuat(dt2, "Da thuc 2: ");
Xuat(Tong(dt1, dt2), "Da thuc 1 + Da thuc 2 = ");
Xuat(Hieu(dt1, dt2), "Da thuc 1 - Da thuc 2 = ");
Xuat(Tich(dt1, dt2), "Da thuc 1 * Da thuc 2 = ");
Xuat(DaoHamCap1(dt1), "Dao ham cap 1 cua Da thuc 1 = ");
// Dinh nghia ham
Trang 18for (int i=0; i<=kq.n; i++)
kq.a[i] = dt1.a[i] + dt2.a[i];
while (kq.n>0 && kq.a[kq.n] == 0)
kq.n ;
Trang 19for (int i=0; i<=kq.n; i++)
kq.a[i] = dt1.a[i] - dt2.a[i];
while (kq.n>0 && kq.a[kq.n] == 0)
kq.a[i+j] = kq.a[i+j] + dt1.a[i] * dt2.a[j];
while (kq.n>0 && kq.a[kq.n] == 0)
kq.n ;
return kq;
}
Trang 20for (int i=kq.n; i>=0; i )
kq.a[i] = dt.a[i+1] * (i+1);
for (int i=dt.n; i>=0; i )
kq = kq + dt.a[i] * pow(x0, i);
return kq;
}
Trang 21-DANH SÁCH LIÊN KẾT - // DeMoDSLK.cpp : Defines the entry point for the console application.
typedef struct list LIST;
void InitList(LIST &l);
NODE* CreateNode(DATA info);
Trang 22NODE* GetNodePointer(LIST l, DATA info);
NODE* GetPreviousNodePointer(LIST l);
void AddHead(LIST &l);
NODE* AddHead(LIST &l, DATA info);
void AddTail(LIST &l);
NODE* AddTail(LIST &l, DATA info);
NODE* AddAfter(LIST &l, NODE*q, DATA info);
void AddBefore(LIST &l, NODE*q);
NODE* AddBefore(LIST &l, NODE*q, DATA info);
NODE* AddAscendingList(LIST &l, DATA info);
DATA RemoveHead(LIST &l);
DATA RemoveTail(LIST &l);
DATA RemoveAfter(LIST &l, NODE*q);
void RemoveAll(LIST &l);
Trang 23// 01 Hàm so sánh 2 biến kiểu cấu trúc cho trước
// Đầu vào: biến cấu trúc (info1) và biến cấu trúc (info2)// Đầu ra: 0 (bằng nhau), -1 (info1 nhỏ hơn info2), 1 (info1 lớn hơn info2)
// Đầu vào: tham chiếu đến DSLK cẩn khởi tạo (1)
// Đầu ra: Không có
void InitList(LIST &l)
// Đầu vào: DSLK cần kiểm tra (1)
// Đầu ra: DSLK rỗng hay không (true/false)
Trang 24// 05 Hàm tạo một node mới với dữ liệu cho trước
// Đầu vào: Dữ liệu của nút (info)
// Đầu ra: Con trỏ đến nút đó (trả về NULL nếu không tạo được)
// Đầu vào: DSLK (l), dữ liệu của nút cần tìm (info)
// Đầu ra: Con trỏ đến nút tìm được (trả về NULL nếu
// 07 Hàm tìm nút có chỉ số (bắt đầu từ 0) cho trước
// Đầu vào: DSLK (l), chỉ số của nút cần lấy (index)
// Đầu ra: Con trỏ đến nút tìm được (trả về NULL nếu
không tìm được)
Trang 26// Đầu vào: DSLK (l), con trỏ đến nút cho trước (pNode)// Đầu ra: Con trỏ đến nút tìm được (trả về NULL nếu
không tìm được)
NODE* GetPreviousNodePointer(LIST l, NODE *p)
{
NODE *pPreviousNode = l.pHead;
while (pPreviousNode != NULL && pPreviousNode->pNext != p)
pPreviousNode = pPreviousNode->pNext;
return pPreviousNode;
}
// 10 Hàm chèn một nút cho trước vào đầu DSLK
// Đầu vào: Tham chiếu đến DSLK (l), con trỏ đến nút cần chèn (pNewNode)
void AddHead(LIST &l, NODE *p)
// Đầu ra: Con trỏ đến nút được chèn (trả về NULL nếu không chèn được)
NODE* AddHead(LIST &l, DATA info)
{
NODE*p = CreateNode(info);
Trang 27if (p != NULL)
AddHead(l, p);
return p;
}
// 12 Hàm chèn một nút cho trước vào cuối DSLK
// Đầu vào: Tham chiếu đến DSLK (l), con trỏ đến nút cần chèn (pNewNode)
void AddTail(LIST &l, NODE *p)
// Đầu ra: Con trỏ đến nút được chèn (trả về NULL nếu không chèn được)
NODE* AddTail(LIST &l, DATA info)
Trang 28// Đầu vào: Tham chiếu đến DSLK (l), con trỏ đến nút cho trước (q), con trỏ đến nút cần chèn (pNewNode)
{
{
Trang 30// Đầu vào: Tham chiếu đến DSLK (l)
// Đầu ra: Dữ liệu của nút bị xóa (nếu có)
DATA RemoveHead(LIST &l)
Trang 31}
// 21 Hàm hủy một nút đứng sau một nút cho trước trong DSLK// Đầu vào: Tham chiếu đến DSLK (l), con trỏ đến nút cho trước (q)
// Đầu ra: Dữ liệu của nút bị xóa (nếu có)
DATA RemoveAfter(LIST &l, NODE *q)
return info;
}
// 22 Hàm hủy một nút cuối DSLK
// Đầu vào: Tham chiếu đến DSLK (l)
// Đầu ra: Dữ liệu của nút bị xóa (nếu có)
DATA RemoveTail(LIST &l)
Trang 32NODE *q = GetPreviousNodePointer(l, l.pTail);
return RemoveAfter(l, q);
} }
return info;
}
// 23 Hàm hủy một nút có dữ liệu cho trước trong DSLK
// Đầu vào: Tham chiếu đến DSLK (l), dữ liệu của nút cần xóa (info)
// Đầu ra: Tìm thấy nút có dữ liệu info hay không
(true/false)
{
NODE *p = GetNodePointer(l, info);
bool flag = false;
} }
return flag;
}
Trang 33// 24 Hàm hủy toàn bộ DSLK cho trước
// Đầu vào: Tham chiếu đến DSLK (l)
void RemoveAll(LIST &l)
PrintList(l, "Chen nut 8 vao dau:\t\t");
// Chèn nút có giá trị 9 vào đầu dslk
info.x = 9;
NODE *q = AddHead(l, info);
PrintList(l, "Chen nut 9 vao dau:\t\t");
// Chèn nút có giá trị 10 vào đầu dslk
Trang 34info.x = 10;
AddHead(l, info);
PrintList(l, "Chen nut 10 vao dau:\t\t");
// Chèn nút có giá trị 999 vào cuối dslk
info.x = 999;
AddTail(l, info);
PrintList(l, "Chen nut 999 vao cuoi:\t\t");
// Chèn nút có giá trị 789 vào cuối dslk
info.x = 789;
AddTail(l, info);
PrintList(l, "Chen nut 789 vao cuoi:\t\t");
// Chèn nút có giá trị 111 vào sau nút q (nút có giá trị
9 ở trên)
info.x = 111;
AddAfter(l, q, info);
PrintList(l, "Chen nut 111 vao sau nut 9:\t");
// Chèn nút có giá trị 123 vào trước nút q (nút có giá trị 9 ở trên)
info.x = 123;
AddBefore(l, q, info);
PrintList(l, "Chen nut 123 vao truoc nut 9:\t");
// Xóa nút đầu tiên
info = RemoveHead(l);
PrintList(l, "Xoa nut dau tien:\t\t");
printf("Gia tri cua nut bi xoa:\t",info.x);
// Xóa nút cuối cùng
info = RemoveTail(l);
PrintList(l, "Xoa nut cuoi cung:\t\t");
printf("Gia tri cua nut bi xoa:\t",info.x);
// Xóa nút sau nút q (nút có giá trị 9 ở trên)
info = RemoveAfter(l, q);
PrintList(l, "Xoa nut sau nut 9:\t\t");
Trang 35printf("Gia tri cua nut bi xoa:\t",info.x);
// Xóa nút có giá trị cho trước
printf("Nhap gia tri nut can xoa:");
Trang 36getch()
}
Trang 37cot va duong cheo deu trong
len hang j
cac hoang hau tren ban co khi thanh cong
{
Trang 38// Ham dat hoang hau j len hang j
Trang 39lai dat quan hau tiep theo
// Du thanh cong hay that bai deu quay lai de tim loi giai moi
// <=> phuc hoi trang thai truoc khi dat hoang hau j
cottrong[i] = TRUE;
cheoxuoitrong[j-i+KICHTHUOC-1] = TRUE;
cheonguoctrong[j+i] = TRUE;
} }
// Ham in tat ca vi tri cac hoang hau tren ban co khi thanh cong
Trang 40printf("\n\n");
}
Trang 41// MaDiTuan.cpp : Defines the entry point for the console application.
nuoc di tren ban co
Trang 42nuocdi(2, j, i); // Nuoc di thu 2 xuat phat
tu o (j, i)
} }
// Xoa het nuoc di tren ban co
// Ham tim nuoc di thu n, xuat phat tu o (y, x)
void nuocdi(int n, int y, int x)
{
for (int i=0; i<8; i++) // 8 nuoc di co the
{
// Chon thu huong di thu i (trong 8 huong di)
// Neu huong di nay hop le va tai vi tri do chua co nuoc di nao
if (ymoi>=0 && ymoi<KICHTHUOC && xmoi>=0 &&
xmoi<KICHTHUOC && banco[ymoi][xmoi] == 0)
tim nuoc di ke tiep
Trang 43// Du thanh cong hay that bai deu quay lai de tim loi giai moi
// <=> phuc hoi trang thai truoc khi di nuoc
di thu n
banco[ymoi][xmoi] = 0;
} }
}
// In cac nuoc di cua con ma
Trang 44// BAITOANTHAPHANOI.cpp : Defines the entry point for the console application.
// Ham chuyen n dia cotA -> cotC (trung gian cotB)
void hanoi(int n, char cotA, char cotB, char cotC);
// Ham chuyen n dia cotA -> cotC (trung gian cotB)
void hanoi(int n, char cotA, char cotB, char cotC)
{
printf("Buoc %d Chuyen dia 1 tu cot %c sang cot
%c\n", ++buoc, cotA, cotC);
else
{
// Chuyen n-1 dia cotA -> cotB (trung gian C)
hanoi(n-1, cotA, cotC, cotB);
// Chuyen 1 dia cotA -> cotC
Trang 45printf("Buoc %d Chuyen dia %d tu cot %c sang cot
%c\n", ++buoc, n, cotA, cotC);
// Chuyen n-1 dia cotB -> cotC (trung gian A)
hanoi(n-1, cotB, cotA, cotC);
}
}