Đề bài : ThucHanh07_Struct_DanhSachLienKet.pdf
- Định nghĩa lại kiểu cấu trúc struct thoigian (ThoiGian) ở bài Thực hành 7 - Bài 1 để có thể sử dụng để tạo một danh sách liên kết kiêu dữ liệu ThoiGian.
- Tạo 2 danh sách kiểu dữ liệu ThoiGian ngẫu nhiên, trong mỗi danh sách liên kết dữ liệu ThoiGian được sắp xếp từ nhỏ đến lớn. In ra dữ liệu của 2 danh sách liên kết này.
- Gộp 2 danh sách liên kết vừa tạo thành 1 danh sách liên kết sao cho dữ liệu ThoiGian trong danh sách liên kết mới cũng được sắp xếp từ nhỏ đến lớn. In ra dữ liệu của danh sách liên kết này.
Lưu ý : Sau khi gộp con trỏ của 2 danh sách liên kết cũ phải được xóa.
_________________________________________________________________________
Code : http://pastebin.com/HwsHhNa4 hoặc ThoiGianBT02.cpp
_________________________________________________________________________
#include <iostream>
#include <cstdlib>
#include <iomanip>
using namespace std;
struct thoigian
{
int gio;
int phut;
int giay;
struct thoigian * tiepTheo;
};
typedef struct thoigian ThoiGian;
typedef ThoiGian * ThoiGianPtr;
ThoiGianPtr taoNutMoi();
void quyChuanThoiGian(ThoiGianPtr);
void inThoiGian(const ThoiGianPtr);
bool soSanhThoiGianLonHon(const ThoiGianPtr, const ThoiGianPtr);
bool soSanhThoiGianNhoHon(const ThoiGianPtr, const ThoiGianPtr);
bool soSanhThoiGianBang(const ThoiGianPtr, const ThoiGianPtr);
bool soSanhThoiGianKhac(const ThoiGianPtr, const ThoiGianPtr);
void chenNut(ThoiGianPtr &dau, ThoiGianPtr nutChen);
ThoiGianPtr gopDSLK(ThoiGianPtr &dau1, ThoiGianPtr &dau2);
void inDanhSachLienKet(ThoiGianPtr &dau);
int main()
{
srand(time(0));
ThoiGianPtr dau1, dau2;
// tao 2 danh sach lien ket ngau nhien dau1 & dau2
inDanhSachLienKet(dau1);
inDanhSachLienKet(dau2);
// gop 2 danh sach tren thanh mot danh sach
ThoiGianPtr dau = gopDSLK(dau1, dau2);
inThoiGian(dau);
system("PAUSE");
return EXIT_SUCCESS;
}
ThoiGianPtr taoNutMoi()
{
ThoiGianPtr tg = new ThoiGian;
tg->gio= rand();
tg->phut= rand();
tg->giay= rand();
tg->tiepTheo= NULL;
return tg;
}
void quyChuanThoiGian(ThoiGianPtr tg)
{
int doiRaGiay;
doiRaGiay= tg->gio*3600 + tg->phut*60 + tg->giay;
int thoiGian1Ngay= 24*3600;
if ( doiRaGiay<0 )
{
doiRaGiay= thoiGian1Ngay + doiRaGiay;
}
else
{
if ( doiRaGiay>thoiGian1Ngay )
{
doiRaGiay%= thoiGian1Ngay;
}
}
tg->gio= doiRaGiay/3600; doiRaGiay%= 3600;
tg->phut= doiRaGiay/60; doiRaGiay%= 60;
tg->giay= doiRaGiay;
}
void inThoiGian(const ThoiGianPtr dau)
{
ThoiGianPtr tg = dau;
while ( tg != NULL )
{
cout << tg->gio << "h:" << tg->phut << "m:" << tg->giay << "s" << endl;
tg= tg->tiepTheo;
}
cout << endl;
}
void chenNut(ThoiGianPtr &dau, ThoiGianPtr nutChen)
{
if ( soSanhThoiGianNhoHon(nutChen,dau) || soSanhThoiGianBang(dau,nutChen) )
{
nutChen->tiepTheo = dau;
dau= nutChen;
}
else
{
ThoiGianPtr nutHienTai= dau;
while ( nutHienTai->tiepTheo !=NULL && soSanhThoiGianLonHon(nutChen,nutHienTai->tiepTheo) )
{
nutHienTai= nutHienTai->tiepTheo;
}
nutChen->tiepTheo= nutHienTai->tiepTheo;
nutHienTai->tiepTheo= nutChen;
}
}
ThoiGianPtr gopDSLK(ThoiGianPtr &dau1, ThoiGianPtr &dau2)
{
ThoiGianPtr dau,tam;
dau= dau1;
while (dau2!= NULL)
{
tam= dau2; dau2= dau2->tiepTheo;
tam->tiepTheo = NULL;
chenNut(dau,tam);
}
delete dau2, dau1;
return dau;
}
void inDanhSachLienKet(ThoiGianPtr &dau)
{
//tao danh sach ngau nhien so phan tu va sap xep
int soPhanTu= rand()%5 + 1;
dau= taoNutMoi();
quyChuanThoiGian(dau);
ThoiGianPtr tam;
for ( int i=1; i<soPhanTu; i++ )
{
tam= taoNutMoi();
quyChuanThoiGian(tam);
chenNut(dau,tam);
}
// in danh sach sau khi da sap xep
inThoiGian(dau);
}
bool soSanhThoiGianLonHon(const ThoiGianPtr tg1, const ThoiGianPtr tg2)
{
int tgian1, tgian2;
tgian1= tg1->gio*3600 + tg1->phut*60 + tg1->giay;
tgian2= tg2->gio*3600 + tg2->phut*60 + tg2->giay;
if ( tgian1>tgian2 ) return true;
else return false;
}
bool soSanhThoiGianNhoHon(const ThoiGianPtr tg1, const ThoiGianPtr tg2)
{
int tgian1, tgian2;
tgian1= tg1->gio*3600 + tg1->phut*60 + tg1->giay;
tgian2= tg2->gio*3600 + tg2->phut*60 + tg2->giay;
if ( tgian1<tgian2 ) return true;
else return false;
}
bool soSanhThoiGianBang(const ThoiGianPtr tg1, const ThoiGianPtr tg2)
{
int tgian1, tgian2;
tgian1= tg1->gio*3600 + tg1->phut*60 + tg1->giay;
tgian2= tg2->gio*3600 + tg2->phut*60 + tg2->giay;
if ( tgian1==tgian2 ) return true;
else return false;
}
bool soSanhThoiGianKhac(const ThoiGianPtr tg1, const ThoiGianPtr tg2)
{
int tgian1, tgian2;
tgian1= tg1->gio*3600 + tg1->phut*60 + tg1->giay;
tgian2= tg2->gio*3600 + tg2->phut*60 + tg2->giay;
if ( tgian1!=tgian2 ) return true;
else return false;
}