• Tidak ada hasil yang ditemukan

SINGLE LINKED LIST(Non Circular)

N/A
N/A
Protected

Academic year: 2023

Membagikan "SINGLE LINKED LIST(Non Circular)"

Copied!
56
0
0

Teks penuh

(1)

Pertemuan 4

SINGLE LINKED LIST(Non

Circular)

(2)

KONSEP POINTER DAN LINKED LIST Untuk mengolah data yang banyaknya tidak bisa ditentukan sebelumnya, maka disediakan satu fasilitas yang memungkinan

untuk menggunakan suatu perubah yang disebut dengan perubah dinamis (Dinamic variable)

Perubah Dinamis (Dinamic variable)

dialokasikan Suatu perubah yang akan

hanya pada saat diperlukan, yaitu setelah program dieksekusi.

(3)

Perbedaan Perubah Statis & Dinamis

Pada perubah statis, isi Memory pada lokasi tertentu (nilai perubah) adalah data sesungguhnya yang akan diolah. Pada perubah dinamis, nilai perubah adalah alamat lokasi lain yang menyimpan data sesungguhnya. Dengan demikian data yang sesungguhnya dapat dimasukkan secara langsung.

Dalam hal cara pemasukkan data dapat diilustrasikan seperti dibawah ini

(4)

DEKLARASI POINTER

Pointer digunakan sebagai penunjuk ke suatu alamat memori

Dalam pemrograman C++, Type Data Pointer dideklarasikan dengan bentuk umum :

Type Data * Nama Variabel;

Type Data dapat berupa sembarang type data, misalnya char, int atau float. Sedangkan Nama veriabel merupakan nama variabel pointer

(5)

Contoh penggunaan pointer dalam program C++:

Void main() {

int x,y,*z;

x = 75;

y = x;

//nilai x = 75

//nilai y diambil dari nilai x

z = &x; //nilai z menunjuk kealamat pointer dari nilai x

getch();

}

(6)

LINKED LIST (LINKED LIST)

Salah satu Struktur Data Dinamis yang paling sederhana adalah Linked List atau Struktur Berkait atau Senarai Berantai, yaitu suatu kumpulan komponen yang disusun secara berurutan dengan bantuan Pointer.

Linked List (Senarai Berantai) disebut juga dengan Senarai Satu Arah (One-Way List). Masing-masing komponen dinamakan dengan Simpul (Node).

(7)

Perbedaan Karakteristik

Array dan Linked List

(8)

Setiap simpul dalam suatu Linked List terbagi menjadi dua bagian,yaitu :

1. Medan Informasi

Berisi informasi yang akan disimpan dan diolah.

2. Medan Penyambung (Link Field)

Berisi alamat berikutnya. Bernilai 0, Jika Link tersebut tidak menunjuk ke Data (Simpul) lainnya. Penunjuk ini disebut Penunjuk Nol.

(9)

LINKED LIST (LINKED LIST) Lanjutan Linked juga mengandung sebuah variabel penunjuk List, yang biasanya diberi nama START (AWAL), yang berisi alamat dari simpul pertama dalam List.

(10)

Penyajian Linked List dalam Memory

(11)

Penyajian Linked List dalam Memory Lanjutan)

(12)

Bentuk Node

Single Linked List non Circular

• Single : field pointer-nya hanya satu dan satu arah,pada akhir node pointernya menunjuk NULL

• Linked List : node-node tersebut saling terhubung satu sama lain.

Menempati alamat memori tertentu

(13)

Single Linked List Non Circular (Lanjutan)

Setiap node pada linked list mempunyai field yang berisi pointer ke node berikutnya, dan juga memiliki field yang berisi data.

Node terakhir akan menunjuk ke NULL yang akan digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list.

(14)

Pembuatan

Single Linked List non Circular

Deklarasi Node :

typedef struct TNode{

int data;

TNode *next;

};

Keterangan:

• Pembuatan struct bernama TNode yang berisi 2 field, yaitu field data bertipe integer dan field next yang

bertipe pointer dari TNode

(15)

Pembuatan Single Linked List non Circular Lanjutan Setelah pembuatan struct, buat variabel head

yang bertipe pointer dari TNode yang berguna sebagai kepala linked list.

Digunakan perintah new untuk mempersiapkan sebuah node baru berserta alokasi memorinya, kemudian node tersebut diisi data dan pointer nextnya ditunjuk ke NULL.

TNode *baru;

baru = new TNode;

baru->data = databaru;

baru->next = NULL;

(16)

Single Linked List non Circular Menggunakan Head

• Dibutuhkan satu buah variabel pointer : head yang akan selalu menunjuk pada node pertama

(17)

Deklarasi Pointer Penunjuk Head Single Linked List

Manipulasi linked list tidak dapat dilakukan langsung ke node yang dituju, melainkan harus menggunakan suatu pointer penunjuk ke node pertama (Head) dalam linked list

Deklarasinya sebagai berikut:

TNode *head;

(18)

Fungsi Inisialisasi Single Linked List

Single

void init() {

head = NULL;

}

Function untuk mengetahui kondisi Linked List

Jika pointer head tidak menunjuk pada suatu node maka kosong

int isEmpty() {

if (head == NULL) return 1;

else return 0;

}

(19)

Single Linked List Non Circular dengan Head Menambah Node di Depan

Penambahan node baru akan dikaitan di node paling depan, namun pada saat pertama kali (data masih kosong), maka penambahan data dilakukan dengan cara:

node head ditunjukkan ke node baru tersebut.

Prinsipnya adalah mengkaitkan node baru dengan head, kemudian head akan menunjuk pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan.

(20)

Single Linked List Non Circular dengan Head

void insertDepan(int databaru) {

TNode *baru;

baru = new TNode;

baru->data = databaru;

baru->next = NULL;

if(isEmpty()==1) {

head=baru;

head->next = NULL;

} else

{

baru->next = head;

head = baru;

}

printf(”Data masuk\n”);

}

(21)

Ilustrasi Penambahan Node Didepan

(22)

Ilustrasi Penambahan node didepan (lanjutan)

(23)

Single Linked List Non Circular dengan Head Menambah Node di Belakang

Penambahan data dilakukan

namun pada saat pertamadi belakang, kali, node langsung ditunjuk oleh head.

Penambahan di belakang membutuhkan pointer bantu untuk mengetahui node terbelakang. Kemudian, dikaitkan dengan node baru.

Untuk mengetahui data terbelakang perlu digunakan perulangan.

(24)

Single Linked List Non Circular dengan Head

void insertBelakang (int databaru) {

TNode *baru,*bantu;

baru = new TNode;

baru->data = databaru;

baru->next = NULL;

if(isEmpty()==1) { head=baru;

head->next = NULL;

}

else {

bantu=head;

while(bantu->next!=NULL){

bantu=bantu->next;

}

bantu->next = baru;

}

printf("Data masuk\n“);

}

(25)

Ilustrasi Penambahan Node Dibelakang

(26)

Ilustrasi Penambahan node di belakang

(27)

Menghapus Node di Depan

• Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus

dilakukan penggunakan suatu pointer lain (hapus) yang digunakan untuk menunjuk node yang akan dihapus, barulah kemudian menghapus pointer hapus dengan menggunakan perintah delete.

• Sebelum data terdepan dihapus, terlebih dahulu head harus menunjuk ke node berikutnya agar list tidak putus, sehingga node setelah head lama akan menjadi head baru

• Jika head masih NULL maka berarti data masih kosong!

(28)

Menghapus Node Di depan

void hapusDepan () {

TNode *hapus;

int d;

if (isEmpty()==0){

if(head->next != NULL){

hapus = head;

d = hapus->data;

head = head->next;

delete hapus;

} else {

d = head->data;

head = NULL;

}

printf(“%d terhapus\n“,d);

} else cout<<"Masih kosong\n";

}

(29)

Ilustrasi menghapus node di depan

(30)

Menghapus Node di Belakang

• Membutuhkan pointer bantu dan hapus. Pointer hapus digunakan untuk menunjuk node yang akan dihapus, pointer bantu untuk menunjuk node sebelum node yang dihapus yang akan menjadi node terakhir.

• Pointer bantu digunakan untuk menunjuk ke nilai NULL.

Pointer bantu selalu bergerak sampai sebelum node yang akan dihapus, kemudian pointer hapus diletakkan setelah pointer bantu. Selanjutnya pointer hapus akan dihapus, pointer bantu akan menunjuk ke NULL.

(31)

Menghapus Node di Belakang

• bantu = bantu->next;

• }

• hapus = bantu->next; d = hapus-

>data; bantu->next = NULL; delete hapus;

• } else {

• d = head->data; head = NULL;

• }

• printf(“%d terhapus\n“,d);

• } else printf(“Masih kosong\n“);

void hapusBelakang(){

TNode *hapus,*bantu;

int d;

if (isEmpty()==0){

if(head->next != NULL){

bantu = head;

while(bantu->next->next!=NULL){

(32)

Ilustrasi menghapus node di belakang

(33)

Function untuk menghapus semua elemen Linked List

void clear() {

TNode *bantu,*hapus;

bantu = head;

while(bantu!=NULL) {

hapus = bantu;

bantu = bantu->next;

delete hapus;

}

head = NULL;

}

(34)

Menampilkan / Membaca Isi Linked List

• Linked list ditelusuri satu-persatu dari awal sampai akhir node. Penelusuran dilakukan dengan menggunakan pointer bantu, karena pointer head yang menjadi tanda awal list tidak boleh berubah/berganti posisi.

• Penelusuran dilakukan terus sampai ditemukan node terakhir yang menunjuk ke nilai NULL.

Jika tidak NULL, maka node bantu akan berpindah ke node selanjutnya dan membaca isi datanya dengan menggunakan field next sehingga dapat saling berkait.

• Jika head masih NULL berarti data masih kosong!

(35)

Menampilkan / Membaca Isi Linked List

void tampil(){

TNode *bantu;

bantu = head;

if(isEmpty()==0){

while(bantu!=NULL){

cout<<bantu->data<<"

";

bantu=bantu->next;

}

printf(“\n”);

} else printf(“Masih kosong\n“);

}

(36)

Single Linked List non Circular Menggunakan Head dan Tail

Dibutuhkan dua variabel pointer : head dan tail

Head selalu menunjuk pada node pertama, sedangkan tail selalu menunjuk pada node terakhir.

Kelebihan dari Single Linked List dengan Head & Tail adalah pada penambahan data di belakang, hanya dibutuhkan tail yang mengikat node baru saja tanpa harus menggunakan perulangan pointer bantu.

(37)

Single Linked List non Circular Menggunakan Head dan Tail

Inisialisasi Linked List

TNode *head, *tail;

Fungsi Inisialisasi Linked List void init(){

head = NULL;

tail = NULL;

}

Function untuk mengetahui kondisi LinkedList kosong / tidak

int isEmpty(){

if(tail == NULL) return 1;

else return 0;

}

(38)

void insertDepan(int databaru){

TNode *baru;

baru = new TNode;

baru->data = databaru;

baru->next = NULL;

if(isEmpty()==1){

head=tail=baru;

tail->next=NULL;

} else {

baru->next = head;

head = baru;

}

printf(”Data masuk\n”);

}

Menambah Node di depan dengan

Haid dan Tail

(39)

Ilustrasi penambahan node didepan dengan Head dan Tail

(40)

Ilustrasi Penambahan node di depan dengan Head dan Tail

(41)

Menambah Node di Belakang Dengan Head dan Tail

void tambahBelakang(int databaru){

TNode *baru,*bantu;

baru = new TNode;

baru->data = databaru;

baru->next = NULL;

if(isEmpty()==1){

head=baru;

tail=baru;

tail->next = NULL;

}

else {

tail->next = baru;

tail=baru;

}

printf("Data masuk\n“);

}

(42)

Ilustrasi penambahan node di depan dengan Head dan Tail

(43)

Ilustrasi Penamabahan node di depan dengan Head dan Tail

(44)

Menghapus Node di Depan (Dengan Head dan Tail) Penghapusan node tidak boleh dilakukan jika

keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih dahulu dengan pointer hapus pada head, kemudian dilakukan pergeseran head ke node berikutnya sehingga data setelah head menjadi head baru, kemudian menghapus pointer hapus dengan menggunakan perintah delete.

Jika tail masih NULL maka berarti list masih kosong!

(45)

Menghapus Node didepan dengan Head dan Tail

void hapusDepan(){

TNode *hapus;

int d;

if (isEmpty()==0){

if(head!=tail){

hapus = head;

d = hapus->data;

head = head->next;

delete hapus;

} else {

d = tail->data;

head=tail=NULL;

}

printf(“%d terhapus\n“,d);

} else printf("Masih kosong\n“);

}

(46)

Ilustrasi menghapus node didepan dengan Head dan Tail

(47)

Menghapus Node di Belakang (Dengan Head dan Tail)

Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus pada tail. Jika tail masih NULL maka berarti list masih kosong!

Dibutuhkan pointer bantu untuk membantu pergeseran dari head ke node berikutnya sampai sebelum tail, sehingga tail dapat ditunjukkan ke bantu, dan bantu tersebut akan menjadi tail yang baru.

Setelah itu hapus pointer hapus dengan menggunakan perintah delete.

(48)

Menghapus Node dibelakang dengan Head dan Tail

void hapusBelakang(){

TNode *bantu,*hapus;

int d;

if (isEmpty()==0){

bantu = head;

if(head!=tail){

while(bantu->next!=tail){

bantu = bantu->next;

}

hapus = tail;

tail=bantu;

d = hapus->data;

delete hapus;

tail->next = NULL;

}else {

d = tail->data;

head=tail=NULL;

}

cout<<d<<" terhapus\n";

} else cout<<"Masih kosong\n";

}

(49)

null

Ilustrasi Menghapus node di belakang

(50)

Function untuk menghapus semua elemen LinkedList dengan HEAD & TAIL

void clear() {

TNode *bantu,*hapus;

bantu = head;

while(bantu!=NULL) {

hapus = bantu;

bantu = bantu->next;

delete hapus;

}

head = NULL;

tail = NULL;

}

(51)

Latihan Soal I Struktur Data (Pertemuan 4)

1. Diketahui suatu deklarasi variabel int x,y,*z;

variabel yang merupakan penunjuk ke pointer adalah : d. x dan y

e. x, y dan z a. x

b. y c. z

2. Perintah yang tepat untuk mempersiapkan sebuah node baru berserta alokasi memorinya, adalah ….

d. New e. Insert a. Create

b. Null c. Input

(52)

2. Perintah yang tepat untuk mempersiapkan sebuah node baru berserta alokasi memorinya, adalah ….

a. Create b. Null

d. New e. Insert c. Input

3. Jika Tail = Null, maka kondisi Linked List adalah :

d. Tidak dapat ditambah e. Baru

a. Penuh b. Kosong c. Terisi

(53)

3. Jika Tail = Null, maka kondisi Linked List adalah :

d. Tidak dapat ditambah e. Baru

a. Penuh b. Kosong c. Terisi 4.

Gambar diatas menunjukkan bentuk penghapusan node pada posisi :

d. Tengah dan Depan e. Depan dan Belakang a. Belakang

b. Depan c. Tengah

(54)

4.

Gambar diatas menunjukkan bentuk penambahan node pada posisi :

d. Tengah dan Depan e. Depan dan Belakang a. Belakang

b. Depan c. Tengah

5. Perintah yang tepat untuk menyatakan Linked list berada dalam kondisi kosong, adalah ….

d. bantu=head e. bantu=tail a. head=tail

b. head=tail=null c. bantu=null

(55)

5. Perintah yang tepat untuk menyatakan Linked list berada dalam kondisi kosong, adalah ….

d. bantu=head e. bantu=tail a. head=tail

b. head=tail=null c. bantu=null

1. Diketahui suatu deklarasi variabel int x,y,*z;

variabel yang merupakan penunjuk ke pointer adalah : d. x dan y

e. x, y dan z a. x

b. y c. z

(56)

Latihan II Soal Struktur Data (Review Materi Pertemuan 4)

Dikumpulkan pada pertemuan selanjutnya

Buatlah Ilustrasi / Penggambaran untuk

menambah dan menghapus node di posisi tengah pada :

1. Single Linked List dengan Head

2. Single Linked List dengan Head & Trail

Gambar

Ilustrasi Penambahan Node Didepan
Ilustrasi Penambahan node didepan (lanjutan)
Ilustrasi Penambahan Node Dibelakang
Ilustrasi Penambahan node di belakang
+7

Referensi

Dokumen terkait

若環境提供更多資源或支持,障礙者便能自在地參與社會活動。圖片中 障礙者和非障礙者皆須到2樓參加面試,但因沒有無障礙電梯可供搭 乘,導致障礙者無法如期出席面試。雖然沒有拒絕障礙者參加面試,但 卻未提供合適的面試環境,導致障礙者的機會不平等,便是一種「間接 歧視」。 「間接歧視」指的是,表面上 看起來是中性的法律、政策或 做法,但對於身心障礙者帶來 負面影響 7。