Anda di halaman 1dari 26

PRAKTIKUM STRUKTUR DATA

MODUL 5

Oleh:

Nama : Gede Lucky Aldi Arsa


NIM : 1808561105
Kelas : E

PROGRAM STUDI TEKNIK INFORMATIKA


FAKULTAS MATEMATIKA DAN ILMU PENGETAHUAN ALAM
UNIVERSITAS UDAYANA
2019
BAB I TEORI CONTOH

1.1 Linked List Berkepala dan Berekor


Linked List Berkepala & Berekor adalah linked list yang ditambahkan dua node
“dummy” masing-masing kepala dan ekor tetapi secara logik tidak termasuk anggota
linked list.

Kepala diberi nilai yang pasti lebih kecil dari semua kemungkinan nilai yang ada,
sedangkan ekor nilai yang pasti lebih besar dari semua kemungkinan nilai yang ada.

List Kosong : Jika list hanya terdiri dari kepala dan ekor saja, karena yang dihitung
sebagai node adalah list yang berada diantara kepala dan ekor.

Keuntungannya : Penyisipan dan penghapusan selalu terjadi ditengah.

1.2 Linked List Melingkar


Linked List melingkar (circular linked list) adalah linked list biasa dimana pointer pada
node terakhir diarahkan kembali ke node pertama. Jika menggunakan simpul kepala ,
maka dinamakan dengan linked list melingkar berkepala (headed circular linked list).
Dalama hal ini node terakhir diarahkan kembali ke node kepala.
BAB II PEMBAHASAN
2.1 Linked List Berkepala dan Berekor
2.1.1 Source Code
/* Linked List Berkepala dan Berekor */
#include <iostream>
#include <malloc.h>
using std::cout;
#define true 1
#define false 0
typedef int typeinfo;
typedef struct typenode *typeptr;
typedef struct typenode{
typeinfo info;
typeptr next;
};
typeptr kepala,ekor;
void buatlist();
void sisipnode(typeinfo IB);
void hapusnode(typeinfo IH);
void bacamaju();
void bacamundur();
void bacaback();
int listkosong();
int main()
{
buatlist();
sisipnode(50);
sisipnode(20);
sisipnode(5);
sisipnode(100);
sisipnode(70);
sisipnode(25);
sisipnode(40);
bacamaju();
cout << "\n\nHapus node 20\n";
cout << "\nList setelah dihapus, dibaca dari belakang :\n\n";
hapusnode(20);
bacamundur();
}
void buatlist()
{
kepala=(typenode *)malloc(sizeof(typenode));
ekor=(typenode *)malloc(sizeof(typenode));
kepala->info=-9999;
kepala->next=ekor;
ekor->info=9999;
ekor->next=NULL;
}
int listkosong()
{
if(kepala->next==ekor)
return(true);
else
return(false);
}
void sisipnode(typeinfo IB)
{
typeptr NB, bantu;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB; bantu=kepala;
while (IB > bantu->next->info)
bantu=bantu->next;
NB->next=bantu->next;
bantu->next=NB;
}
void hapusnode(typeinfo IH)
{
typeptr hapus, bantu;
if (listkosong())
cout << "List masih kosong";
else {
bantu=kepala;
while (bantu->next!=ekor && IH!=bantu->next->info)
bantu=bantu->next;
if (IH==bantu->next->info){
hapus=bantu->next;
bantu->next=hapus->next;
free(hapus);
} else
cout << "Node tidak ditemukan!\n";
}
}
void bacamaju()
{
typeptr bantu;
bantu=kepala->next;
while (bantu!=ekor){
cout << " " << bantu->info;
bantu=bantu->next;
}
}
void bacamundur()
{
typeptr depan,bantu;
depan=kepala;
kepala=ekor;
do {
bantu=depan;
while (bantu->next!=ekor)
bantu=bantu->next;
ekor->next=bantu;
ekor=bantu;
} while (ekor!=depan);
ekor->next=NULL;
bantu=kepala->next;
while (bantu!=ekor){
cout << " " << bantu->info;
bantu=bantu->next;
}
}
2.1.2 Output

2.1.3 Penjelasan

Baris 9 – 20 : pendeklarasian struct untuk linklist, variabel, dan fungsi.


Pada gambar diatas merupakan fungsi utama. Baris 23, akan memanggil fungsi
buatlist(). Baris 24 dan 30, program akan memanggil fungsi sisipnode(). Baris 31,
program akan memanggil fungsi bacamaju(). Baris 34, program akan memanggil
fungsi hapusnode(). Baris 35, program akan memanggil fungsi bacamundur().

Merupakan fungsi untuk membuat list baru. Node kepala bernilai (-9999) dan
menunjuk node ekor. Node ekor bernilai (9999) dan menunjuk NULL.

Merupakan fungsi yang berguna mengecek apakah node yang dibuat masih kosong
atau tidak. Jika masih kosong maka akan mengembalikan nilai true dan jika sudah
berisi maka akan mengembalikan nilai false.
Merupakan fungsi untuk menyisipkan nilai kedalam node yang telah dibuat.
Dimana jika nilai inputan yang ingin dimasukkan ke dalam list lebih besar daripada
nilai node yang telah ada, makan node inputan akan di tambahkan didepan node
tersebut. Sedangkan jika nilai inputan node lebih kecil daripada node yang telah
ada maka node inputan tersebut akan ditambahkan dibelakang node tersebut.

Merupakan fungsi untuk menghapus node, dimana terdapat 3 kondisi. Kondisi


pertama yaitu jika list masih kosong maka program akan menampilkan kalimat
“List masih kosong”. Kondisi ke-2, yaitu kodisi untuk menghapus node yang
diinginkan dengan cara membandingkan nilai dari node node yang ada hingga
ditemukan node yang dinginkan. Dan kondisi terakhir yaitu jika node yang ingin
dihapus tidak ada maka program akan menampilkan kalimat “Node tidak
ditemukan”.
Merupakan fungsi untuk menampilkan list secara berurutan dari yang terkecil
hingga terbesar.

Merupakan fungsi untuk menampikan list secara berurutan dari yang terbesar
hingga terkecil.
2.1.4 Ilustrasi
2.2 Linked List Berkepala dan Berekor
2.2.1 Source Code
/* Linked List CIRC*/
#include <iostream>
#include <malloc.h>
using std::cout;
#define true 1
#define false 0
typedef int typeinfo;
typedef struct typenode *typeptr;
typedef struct typenode{
typeinfo info;
typeptr next;
};
typeptr awal,akhir;
void buatlistbaru();
void sisipnode(typeinfo IB);
void hapusnode(typeinfo IH);
void bacamaju();
void bacamundur();
int listkosong();
int main()
{
cout << "List Mula-mula :\n";
buatlistbaru();
sisipnode(50);
sisipnode(20);
sisipnode(5);
sisipnode(100);
sisipnode(70);
sisipnode(25);
bacamaju();
cout << "\n\nHapus node 50\n";
cout << "\nList terakhir :\n";
hapusnode(50);
bacamaju();
return 0;
}
void buatlistbaru()
{
typeptr list;
list=(typenode *) malloc(sizeof(typenode));
list=NULL;
awal=list;
akhir=list;
}
int listkosong()
{
if(awal==NULL)
return(true);
else return(false);
}
void sisipnode(typeinfo IB)
{
typeptr NB, bantu;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB;
NB->next=NULL;
if (listkosong()){
awal=NB;
akhir=NB;
} else if (IB <= awal->info){
NB->next=awal;
awal=NB;
} else {
bantu=awal;
while (bantu->next!=NULL && IB > bantu->next->info)
bantu=bantu->next;
NB->next=bantu->next;
bantu->next=NB;
if (IB>akhir->info)
akhir=NB;
}
}
void hapusnode(typeinfo IH)
{
typeptr hapus, bantu;
if (listkosong())
cout << "List masih kosong\n";
else if (awal->info==IH){
hapus=awal;
awal=hapus->next;
free(hapus);
} else {
bantu=awal;
while (bantu->next->next!=NULL && IH!=bantu->next->info)
bantu=bantu->next;
if (IH==bantu->next->info){
hapus=bantu->next;
if (hapus==akhir){
akhir=bantu;
akhir->next=NULL;
} else
bantu->next=hapus->next;
free(hapus);
} else
cout << "Node tidak ditemukan!\n";
}
}
void bacamaju()
{
typeptr bantu;
bantu=awal;
while (bantu!=NULL) {
cout << " " << bantu->info;
cout << " ";
bantu=bantu->next;
}
}
void bacamundur()
{
typeptr depan,bantu;
depan=awal;
awal=akhir;
do {
bantu=depan;
while (bantu->next!=akhir)
bantu=bantu->next;
akhir->next=bantu;
akhir=bantu;
} while (akhir!=depan);
akhir->next=NULL;
bantu=awal;
while (bantu!=NULL){
cout << " " << bantu->info;
cout << " ";
bantu=bantu->next;
}
}
2.2.2 Output
2.2.3 Penjelasan

Baris 7 – 19 : pendeklarasian struct untuk linklist, variabel, dan fungsi.

Pada gambar diatas merupakan fungsi utama. Baris 23, akan memanggil fungsi
buatlist(). Baris 24 dan 29, program akan memanggil fungsi sisipnode(). Baris 30,
program akan memanggil fungsi bacamaju(). Baris 33, program akan memanggil
fungsi hapusnode(). Baris 34, program akan memanggil fungsi bacamundur().
Merupakan fungsi buatlisbaru() yang berfungsi untuk membuat list node awal
dan akhir yang menunjuk ke null.

Merupakan fungsi liskosong() yang berfungsi untuk mengecek apakah list node
kosong atau tidak. Jika kosong maka return value nya false dan jika tidak kosong
maka return value nya adalah true.

Merupakan fungsi sisipnode(), jika list masih kosong maka node yang mau disisipkan
langsung disisip. Jika tidak maka node tersebut akan disisipkan tergantung nilai node
tersebut.
Merupakan fungsi hapusnode() yang berfungsi untuk menghapus node sesuai
parameter yang diberikan.

Merupakan fungsi untuk menampilkan list secara berurutan dari yang terkecil
hingga terbesar.
Merupakan fungsi untuk menampikan list secara berurutan dari yang terbesar
hingga terkecil.
2.2.4 Ilustrasi
BAB III TUGAS

Tambahkan proses hapus melalui inputan user pada masing-masing program diatas !
3.1 Linked List Berkepala dan Berekor
3.1.1 Source Code
/* Linked List Berkepala dan Berekor */
#include <iostream>
#include <malloc.h>
using std::cout;
using std::cin;
#define true 1
#define false 0
typedef int typeinfo;
typedef struct typenode *typeptr;
typedef struct typenode{
typeinfo info;
typeptr next;
};
typeptr kepala,ekor;
void buatlist();
void sisipnode(typeinfo IB);
void hapusnode(typeinfo IH);
void bacamaju();
void bacamundur();
void bacaback();
int listkosong();
int main()
{
int x;
buatlist();
sisipnode(50);
sisipnode(20);
sisipnode(5);
sisipnode(100);
sisipnode(70);
sisipnode(25);
sisipnode(40);
bacamaju();
cout << "\nNode yang ingin dihapus : "; cin >> x;
cout << "\nHapus node : " << x << "\n";
hapusnode(x);
bacamundur();

}
void buatlist()
{
kepala=(typenode *)malloc(sizeof(typenode));
ekor=(typenode *)malloc(sizeof(typenode));
kepala->info=-9999;
kepala->next=ekor;
ekor->info=9999;
ekor->next=NULL;
}
int listkosong()
{
if(kepala->next==ekor)
return(true);
else
return(false);
}
void sisipnode(typeinfo IB)
{
typeptr NB, bantu;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB; bantu=kepala;
while (IB > bantu->next->info)
bantu=bantu->next;
NB->next=bantu->next;
bantu->next=NB;
}
void hapusnode(typeinfo IH)
{
typeptr hapus, bantu;
if (listkosong())
cout << "List masih kosong";
else {
bantu=kepala;
while (bantu->next!=ekor && IH!=bantu->next->info)
bantu=bantu->next;
if (IH==bantu->next->info){
hapus=bantu->next;
bantu->next=hapus->next;
free(hapus);
} else
cout << "Node tidak ditemukan!\n";
}
}
void bacamaju()
{
typeptr bantu;
bantu=kepala->next;
while (bantu!=ekor){
cout << " " << bantu->info;
bantu=bantu->next;
}
}
void bacamundur()
{
typeptr depan,bantu;
depan=kepala;
kepala=ekor;
do {
bantu=depan;
while (bantu->next!=ekor)
bantu=bantu->next;
ekor->next=bantu;
ekor=bantu;
} while (ekor!=depan);
ekor->next=NULL;
bantu=kepala->next;
while (bantu!=ekor){
cout << " " << bantu->info;
bantu=bantu->next;
}
}
3.1.2 Output

3.1.3 Penjelasan
Untuk penghapusan node melalui inputan user dapat dilakukan dengan cara
menambahkan perintah untuk meminta node berapakah yang ingin dihapus, dapat
dilihat pada baris 34 – 36. Dimana inputan tersebut akan disimpan pada variabel
x, yang kemudian akan dimasukkan pada fungsi hapusnode().
3.2 Linked List Berkepala dan Berekor
3.2.1 Source code
/* Linked List CIRC*/
#include <iostream>
#include <malloc.h>
using std::cout;
using std::cin;
#define true 1
#define false 0
typedef int typeinfo;
typedef struct typenode *typeptr;
typedef struct typenode{
typeinfo info;
typeptr next;
};
typeptr awal,akhir;
void buatlistbaru();
void sisipnode(typeinfo IB);
void hapusnode(typeinfo IH);
void bacamaju();
void bacamundur();
int listkosong();
int main()
{
int x;
cout << "List Mula-mula :\n";
buatlistbaru();
sisipnode(50);
sisipnode(20);
sisipnode(5);
sisipnode(100);
sisipnode(70);
sisipnode(25);
bacamaju();
cout << "\nNode yang ingin dihapus : "; cin >> x;
cout << "\nHapus node : " << x << "\n";
hapusnode(x);
bacamundur();
return 0;
}
void buatlistbaru()
{
typeptr list;
list=(typenode *) malloc(sizeof(typenode));
list=NULL;
awal=list;
akhir=list;
}
int listkosong()
{
if(awal==NULL)
return(true);
else return(false);
}
void sisipnode(typeinfo IB)
{
typeptr NB, bantu;
NB=(typenode *) malloc(sizeof(typenode));
NB->info=IB;
NB->next=NULL;
if (listkosong()){
awal=NB;
akhir=NB;
} else if (IB <= awal->info){
NB->next=awal;
awal=NB;
} else {
bantu=awal;
while (bantu->next!=NULL && IB > bantu->next->info)
bantu=bantu->next;
NB->next=bantu->next;
bantu->next=NB;
if (IB>akhir->info)
akhir=NB;
}
}
void hapusnode(typeinfo IH)
{
typeptr hapus, bantu;
if (listkosong())
cout << "List masih kosong\n";
else if (awal->info==IH){
hapus=awal;
awal=hapus->next;
free(hapus);
} else {
bantu=awal;
while (bantu->next->next!=NULL && IH!=bantu->next->info)
bantu=bantu->next;
if (IH==bantu->next->info){
hapus=bantu->next;
if (hapus==akhir){
akhir=bantu;
akhir->next=NULL;
} else
bantu->next=hapus->next;
free(hapus);
} else
cout << "Node tidak ditemukan!\n";
}
}
void bacamaju()
{
typeptr bantu;
bantu=awal;
while (bantu!=NULL) {
cout << " " << bantu->info;
cout << " ";
bantu=bantu->next;
}
}
void bacamundur()
{
typeptr depan,bantu;
depan=awal;
awal=akhir;
do {
bantu=depan;
while (bantu->next!=akhir)
bantu=bantu->next;
akhir->next=bantu;
akhir=bantu;
} while (akhir!=depan);
akhir->next=NULL;
bantu=awal;
while (bantu!=NULL){
cout << " " << bantu->info;
cout << " ";
bantu=bantu->next;
}
}
3.2.2 Output

3.2.3 Penjelasan

Untuk penghapusan node melalui inputan user dapat dilakukan dengan cara
menambahkan perintah untuk meminta node berapakah yang ingin dihapus, dapat
dilihat pada baris 33 – 35. Dimana inputan tersebut akan disimpan pada variabel
x, yang kemudian akan dimasukkan pada fungsi hapusnode().

Anda mungkin juga menyukai