Laporan Struktur Data Linked List Dan Tree
Laporan Struktur Data Linked List Dan Tree
LANDASAN TEORI
I. DASAR TEORI
LINKED LIST
Linked list merupakan struktur data yang memiliki kelebihan dalam
efisiensi memori dan kecepatan dalam menyisipkan data. Linked list berguna untuk
menyimpan beberapa data dalam memori. Komponen dasar dari suatu list disebut
sebagai node. Sebuah node terdiri dari dua buah bagian. Bagian pertama adalah
bagian yang memuat informasi data, bagian kedua adalah bagian yang
menunjukkan alamat data berikutnya atau disebut juga dengan bagian penunjuk.
Linked list dapat diilustrasikan seperti satu kesatuan rangkaian kereta api.
Kereta api terdiri dari beberapa gerbong, masing-masing dari gerbong itulah yang
disebut struct tipe data bentukan. Agar gerbong-gerbong tersebut dapat saling
bertaut dibutuhkan minimal sebuah kait yang dinamakan sebagai pointer. Setelah
mendeklarasikan tipe data dan pointer pada list, selanjutnya membuat sena linked
list tunggal tidak berputar atau sebuah gerbong. Ada beberapa operasi yang dapat
dibuat pada linked tersebut, diantaranya: tambah, hapus dan edit dari gerbong
tersebut. Berikut macam-macam bentuk linked list.
1. Singly Linked List, setiap node pada single linked list mempunyai field yang
berisi pointer ke node berikutnya dan juga memiliki field yang berisi data.
Akhir linked list ditandai dengan node terakhir akan menunjuk ke null yang
akan digunakan sebagai kondisi berhenti saat pembacaan linked list.
2. Double Linked List, linked list dengan menggunakan pointer, dimana setiap
node memiliki 3 field, yaitu 1 field pointer yang menunjuk ke pointer
berikutnya, 1 field pointer yang menunjuk ke pointer sebelumnya dan field
yang berisi data dari node tersebut. Pointer next dan prev-nya menunjuk ke
null.
1
3. Single Circular Linked List, single linked list yang pointer next-nya
menunjuk ke dirinya sendiri, jika terdiri dari beberapa node maka pointer
terakhirnya akan menunjuk ke pointer terdepannya.
4. Double Circular Linked List, double linked list yang pointer next dan prev-
nya menunjuk ke dirinya sendiri secara circular.
TREE
Tree adalah kumpulan node yang saling terhubung satu sama lain dalam
suatu kesatuan yang membentuk layakya struktur sebuah pohon. Struktur pohon
adalah suatu cara merepresentasikan suatu struktur hirarki (one-to-many) secara
grafis yang mirip sebuah pohon, walaupun pohon tersebut hanya tampak sebagai
kumpulan node-node dari atas ke bawah. Suatu struktur data yang tidak linier yang
menggambarkan hubungan yang hirarkis (one-to-many) dan tidak linier antara
elemen-elemennya.
Ada Beberapa Jenis TREE di antaranya :
1. Binary Tree, tree dengan syarat bahwa tiap node hanya boleh memiliki
maksimal dua sub pohon dan kedua subpohon harus terpisah.
2. Full BinaryTree, semua node, kecuali leaf pasti memiliki 2 anak dan tiap subtree
memiliki panjang path yang sama.
3. Complete Binary Tree, tree yang mirip dengan full binary tree, tapi tiap subtree
boleh memiliki panjang path yang berbeda dan tiap node (kecuali leaf) memiliki
2 anak.
Skewed Binary Tree, binary tree yang semua nodenya (kecuali leaf) hanya memiliki
satu anak.
2
BAB II
PEMBAHASAN
#include<iostream>
#include<conio.h>
#include<stdio.h>
#include<windows.h>
using namespace std;
struct pointer {
char nim[30], nama [40];
struct pointer *next;
} mhs, *baru, *awal=NULL, *akhir=NULL, *hapus, *bantu;
int pilihan;
void pilih();
void bikin_baru();
void tmbh_dpn();
void tmbh_blkng();
void hps_dpn();
void hps_blkng();
void view();
void bikin_baru() {
baru=(pointer*) malloc (sizeof(struct pointer));
void clrscr() {
system("cls");
}
void pilih() {
if (pilihan==1)
tmbh_dpn();
else if(pilihan==2)
tmbh_blkng();
else if(pilihan==3)
3
hps_dpn();
else if(pilihan==4)
hps_blkng();
else if(pilihan==5)
view();
cout << ">>>>TAMAT<<<<" ;
}
void tmbh_dpn(){
bikin_baru();
if (awal==NULL){
awal=baru;
akhir=baru;
akhir->next=NULL;
}
else{
baru->next=awal;
awal=baru;
}
cout<<endl<<endl;
view();
}
void tmbh_blkng(){
bikin_baru();
if(awal==NULL){
awal=baru;
}
else{
akhir->next=baru;
}
akhir=baru;
akhir->next=NULL;
cout<<endl<<endl;
view();
}
void hps_dpn() {
if (awal==NULL)
cout << "Kosong";
else {
hapus=awal;
awal=awal->next;
free(hapus);
}
cout << endl << endl;
view();
}
4
void hps_blkng() {
if (awal=NULL)
cout << "kosong";
else if(awal==akhir){
hapus==awal;
awal=awal->next;
free(hapus);
}
else{
hapus=awal;
while(hapus->next!=akhir)
hapus=hapus->next;
akhir=hapus;
hapus=akhir->next;
akhir->next=NULL;
free(hapus);
}
cout<<endl<<endl;
view();
}
void view() {
if(awal==NULL)
cout << "kosong";
else{
1. bantu=awal;
while(bantu!=NULL)
{
cout<<"NIM : "<<bantu->nim<<endl;
cout<<"Nama : "<<bantu->nama<<endl;
bantu=bantu->next;
}
}
getch();
}
int main()
{
do{
clrscr();
cout<<"MENU <Fajrizky>\n";
cout<<"1. Tambah Depan\n2. Tambah Belakang\n";
cout<<"3. Hapus Depan\n4. Hapus Belakang\n";
cout<<"5. Lihat Hasil\n0. Keluar\n";
cout<<"Masukan nomor yang dipilih : ";
cin>>pilihan;
pilih();
}
while (pilihan!=0);
5
return 0;
}
Pada awal koding saya mulai dengan pembahasan file header, file header
merupakan sebuah file yang berisi deklarasi untuk berbagai fungsi yang dibutuhkan
oleh program baik itu sebagai standar Input/Output maupun sebagai syntax.
#include Merupakan proses compiler dari c++ menjalankan program yang
dinamakan preprosesor yang memiliki kemampuan menambahkan dan menghapus
kode dari file sumber. Include berarti menyertakan kode dari file header yang ada
didalam kurung, file header adalah file yang berisi deklarasi untuk berbagai fungsi
yang dibutuhkan oleh program. Iostream merupakan file program yang
mengandung deklarasi kelas-kelas yang diperlukan misal oleh objek "cout. stdio.h
merupakan file header ini merupakan singkatan dari standar input output. Jadi
sudah jelas kalau perintah yang ada dijadikan sebagai standar input dan output.
Windows fungsinya adalah untuk memanggil perintah-perintah yang ada pada
command prompt. Untuk bisa memanggil perintah tersebut kalian tinggal menulis
perintah tersebut dalam fungsi "system()". Seperti pada koding baris ke 30.
Kemudian saya lanjutkan kepada mendeklarasikan tipe data yang akan
digunakan untuk varibel plat, front, rear, dan count. struct merupakan keyword yang
memungkinkan membuat deklarasi yang di dalamnya dapat terdapat banyak
variabel, hasil deklarasi ini akan menghasilkan user-defined data type yaitu tipe
structure yang berguna untuk mendirikan object. Dibaris 8 merupakan baris yang
berisikan veriabel char untuk NIM dan Nama sedangakan penulisan nim[30]
merupakan contoh atau penulisan Array proses penyimpanan data ke dalam
variabel. Dan pada baris ke 9 merupakan fungsi dari pointer yang di gunakan untuk
mengambil data next.
Di lanjutkan dengan deretan fungsi void yang berisi fungsi memilih,
membuat data, menambah data depan, menambah data belakang, hapus data depan,
hapus data belakang dan fungsi menampilkan data yang tersimpan. Dimana nanti
fungsi-fungsi ini akan di program utama atau badan programnya.
6
Masuk ke dalam badan programnya akan menampilkan menu program,
selanjutnya akan menjalankan fungsi pilih, setelah user menginput pilihan atas
menu program yang kemudian diseleksi pada fungsi pilih yang nantinya akan
menjalankan fungsi lainnya. Yang telah di buat sebelumnya. Dan menggunakan
perulangan do dan while untuk data perulangannya.
PROGRAM TREE
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <iostream>
using namespace std;
7
{
if(root!=NULL)
{
if(root->data!=NULL)
{
printf("%d ",root->data);
}
preOrder(root->kiri);
preOrder(root->kanan);
}
}
8
printf("Data ditemukan!");
}
while(curr != NULL)
{
if(curr->data == del)
{
flag = true;
break;
}
else
{
parent = curr;
if(del>curr->data)
curr = curr->kanan;
else
curr = curr->kiri;
}
9
}
if(!flag)
{
cout<<"Data tidak ditemukan. Penghapusan tidak
dilakukan."<<endl;
return;
}
if(height(pohon) == 0)
{
if( curr->kiri== NULL && curr->kanan == NULL)
{
(*root) = NULL;
return;
}
}
else if(height(pohon) > 0)
{
if( curr->kiri== NULL && curr->kanan == NULL)
{
if(parent->kiri == curr)
{
parent->kiri = NULL;
delete curr;
}
else
{
parent->kanan = NULL;
delete curr;
}
return;
}
10
delete curr;
}
}
else
{
if(parent->kiri == curr)
{
parent->kiri = curr->kiri;
delete curr;
}
else
{
parent->kanan = curr->kiri;
delete curr;
}
}
return;
}
while(bantu2->kiri != NULL)
{
bantu3 = bantu2;
bantu2 = bantu2->kiri;
}
curr->data = bantu2->data;
delete bantu2;
bantu3->kiri = NULL;
11
}
else
{
Node* tmp;
tmp = curr->kanan;
curr->data = tmp->data;
curr->kanan = tmp->kanan;
delete tmp;
}
}
return;
}
}
}
int main()
{
char pil;
int del,cari;
while (true)
{
system("cls");
char data;
printf("\t#PROGRAM TREE C++#");
printf("\n\t==================");
printf("\nMENU");
printf("\n----\n");
printf("[1] Tambah Data\n");
printf("[2] Lihat Pre-Order\n");
printf("[3] Lihat In-Order\n");
printf("[4] Lihat Post-Order\n");
printf("[5] Delete\n");
printf("[6] Kosongkan Data\n");
printf("[7] Search\n");
printf("[8] Hitung Node pada Tree\n");
printf("[9] Kedalaman Tree\n");
printf("[X] Keluar\n");
printf("Pilihan Anda : ");
scanf("%c",&pil);
fflush(stdin);
switch(pil)
{
case '1':
printf("\nINPUT : ");
printf("\n-------");
printf("\nMasukkan data: ");
scanf("%d", &data);
12
tambah(&pohon,data);
_getch();
break;
case '2':
printf("\nOUTPUT PRE ORDER : ");
printf("\n------------------\n");
if(pohon!=NULL)
preOrder(pohon);
else
printf("Masih Kosong!!!");
_getch();
break;
case '3':
printf("\nOUTPUT IN ORDER : ");
printf("\n------------------\n");
if(pohon!=NULL)
inOrder(pohon);
else
printf("Masih Kosong!!!");
_getch();
break;
case '4':
printf("\nOUTPUT POST ORDER : ");
printf("\n------------------\n");
if(pohon!=NULL)
postOrder(pohon);
else
printf("Masih Kosong!!!");
_getch();
break;
case '5':
if(pohon!=NULL)
{
printf("\nSEBELUM NODE DIHAPUS : ");
printf("\n---------------------- ");
printf("\nPRE ORDER : ");
preOrder(pohon);
printf("\nIN ORDER : ");
inOrder(pohon);
printf("\nPOST ORDER : ");
postOrder(pohon);
printf("\n\nPENGHAPUSAN DATA : ");
13
printf("\n------------------\n");
printf("Masukkan data yang ingin
dihapus: ");
scanf("%d", &del);
hapus(&pohon, del);
printf("\n\nSETELAH NODE DIHAPUS :
");
printf("\n---------------------- ");
printf("\nPRE ORDER : ");
preOrder(pohon);
printf("\nIN ORDER : ");
inOrder(pohon);
printf("\nPOST ORDER : ");
postOrder(pohon);
}
else
printf("\nMasih kosong!");
_getch();
break;
case '6':
pohon=NULL;
printf("\nPENGOSONGAN ELEMEN ");
printf("\n------------------");
printf("\nTree sudah dikosongkan!!");
_getch();
break;
case '7':
printf("\nOUTPUT -> Hanya untuk mengecek
apakah data dimaksud terdapat dalam tree");
printf("\n------");
if(pohon!=NULL)
{
printf("\nPRE ORDER : ");
preOrder(pohon);
printf("\nIN ORDER : ");
inOrder(pohon);
printf("\nPOST ORDER : ");
postOrder(pohon);
printf("\n\nPENCARIAN DATA");
printf("\n--------------");
printf("\nMasukkan data yang ingin
dicari : ");
scanf("%d", &cari);
search(&pohon, cari);
14
}
else
printf("\nMasih kosong!");
_getch();
break;
case '8':
printf("\nJUMLAH NODE DI DALAM TREE");
printf("\n-------------------------");
printf("\nJumlah Node : %d", count(pohon));
_getch();
break;
case '9' :
printf("\nKEDALAMAN TREE(LEVEL-> DIMULAI
DARI 0)");
printf("\n--------------------------------
--------");
printf("\nKedalaman tree : %d\n",
height(pohon));
_getch();
break;
case 'X'|'x':
exit(0);
break;
}
}
}
Pada Praktikum kali ini saya di tugaskan untuk membuat sebuah program
struktur data pohon yang memiliki fungsi – fungsi tertentu dengan menggunakan
bahasa cpp sebagai bahasa pemrogrammannya. Program yang saya buat di memiliki
total 337 baris dengan 4 buah header dan memiliki sekitar tidak kurang dari 9 fungsi
berbeda didalamnya.
15
Gambar 2.
Seperti pada tugas praktikum sebelumnya saya disini menggunakan header
yang sudah awam digunakan dalam koding bahasa cpp yaitu stdio, conio, stdlib,
dan iostream. Tidak lupa juga untuk membuat proses koding lebih efesien dan cepat
saya menggunakan using namespace std.
Pada program ini juga saya menggunakan typedef struct yang perannya
untuk memberikan nama lain pada tipe data sekaligus mempersingkat penulisan
koding.
Gambar 2.
Masuk dalam pembahasan fungsi pertama saya disini mendeklarasikan
fungsi untuk menambah node. Disini saya memiliki algoritma root masih kosong
maka saya akan membuat node baru yang di alokasikan memorinya dari node telah
16
di buat dan kemudian dia inisialisasi awal node yang baru dibuat, jika menunjuk ke
NULL itu artinya tidak mempunya child. Selanjutnya jika data akan dimasukan
lebih kecil dari pada elemen rootnya, makan akan di letakkan di node sebelah kiri
dan jika data yang dimasukan lebih besar daripada elemen root maka node
dimasukkan di sebelah kanan dan andai jika saat dicek data yang dimasukan
memiliki nilai yang sama dengan data pada root maka akan menampilan output
“Data sudah ada!”
17
Dibaris ke 58 saya mendeklarasikan fungsi search yang perannya untuk
menlakukan pencarian data dengan logika jika data yang dicari tidak ada maka akan
menampilkan output “Data tidak ditemukan!” dan jika data yang dicari lebih kceil
daru isi root maka akan mencari ke kiri dan jika data yang dicari lebih besar dari isi
root maka akan mencari ke kanan dan juga jika yang cari ada varibel root maka
langsung ditemukan pada root. Dan jika di antar tiga kondisi tadi terpenuhi akan
tampil output “Data ditemukan”.
Fungsi pada baris ke 69 ini berguna untuk mengetahui jumlah node dalam
tree dengan menjumlahkan data di sebelah kanan dan data yang di sebelah kiri pada
tree.
18
Saya kemudian mendeklarasikan fungsi height yang perannya untuk
mengetahui ketinggian atau kedalaman pohon yang saya buat. Pada baris ke 75 ini
saya menggunakan kodisional if dan else. Dimana variabel u untuk sebelah kiri dan
bariabel v untuk sebelah kanan yang jika u lebih dari v maka nilai baliknya adalah
u + 1 dan jika kondisi tidak terpenuhi maka nilai baliknya adalah v + 1.
19
Pada baris ke 87 saya mendeklarasikan fungsi hapus yang saya gunakan
untuk menghapus suatu node tertentu yang saya inginkan. Disini saya menggunkan
kondisional if else dan while do juga. Tipe data boolean untuk flag, yang jika flag
20
tidak ditemukan dalam tampilan data yang data di hapus maka akan menampilkan
output “Data tidak ditemukan. Penghapusan tidak dilakukan” kemudian jika saya
mengatur koding logika tingkat – tingkatnya yang dimana suatu node paren di
hapus maka curr node tidak punya parent. Untuk logika disni saya memerintahkan
pertukaran antar node untuk tetap menjaga agar pohon tidak terpotong.
Pada fungsi yang terakhir ini memiliki peran untuk menemukan node
terkecil dari seluruh node yang telah ditambahkan sebelumnya.
21
22
23
Yang terakhir ini saya menuliskan koding badan program yang disini saya
menggunakan menu dengan logika kodisional while do untuk lebih mudah
membuat case-case menunya yang di setiap case memanggil fungsi-fungsi yang
telah saya deklarasikan sebelumnya pada tahap deklarasi.
24
BAB III
KESIMPULAN
Tree yang menggunakan root dan leaf untuk membentuk struktur data yang
hierarki. Tree juga merupakan salah satu bentuk struktur data tidak linear yang
menggambarkan hubungan yang bersifat hirarkis (hubungan one to many) antara
elemen-elemen.
25
DAFTAR PUSTAKA
Tim DosenTeknik Informatika. 2017. Struktur Data modul 2 single linked list..
Palangka Raya: Jurusan Teknik Informatika, Fakultas Teknik, UniversitasPalangka
Raya.
Puthry, 2014, Fungsi Keyword Keyword dan Contoh Pada Linked List Di Bahasa
C++,(http://puthryy.blogspot.com/2014/03/fungsi-keyword-keyword-dan-
contoh_2.html)
Manik Lydia, 2014, program menghapus data single linked list non- circular,
(http://nomadenpost.blogspot.co.id/2014/02/program-menghapus-data-yang-
telah.html\ )
26