PRAKTIKUM 10: Menerapkan struktur data linked list dalam pemrograman
V. Prosedur Praktikum
Praktekan Latihan Berikut:
Soal Praktek 1: Sistem Manajemen Buku
1) Buatlah program yang menggunakan linked list untuk mengimplementasikan sistem
manajemen buku. Setiap buku memiliki informasi seperti judul, penulis, dan tahun terbit.
Program tersebut harus memiliki fitur sebagai berikut:
• Menambahkan buku baru ke dalam linked list.
• Menghapus buku dari linked list berdasarkan judul.
• Menampilkan seluruh buku dalam linked list.
Soal Praktek 2: Sistem Antrian Pasien Rumah Sakit
2) Buatlah program yang menggunakan linked list untuk mengimplementasikan sistem antrian
pasien di rumah sakit. Setiap pasien memiliki informasi seperti nama, nomor rekam medis, dan
jenis penyakit. Program tersebut harus memiliki fitur sebagai berikut:
• Menambahkan pasien baru ke dalam linked list antrian.
• Memanggil pasien berikutnya untuk dilayani dan menghapusnya dari linked list.
• Menampilkan seluruh pasien dalam linked list antrian.
Soal Praktek 3: Sistem Pencatatan Transaksi Penjualan
3) Buatlah program yang menggunakan linked list untuk mengimplementasikan sistem
pencatatan transaksi penjualan. Setiap transaksi memiliki informasi seperti nomor transaksi,
tanggal, dan total pembelian. Program tersebut harus memiliki fitur sebagai berikut:
• Menambahkan transaksi baru ke dalam linked list.
• Menghapus transaksi dari linked list berdasarkan nomor transaksi.
• Menampilkan seluruh transaksi dalam linked list.
Silakan implementasikan tiga soal praktek di atas menggunakan bahasa C.
1. Jawaban Soal Praktek 1: Sistem Manajemen Buku
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Struktur data untuk buku
struct Buku {
char judul[100]; // Menyimpan judul buku
char penulis[100]; // Menyimpan nama penulis
int tahunTerbit; // Menyimpan tahun terbit buku
struct Buku* next; // Pointer untuk menunjuk ke buku berikutnya dalam linked list
};
// Fungsi untuk menambahkan buku baru ke dalam linked list
void tambahBuku(struct Buku** head, char judul[], char penulis[], int tahunTerbit) {
// Membuat node buku baru
struct Buku* bukuBaru = (struct Buku*)malloc(sizeof(struct Buku));
// Mengisi informasi buku
strcpy(bukuBaru->judul, judul);
strcpy(bukuBaru->penulis, penulis);
bukuBaru->tahunTerbit = tahunTerbit;
// Mengatur next dari buku baru menjadi NULL (karena buku baru akan menjadi akhir dari linked list)
bukuBaru->next = NULL;
// Jika linked list masih kosong, buku baru menjadi head
if (*head == NULL) {
*head = bukuBaru;
}
// Jika linked list sudah berisi buku, mencari akhir linked list dan menghubungkannya dengan buku baru
else {
struct Buku* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = bukuBaru;
}
printf("Buku berhasil ditambahkan.\n");
}
// Fungsi untuk menghapus buku dari linked list berdasarkan judul
void hapusBuku(struct Buku** head, char judul[]) {
// Jika linked list kosong
if (*head == NULL) {
printf("Tidak ada buku dalam daftar.\n");
return;
}
// Jika buku yang ingin dihapus merupakan buku pertama dalam linked list
if (strcmp((*head)->judul, judul) == 0) {
struct Buku* temp = *head;
*head = (*head)->next;
free(temp);
printf("Buku berhasil dihapus.\n");
return;
}
// Mencari buku yang ingin dihapus
struct Buku* current = *head;
struct Buku* prev = NULL;
while (current != NULL && strcmp(current->judul, judul) != 0) {
prev = current;
current = current->next;
}
// Jika buku tidak ditemukan
if (current == NULL) {
printf("Buku dengan judul '%s' tidak ditemukan.\n", judul);
return;
}
// Menghubungkan node sebelum buku yang ingin dihapus dengan node setelahnya
prev->next = current->next;
free(current);
printf("Buku berhasil dihapus.\n");
}
// Fungsi untuk menampilkan seluruh buku dalam linked list
void tampilkanBuku(struct Buku* head) {
// Jika linked list kosong
if (head == NULL) {
printf("Tidak ada buku dalam daftar.\n");
return;
}
printf("Daftar Buku:\n");
printf("==========================================\n");
struct Buku* current = head;
while (current != NULL) {
printf("Judul: %s\n", current->judul);
printf("Penulis: %s\n", current->penulis);
printf("Tahun Terbit: %d\n", current->tahunTerbit);
printf("------------------------------------------\n");
current = current->next;
}
}
// Fungsi untuk menghapus seluruh linked list buku
void hapusSemuaBuku(struct Buku** head) {
struct Buku* current = *head;
struct Buku* next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
*head = NULL;
printf("Seluruh buku berhasil dihapus.\n");
}
int main() {
struct Buku* daftarBuku = NULL;
int pilihan;
char judul[100];
char penulis[100];
int tahunTerbit;
do {
printf("========== Sistem Manajemen Buku ==========\n");
printf("1. Tambah Buku\n");
printf("2. Hapus Buku\n");
printf("3. Tampilkan Daftar Buku\n");
printf("4. Hapus Semua Buku\n");
printf("0. Keluar\n");
printf("Pilihan Anda: ");
scanf("%d", &pilihan);
switch (pilihan) {
case 1:
printf("Masukkan Judul Buku: ");
scanf(" %[^\n]s", judul); // Membaca judul dengan spasi
printf("Masukkan Nama Penulis: ");
scanf(" %[^\n]s", penulis); // Membaca penulis dengan spasi
printf("Masukkan Tahun Terbit: ");
scanf("%d", &tahunTerbit);
tambahBuku(&daftarBuku, judul, penulis, tahunTerbit);
break;
case 2:
printf("Masukkan Judul Buku yang Akan Dihapus: ");
scanf(" %[^\n]s", judul); // Membaca judul yang akan dihapus
hapusBuku(&daftarBuku, judul);
break;
case 3:
tampilkanBuku(daftarBuku);
break;
case 4:
hapusSemuaBuku(&daftarBuku);
break;
case 0:
printf("Terima kasih!\n");
break;
default:
printf("Pilihan tidak valid. Silakan coba lagi.\n");
}
printf("\n");
} while (pilihan != 0);
// Menghapus seluruh linked list buku sebelum program berakhir
hapusSemuaBuku(&daftarBuku);
return 0;
}
Program di atas merupakan implementasi sederhana dari sistem
manajemen buku menggunakan linked list dalam bahasa C. Program
ini memungkinkan pengguna untuk menambahkan buku baru ke dalam
linked list, menghapus buku berdasarkan judul, dan menampilkan
seluruh daftar buku yang ada.
Berikut adalah penjelasan singkat tentang struktur dan fungsi
utama dalam program:
Struktur Buku:
• Merupakan struktur data yang merepresentasikan sebuah buku
dengan tiga atribut: judul (judul), penulis (penulis), dan
tahun terbit (tahunTerbit).
• Memiliki pointer next yang menunjuk ke buku berikutnya dalam
linked list.
Fungsi tambahBuku():
• Membuat node baru untuk buku yang ingin ditambahkan.
• Mengisi informasi buku seperti judul, penulis, dan tahun
terbit.
• Menambahkan buku baru ke akhir linked list.
Fungsi hapusBuku():
• Mengecek apakah linked list kosong atau tidak.
• Jika buku yang ingin dihapus merupakan buku pertama dalam
linked list, maka buku tersebut dihapus dan kepala linked
list diubah.
• Jika buku yang ingin dihapus berada di tengah atau akhir
linked list, maka buku tersebut dihapus dan pointer next
sebelumnya diubah.
Fungsi tampilkanBuku():
• Menampilkan seluruh informasi buku dalam linked list.
• Menggunakan perulangan untuk mengunjungi setiap node buku
dalam linked list dan mencetak informasinya.
Fungsi hapusSemuaBuku():
• Menghapus seluruh node buku dalam linked list.
• Menggunakan perulangan untuk mengunjungi setiap node dan
membebaskan memori yang dialokasikan.
Fungsi main():
• Berfungsi sebagai menu utama program.
• Menggunakan perulangan do-while untuk menampilkan menu dan
menerima input dari pengguna.
• Berdasarkan pilihan pengguna, fungsi-fungsi yang sesuai
dipanggil untuk menjalankan operasi yang diinginkan.
• Program akan berjalan terus menerus hingga pengguna memilih
opsi keluar (0).
Program ini memberikan pengguna kontrol penuh dalam mengelola
buku-buku dalam sistem manajemen buku menggunakan operasi
linked list seperti menambahkan, menghapus, dan menampilkan
buku.
2. Jawaban Soal Praktek 2: Sistem Antrian Pasien Rumah Sakit
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
// Struktur data pasien
struct Pasien {
char nama[50]; // Nama pasien
int nomorRekamMedis; // Nomor rekam medis pasien
char jenisPenyakit[50]; // Jenis penyakit pasien
struct Pasien* next; // Pointer untuk menunjuk ke pasien berikutnya dalam antrian
};
// Fungsi untuk menambahkan pasien ke dalam linked list antrian
void tambahPasien(struct Pasien** head, char nama[], int nomorRekamMedis, char jenisPenyakit[]) {
// Membuat node baru untuk pasien
struct Pasien* newPasien = (struct Pasien*)malloc(sizeof(struct Pasien));
// Mengisi informasi pasien
strcpy(newPasien->nama, nama);
newPasien->nomorRekamMedis = nomorRekamMedis;
strcpy(newPasien->jenisPenyakit, jenisPenyakit);
newPasien->next = NULL;
// Jika antrian kosong, pasien menjadi pasien pertama
if (*head == NULL) {
*head = newPasien;
} else {
// Jika antrian tidak kosong, mencari posisi akhir antrian
struct Pasien* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
// Menambahkan pasien baru ke akhir antrian
temp->next = newPasien;
}
printf("Pasien '%s' telah ditambahkan ke antrian.\n", nama);
}
// Fungsi untuk memanggil pasien berikutnya dalam antrian
void panggilPasien(struct Pasien** head) {
if (*head == NULL) {
// Jika antrian kosong, tidak ada pasien yang dipanggil
printf("Antrian kosong. Tidak ada pasien yang dipanggil.\n");
} else {
// Menghapus pasien pertama dari antrian
struct Pasien* temp = *head;
*head = (*head)->next;
printf("Pasien '%s' dengan nomor rekam medis %d dipanggil untuk dilayani.\n", temp->nama, temp->nomorRekamMedis);
free(temp); // Menghapus data pasien yang telah dipanggil
}
}
// Fungsi untuk menampilkan seluruh pasien dalam antrian
void tampilkanAntrian(struct Pasien* head) {
if (head == NULL) {
// Jika antrian kosong, tidak ada pasien yang ditampilkan
printf("Antrian kosong. Tidak ada pasien yang ditampilkan.\n");
} else {
printf("Daftar Pasien dalam Antrian:\n");
while (head != NULL) {
printf("Nama: %s, Nomor Rekam Medis: %d, Jenis Penyakit: %s\n", head->nama, head->nomorRekamMedis, head->jenisPenyakit);
head = head->next;
}
}
}
// Fungsi untuk menghapus seluruh pasien dalam antrian
void hapusAntrian(struct Pasien** head) {
struct Pasien* current = *head;
struct Pasien* next;
while (current != NULL) {
next = current->next;
free(current);
current = next;
}
*head = NULL; // Mengatur head ke NULL setelah seluruh antrian dihapus
printf("Seluruh antrian telah dihapus.\n");
}
int main() {
struct Pasien* antrian = NULL; // Inisialisasi antrian pasien sebagai NULL
int pilihan;
do {
printf("\n----- Sistem Antrian Pasien Rumah Sakit -----\n");
printf("1. Tambah Pasien ke Antrian\n");
printf("2. Panggil Pasien berikutnya\n");
printf("3. Tampilkan Seluruh Pasien dalam Antrian\n");
printf("0. Keluar\n");
printf("Pilihan Anda: ");
scanf("%d", &pilihan);
switch (pilihan) {
case 1: {
char nama[50];
int nomorRekamMedis;
char jenisPenyakit[50];
printf("\nTambah Pasien ke Antrian\n");
printf("Masukkan Nama Pasien: ");
scanf("%s", nama); // Membaca nama pasien
printf("Masukkan Nomor Rekam Medis: ");
scanf("%d", &nomorRekamMedis); // Membaca nomor rekam medis
printf("Masukkan Jenis Penyakit: ");
scanf("%s", jenisPenyakit); // Membaca jenis penyakit
tambahPasien(&antrian, nama, nomorRekamMedis, jenisPenyakit);
break;
}
case 2: {
printf("\nPanggil Pasien berikutnya\n");
panggilPasien(&antrian); // Memanggil pasien berikutnya
break;
}
case 3: {
printf("\nTampilkan Seluruh Pasien dalam Antrian\n");
tampilkanAntrian(antrian); // Menampilkan seluruh pasien dalam antrian
break;
}
case 0: {
printf("\nProgram selesai.\n");
break;
}
default:
printf("\nPilihan tidak valid. Silakan pilih opsi yang benar.\n");
}
} while (pilihan != 0);
// Menghapus seluruh pasien dalam antrian sebelum program berakhir
hapusAntrian(&antrian);
return 0;
}
▪ Klik menu file Save, ketikan nama
▪ Klik Build →Build and Run atau icon
▪ berikut hasilnya
Program di atas menggunakan linked list untuk
mengimplementasikan sistem antrian pasien di rumah sakit.
Berikut penjelasan singkat tentang program tersebut:
1) Struktur Pasien:
✓ Merupakan struktur data yang merepresentasikan sebuah pasien
dengan tiga atribut: nama (nama), nomor rekam medis
(nomorRekamMedis), dan jenis penyakit (jenisPenyakit).
✓ Memiliki pointer next yang menunjuk ke pasien berikutnya
dalam linked list.
2) Fungsi tambahPasien():
✓ Membuat node baru untuk pasien yang ingin ditambahkan.
✓ Mengisi informasi pasien seperti nama, nomor rekam medis,
dan jenis penyakit.
✓ Menambahkan pasien baru ke akhir linked list antrian.
3) Fungsi panggilPasien():
✓ Mengecek apakah antrian kosong atau tidak.
✓ Jika antrian kosong, pesan akan ditampilkan.
✓ Jika antrian tidak kosong, pasien pertama dalam antrian
dipanggil dan dihapus dari linked list antrian.
4) Fungsi tampilkanAntrian():
✓ Mengecek apakah antrian kosong atau tidak.
✓ Jika antrian kosong, pesan akan ditampilkan.
✓ Jika antrian tidak kosong, menampilkan seluruh pasien dalam
antrian, termasuk informasi seperti nama, nomor rekam medis,
dan jenis penyakit.
5) Fungsi hapusAntrian():
✓ Menghapus seluruh pasien dalam antrian dengan melakukan
iterasi melalui linked list dan membebaskan setiap node.
6) Fungsi main():
✓ Menjalankan program utama dengan menggunakan sebuah loop
yang terus berjalan sampai pilihan keluar (0) dipilih.
✓ Menampilkan opsi menu kepada pengguna dan meminta input
pilihan.
✓ Memanggil fungsi-fungsi yang sesuai berdasarkan pilihan
pengguna.
Program ini memungkinkan pengguna untuk menambahkan pasien
baru ke dalam antrian, memanggil pasien berikutnya untuk
dilayani, serta menampilkan seluruh pasien dalam antrian.
Program ini juga secara otomatis menghapus seluruh pasien dalam
antrian sebelum program berakhir untuk mencegah kebocoran
memori.
Dalam implementasinya, program menggunakan linked list untuk
mengatur dan mengakses data pasien secara efisien. Setiap
pasien direpresentasikan sebagai sebuah node dalam linked
list, dan operasi-operasi seperti penambahan dan penghapusan
pasien dapat dilakukan dengan mengubah alamat pointer.
3. Jawaban Soal Praktek 3: Sistem Pencatatan Transaksi Penjualan
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#include <stdlib.h>
#define MAX_SIZE 100
// Struktur data untuk Proses
typedef struct {
char nama[50]; // Nama proses
} Proses;
// Struktur data untuk Queue
typedef struct {
Proses data[MAX_SIZE]; // Array untuk menyimpan proses
int front; // Indeks depan antrian
int rear; // Indeks belakang antrian
} Queue;
// Fungsi untuk menginisialisasi antrian
void initializeQueue(Queue *q) {
q->front = -1;
q->rear = -1;
}
// Fungsi untuk mengecek apakah antrian penuh
int isFull(Queue *q) {
return (q->rear == MAX_SIZE - 1);
}
// Fungsi untuk mengecek apakah antrian kosong
int isEmpty(Queue *q) {
return (q->front == -1 || q->front > q->rear);
}
// Fungsi untuk menambahkan proses ke dalam antrian
void enqueue(Queue *q, Proses proses) {
if (isFull(q)) {
printf("Antrian penuh, tidak bisa menambahkan proses.\n");
} else {
if (q->front == -1) {
q->front = 0; // Menandai bahwa antrian tidak kosong
}
q->rear++; // Menaikkan indeks rear
q->data[q->rear] = proses; // Menambahkan proses ke dalam antrian
printf("Proses %s ditambahkan ke dalam antrian.\n", proses.nama);
}
}
// Fungsi untuk menghapus (mengeksekusi) proses dari antrian
void dequeue(Queue *q) {
if (isEmpty(q)) {
printf("Antrian kosong, tidak ada proses yang dieksekusi.\n");
} else {
Proses proses = q->data[q->front];
q->front++; // Menggeser posisi front untuk menghapus proses
printf("Proses %s telah dieksekusi dan dikeluarkan dari antrian.\n", proses.nama);
}
}
// Fungsi untuk menampilkan seluruh proses dalam antrian
void displayQueue(Queue *q) {
if (isEmpty(q)) {
printf("Antrian kosong.\n");
} else {
printf("Data Proses dalam Antrian:\n");
for (int i = q->front; i <= q->rear; i++) {
Proses proses = q->data[i];
printf("Proses %s\n", proses.nama);
}
}
}
int main() {
Queue q;
initializeQueue(&q); // Inisialisasi antrian kosong
// Menambahkan beberapa proses ke dalam antrian
Proses proses1 = {"Proses A"};
Proses proses2 = {"Proses B"};
Proses proses3 = {"Proses C"};
enqueue(&q, proses1);
enqueue(&q, proses2);
enqueue(&q, proses3);
// Menampilkan seluruh proses dalam antrian
displayQueue(&q);
// Menjalankan (menghapus) beberapa proses dari antrian
dequeue(&q);
dequeue(&q);
// Menampilkan antrian setelah beberapa proses dieksekusi
displayQueue(&q);
return 0;
}
1. Jawaban Soal
▪ Buka Text Editor Code::Blocks,
▪ Pilih menu klik file → New→Empty File
▪ Ketikan koding di bawah ini
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
struct Node {
char namaBuah[50];
struct Node* next;
};
void tambahBuah(struct Node** head, char namaBuah[]) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
strcpy(newNode->namaBuah, namaBuah);
newNode->next = NULL;
if (*head == NULL) {
*head = newNode;
} else {
struct Node* current = *head;
while (current->next != NULL) {
current = current->next;
}
current->next = newNode;
}
printf("Buah '%s' berhasil ditambahkan ke dalam linked list.\n", namaBuah);
}
void hapusBuah(struct Node** head, char namaBuah[]) {
if (*head == NULL) {
printf("Linked list kosong. Tidak ada buah untuk dihapus.\n");
return;
}
if (strcmp((*head)->namaBuah, namaBuah) == 0) {
struct Node* temp = *head;
*head = (*head)->next;
free(temp);
printf("Buah '%s' berhasil dihapus dari linked list.\n", namaBuah);
return;
}
struct Node* prev = *head;
struct Node* current = (*head)->next;
while (current != NULL) {
if (strcmp(current->namaBuah, namaBuah) == 0) {
prev->next = current->next;
free(current);
printf("Buah '%s' berhasil dihapus dari linked list.\n", namaBuah);
return;
}
prev = current;
current = current->next;
}
printf("Buah '%s' tidak ditemukan dalam linked list.\n", namaBuah);
}
void tampilkanBuah(struct Node* head) {
if (head == NULL) {
printf("Linked list kosong. Tidak ada buah yang ditampilkan.\n");
return;
}
printf("Daftar Buah dalam Linked List:\n");
struct Node* current = head;
while (current != NULL) {
printf("%s\n", current->namaBuah);
current = current->next;
}
}
int main() {
struct Node* head = NULL;
int pilihan;
char namaBuah[50];
do {
printf("\n");
printf("=== Sistem Manajemen Buah ===\n");
printf("1. Tambah Buah\n");
printf("2. Hapus Buah\n");
printf("3. Tampilkan Buah\n");
printf("4. Keluar\n");
printf("Pilih menu (1-4): ");
scanf("%d", &pilihan);
switch (pilihan) {
case 1:
printf("Masukkan nama buah yang ingin ditambahkan: ");
scanf(" %49s", namaBuah);
tambahBuah(&head, namaBuah);
break;
case 2:
printf("Masukkan nama buah yang ingin dihapus: ");
scanf(" %49s", namaBuah);
hapusBuah(&head, namaBuah);
break;
case 3:
tampilkanBuah(head);
break;
case 4:
printf("Terima kasih. Program selesai.\n");
break;
default:
printf("Pilihan tidak valid. Silakan pilih kembali.\n");
}
} while (pilihan != 4);
struct Node* current = head;
while (current != NULL) {
struct Node* temp = current;
current = current->next;
free(temp);
}
return 0;
}
Program ini menggunakan linked list untuk menyimpan dan
mengelola daftar buah.
1. Fungsi tambahBuah() digunakan untuk menambahkan buah baru
ke dalam linked list. Fungsi ini akan membuat node baru,
mengisi data buah, dan menambahkannya ke akhir linked list.
2. Fungsi hapusBuah() digunakan untuk menghapus buah dari
linked list berdasarkan nama. Fungsi ini akan mencari buah
dengan nama yang sesuai, menghapusnya dari linked list, dan
membebaskan memori yang digunakan oleh node tersebut.
3. Fungsi tampilkanBuah() digunakan untuk menampilkan seluruh
daftar buah yang ada dalam linked list.
4. Pada fungsi main(), program akan menampilkan menu pilihan
kepada pengguna. Pengguna dapat memilih untuk menambahkan
buah baru, menghapus buah, menampilkan daftar buah, atau
keluar dari program.
➢ Program akan terus berjalan hingga pengguna memilih opsi
keluar (pilihan 4).
➢ Sebelum program berakhir, semua node pada linked list
akan dihapus dan memori yang digunakan akan dibebaskan.
➢ Program ini memungkinkan Andi untuk mengelola daftar buah
dengan menggunakan operasi dasar pada linked list. Andi
dapat menambahkan buah baru, menghapus buah berdasarkan
nama, dan menampilkan seluruh daftar buah yang tersedia.
Comments
Post a Comment