Sunday, June 22, 2014

Thực hành 7 -Bài 2


Đề 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;
}

BACK TO TOP