Tubes-Std/
├── bin/
│ └── app.exe # File executable hasil compile
├── src/
│ ├── tournament.h # Header Tournament (struktur & deklarasi)
│ ├── tournament.cpp # Implementasi Tournament & Delete Operations
│ ├── match.h # Header Match (struktur & deklarasi)
│ ├── match.cpp # Implementasi Match
│ ├── menu.h # Header Menu (deklarasi fungsi UI)
│ ├── menu.cpp # Implementasi Menu & UI Handlers
│ ├── query.cpp # Implementasi Query, Counting & Statistics
│ ├── utils.h # Header Utility Functions
│ ├── utils.cpp # Implementasi Utility Functions
│ ├── data_loader.h # Header Data Loader
│ └── data_loader.cpp # Implementasi File Loading
├── main.cpp # Program utama
├── data.txt # File data tournament dan match
└── README.md # Dokumentasi ini
struct Tournament {
int tournamentID;
string tournamentName;
string game;
string startDate;
string endDate;
int totalPrize;
adrMatch firstMatch; // Pointer ke child list
};struct Match {
int matchID;
string matchName;
string team1;
string team2;
int scoreTeam1;
int scoreTeam2;
string matchDate;
string status;
};- Multi Level List: Tournament → Match (One-to-Many)
- Tournament List: Single Linked List
- Match List: Single Linked List per Tournament
createListTournament(ListTournament &L)createElmTournament(Tournament data) → adrTournament
insertFirstTournament(ListTournament &L, adrTournament P)insertLastTournament(ListTournament &L, adrTournament P)insertAfterTournament(ListTournament &L, adrTournament Prec, adrTournament P)
findTournamentByID(ListTournament L, int tournamentID) → adrTournamentfindTournamentByName(ListTournament L, string name) → adrTournament
showAllTournaments(ListTournament L)
updateTournament(ListTournament &L, int tournamentID)deleteTournament(ListTournament &L, int tournamentID)deleteFirstTournament(ListTournament &L)deleteLastTournament(ListTournament &L)deleteAllTournaments(ListTournament &L)
createElmMatch(Match data) → adrMatch
insertFirstMatch(adrTournament P, adrMatch M)insertLastMatch(adrTournament P, adrMatch M)
findMatchByID(adrTournament P, int matchID) → adrMatchfindMatchByName(adrTournament P, string matchName) → adrMatch
showAllMatches(adrTournament P)
updateMatch(adrTournament P, int matchID)deleteMatch(adrTournament P, int matchID)deleteAllMatches(adrTournament P)
queryTournamentByPrize(ListTournament L, int minPrize)- Mencari tournament dengan hadiah >= nilai tertentu
countAllTournaments(ListTournament L) → intcountAllMatches(ListTournament L) → intcountMatchesByTournament(adrTournament P) → int
getAveragePrize(ListTournament L) → floatgetAverageMatchPerTournament(ListTournament L) → float
groupTournamentByGame(ListTournament L)- Grouping tournament berdasarkan game
- Menampilkan total tournament, total prize, dan avg prize per game
displayMainMenu()displayTournamentMenu()displayMatchMenu()
###UpdateTournament(ListTournament &L)`
DeleteTournament(ListTournament &L)
addMatch(ListTournament &L)ShowMatches(ListTournament L)searchMatchByID(ListTournament L)UpdateMatch(ListTournament L)DeleteMatch(ListTournament L)
queryTournament(ListTournament L)- Query by prizemenuAverage(ListTournament L)- Average menu handlermenuGroupBy(ListTournament L)- Group by menu handlershowStatistics(ListTournament L)- Display stats
pauseScreen()- Pause dengan "Tekan Enter..."
displayTournamentInfo(adrTournament P)- Tampilkan info tournament
selectTournamentFromList(ListTournament L) → int- Pilih tournament dari list
[from data.txt] └─> Main Menu Loop ├─> 1. menuTournament() │ ├─> Add Tournament │ ├─> Show All │ ├─> Search by ID │ ├─> Search by Name │ ├─> Update │ ├─> Delete │ ├─> Delete First │ └─> Delete Last ├─> 2. menuMatch() │ ├─> Add Match to Tournament │ ├─> Show All Matches │ ├─> Search Match │ ├─> Update Match │ └─> Delete Match ├─> 3. queryTournament() │ └─> Query by Min Prize ├─> 4. menuAverage() │ ├─> Average Prize │ └─> Average Match per Tournament ├─> 5. menuGroupBy() │ └─> Group Tournament by Game ├─> 6. showStatistics() │ ├─> Total Tournament │ └─> Total Matchsrc\data_loader.cpp src\utils.cpp
main.cpp
└─> createListTournament()
└─> loadSampleData()
└─> Main Menu Loop
├─> 1. menuTournament()
│ ├─> Add Tournament
│ ├─> Show All
│ ├─> Search by ID
│ ├─> Search by Name
│ ├─> Update
│ └─> Delete
├─> 2. menuMatch()
│ ├─> Add Match to Tournament
│ ├─> Show All Matches
│ ├─> Search Match
│ ├─> Update Match
│ └─> Delete Match
├─> 3. searchTournament()
├─> 4. queryTournament()
├─> 5. showStatistics()
└─> 0. Exit + deleteAllTournaments()
g++ main.cpp src\tournament.cpp src\match.cpp src\menu.cpp src\query.cpp -o bin\app.exe - Search by ID atau Name
- List semua tournament
2. **Match Management**
- CRUD Match dalam Tournament
- Search match by ID
- List semua match per tournament
3. **Query & Search**
- Query tournament berdasarkan minimal prize
- Search tournament by ID atau Name
4. **Statistics & Aggregation**
- Count total tournament
- Count total match
- Count match per tournament
- Average Prize Tournament
- Average Match per Tournament
- Group Tournament by Game (dengan total & avg prize)
5. **Data Loading**
- Auto-load dari data.txt saat program start
- 4 Tournament sample data:
- MPL Season 12 (Mobile Legends) - 3 matches
- VCT Masters (Valorant) - 4 matches
- PMPL ID Season 5 (PUBG Mobile) - 5 matches
- MLBB World Championship (Mobile Legends) - 7 matches
- Hitung total match
- Hitung match per tournament
4. **Sample Data**(dan `<string>`, `<fstream>` untuk data loading)
- **Input Style**: `cin>>` (no getline, kecuali di search by name)
- **Output Style**: `cout<<` (no spacing, no `\n` literals)
- **Formatting**: Variasi style (if/while spacing, brace position)
- **Pause**: Menggunakan `pauseScreen()` dari utils.cpp
- **Memory Management**: Manual delete dengan deleteAll functions
- **Control Flow**: Menggunakan if-else block (no early return pattern)
- **Data Source**: External file `data.txt` (pipe-delimited format)
- **Code Organization**:
- tournament.cpp: CRUD & delete operations
- match.cpp: Match operations
- query.cpp: Query, statistics, aggregation
- utils.cpp: Reusable helper functions
- data_loader.cpp: File loading functionality
- menu.cpp: UI & menu handler
## CATATAN TEKNIS
- **Library**: Hanya menggunakan `<iostream>` dan `<string>`
- **Input Style**: `cin>>` (no getline, kecuali di search)
- **Output Style**: `cout<<` (no spacing)
- **Formatting**: Variasi style (if/while spacing, brace position)
- **Pause**: `cin.ignore() + cin.get()` setelah list display
- **Memory Management**: Manual delete dengan deleteAll functions