MODUL 5
Oleh:
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.
2.1.3 Penjelasan
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 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
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().