# Pengertian dan Konsep Pointer
A. Pengertian Pointer
Pointer adalah sebuah variabel yang berisi alamat lain. Suatu pointer dimaksudkan untuk menunjukan ke suatu alamat memori sehingga alamat dari suatu variabel dapat diketahui dengan mudah.
Intinya :
- Pointer adalah suatu variabel yang menunjuk ke alamat memory variabel yang lainnya.
- Variabel pointer berisi suatu alamat (alokasi memory).
B. Fungsi Pointer
Kegunaan pointer yang utama adalah untuk menyimpan alamat memori dari sebuah variabel dan alamat
dari sebuah fungsi. Pointer dapat meningkatkan kinerja untuk operasi yang dilakukan secara berulang.
C. Operator Pointer
Ada 2 operator pointer yang dikenal secara luas, yaitu operator “&” dan operator “*”.
a. Operator &
Operator & merupakan operator alamat. Pada saat pendeklarasian variabel, user tidak
diharuskan menentukan lokasi sesungguhnya pada memory, hal ini akan dilakukan secara
otomatis oleh kompiler dan operating sysem pada saat run-time.
Jika ingin mengetahui dimana suatu variabel akan disimpan, dapat dilakukan dengan memberikan
tanda ampersand (&) didepan variable , yang berarti "address of".
Contoh :
Misalkan variabel DATA_1 diletakkan pada alamat memory 1770, kemudian dituliskan instruksi
sbb :
DATA_1 = 27; Variabel DATA_1 berisi data 27
DATA_2 = DATA_1; Variabel DATA_2 diberi isi seperti DATA_1, yaitu 27
DATA_3 = &DATA_1; Variabel DATA_3 berisi alamat memory DATA_1, yaitu 1770
b. Operator *
Operator * merupakan operator reference. Dengan menggunakan pointer,kita dapat mengakses
nilai yang tersimpan secara langsung dengan memberikan awalan operator asterisk (*) pada
identifier pointer, yang berarti "value pointed by".
Contoh :
Melanjutkan deklarasi sebelumnya, jika ada penulisan variabel berikut
DATA_4 = *DATA_3
Dapat dikatakan bahwa DATA_4 sama dengan nilai yang ditunjuk oleh DATA_3.
DATA_3 berisi alamat memory 1770, sementara memory 1770 menampung data bernilai 27.
Jadi DATA_4 berisi nilai yang berada pada alamat 1770, yaitu 27.
D. Contoh Penerapan Program
#include <stdio.h>
main(){
int *pointer;
int DATA1;
DATA1=27;
printf(" Isi variabel DATA1 = %d",DATA1);
printf("\n Alamat variabel DATA1 = %d",&DATA1);
printf("\n Alamat variabel *pointer = %d",&pointer);
printf("\n Isi variabel *pointer = %d",pointer);
pointer=&DATA1;
printf("\n Alamat variabel *pointer = %d",&pointer);
printf("\n Isi variabel *pointer = %d",pointer);
printf("\n Isi dari alamat %d = %d",pointer,*pointer);
printf("\n");
return 0;
}
SS Program :
Pointer adalah sebuah variabel yang berisi alamat lain. Suatu pointer dimaksudkan untuk menunjukan ke suatu alamat memori sehingga alamat dari suatu variabel dapat diketahui dengan mudah.
Intinya :
- Pointer adalah suatu variabel yang menunjuk ke alamat memory variabel yang lainnya.
- Variabel pointer berisi suatu alamat (alokasi memory).
B. Fungsi Pointer
Kegunaan pointer yang utama adalah untuk menyimpan alamat memori dari sebuah variabel dan alamat
dari sebuah fungsi. Pointer dapat meningkatkan kinerja untuk operasi yang dilakukan secara berulang.
C. Operator Pointer
Ada 2 operator pointer yang dikenal secara luas, yaitu operator “&” dan operator “*”.
a. Operator &
Operator & merupakan operator alamat. Pada saat pendeklarasian variabel, user tidak
diharuskan menentukan lokasi sesungguhnya pada memory, hal ini akan dilakukan secara
otomatis oleh kompiler dan operating sysem pada saat run-time.
Jika ingin mengetahui dimana suatu variabel akan disimpan, dapat dilakukan dengan memberikan
tanda ampersand (&) didepan variable , yang berarti "address of".
Contoh :
Misalkan variabel DATA_1 diletakkan pada alamat memory 1770, kemudian dituliskan instruksi
sbb :
DATA_1 = 27; Variabel DATA_1 berisi data 27
DATA_2 = DATA_1; Variabel DATA_2 diberi isi seperti DATA_1, yaitu 27
DATA_3 = &DATA_1; Variabel DATA_3 berisi alamat memory DATA_1, yaitu 1770
b. Operator *
Operator * merupakan operator reference. Dengan menggunakan pointer,kita dapat mengakses
nilai yang tersimpan secara langsung dengan memberikan awalan operator asterisk (*) pada
identifier pointer, yang berarti "value pointed by".
Contoh :
Melanjutkan deklarasi sebelumnya, jika ada penulisan variabel berikut
DATA_4 = *DATA_3
Dapat dikatakan bahwa DATA_4 sama dengan nilai yang ditunjuk oleh DATA_3.
DATA_3 berisi alamat memory 1770, sementara memory 1770 menampung data bernilai 27.
Jadi DATA_4 berisi nilai yang berada pada alamat 1770, yaitu 27.
D. Contoh Penerapan Program
#include <stdio.h>
main(){
int *pointer;
int DATA1;
DATA1=27;
printf(" Isi variabel DATA1 = %d",DATA1);
printf("\n Alamat variabel DATA1 = %d",&DATA1);
printf("\n Alamat variabel *pointer = %d",&pointer);
printf("\n Isi variabel *pointer = %d",pointer);
pointer=&DATA1;
printf("\n Alamat variabel *pointer = %d",&pointer);
printf("\n Isi variabel *pointer = %d",pointer);
printf("\n Isi dari alamat %d = %d",pointer,*pointer);
printf("\n");
return 0;
}
SS Program :
# Pengertian dan Konsep Linked List
Pengertian Single LinkList dalam Struktur Data
Linked List saling terhubung dengan bantuan variabel pointer Masing-masing data dalam Linked List disebut dengan node (simpul) yang menempati alokasi memori secara dinamis dan biasanya berupa struct yang terdiri dari beberapa field.
Single : artinya field pointer-nya hanya satu buah saja dan satu arah serta pada akhir node, pointernya menunjuk NULL.
Linked List : artinya node-node tersebut saling terhubung satu sama lain. 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.
Jenis Single LinkList
Deklarasi Single LinkList
Model struktur dari linked list tersebut dalam Java adalah sebagai berikut:
public class Node {
private int data; /* integer data diisikan dalam node */
Node nextNode; /* node selanjutnya dalam list */
Node(){
this.data = 0; this.nextNode = null;
}
Pembuatan Single Linked List
Keyword new gunanya untuk mempersiapkan sebuah node baru berserta alokasi memorinya, kemudian node tersebut diisi data dan pointer nextnya ditunjuk ke NULL.
public void buatNode (int dt) {
Node nodebaru = new Node();
nodebaru.data = dt;
nodebaru.next = pointer;
pointer = nodebaru;
}
Penambahan data dari depan
Pada prinsipnya adalah mengkaitkan node baru dengan head, kemudian head akan menunju pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan.
public boolean sisip (int dt1, int dt2) {
Node n = pointer;
while ((n!=null) && (n.data!= dt2))
n = n.next;
if (n==null) return false;
Node nn = new Node ();
nn.data=dt1;
nn.next=n.next;
n.next=nn;
return true;
}
Menghapus data dari depan
Function di atas akan menghapus data terdepan (pertama) yang ditunjuk oleh head pada linked list, Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer. Sebelum data terdepan dihapus, head harus ditunjukkan ke node sesudahnya terlebih dahulu agar list tidak putus, sehingga node setelah head lama akan menjadi head baru (data terdepan yang baru). Jika head masih NULL maka berarti data masih kosong!
public int hapusDiDepan () {
Node hapus = pointer;
pointer = pointer.next;
return hapus.data;
}
- Head akan selalu menunjuk pada node pertama
Kelemahan dari array statis adalah penggunaan ruang memori yang sudah digunakan tidak dapat dihapus apabila nama variable array tersebut sudah tidak digunakan kembali dalam suatu program (penyebab kemubaziran).
Untuk pemecahannya maka digunakan struktur data dinamis dengan menggunakan variable dinamis.
Variabel dinamis tidak dapat dideklarasikan secara eksplisit seperti halnya variable statis dan tidak dapat ditunjuk oleh identifier secara langsung, tetapi dapat ditunjuk secara khusus oleh variable dinamis yaitu POINTER.
-Struktur ini terdiri dari rangkaian elemen yang saling berhubungan / berkaitan, dimana setiap elemen dihubungkan dengan elemen lainnya oleh sebuah pointer.
-Pointer, sel yang nilainya merupakan alamat sel yang lain dimana sel yang lain itu dapat berupa data atau berupa pointer juga
-Setiap elemen dalam linked list selalu berisi pointer
Istilah – istilah
*Simpul, terdiri dari dua bagian :
a. Bagian/medan data (info)
b. Bagian/medan sambungan (pointer yang menunjuk kesimpul berikutnya)
*Awal (First), variable yang berisi alamat yang menunjuk lokasi simpul pertama linked list
*Nil / Null, Tidak bernilai yaitu menyatakan tidak mengacu kealamat manapun.
*Akhir, sebuah simpul yang menunjuk pada simpul terakhir
Linked List saling terhubung dengan bantuan variabel pointer Masing-masing data dalam Linked List disebut dengan node (simpul) yang menempati alokasi memori secara dinamis dan biasanya berupa struct yang terdiri dari beberapa field.
Single : artinya field pointer-nya hanya satu buah saja dan satu arah serta pada akhir node, pointernya menunjuk NULL.
Linked List : artinya node-node tersebut saling terhubung satu sama lain. 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.
Jenis Single LinkList
- Single linked list dengan HEAD
- Single linked list dengan HEAD dan TAIL
Deklarasi Single LinkList
Model struktur dari linked list tersebut dalam Java adalah sebagai berikut:
public class Node {
private int data; /* integer data diisikan dalam node */
Node nextNode; /* node selanjutnya dalam list */
Node(){
this.data = 0; this.nextNode = null;
}
Pembuatan Single Linked List
Keyword new gunanya untuk mempersiapkan sebuah node baru berserta alokasi memorinya, kemudian node tersebut diisi data dan pointer nextnya ditunjuk ke NULL.
public void buatNode (int dt) {
Node nodebaru = new Node();
nodebaru.data = dt;
nodebaru.next = pointer;
pointer = nodebaru;
}
Penambahan data dari depan
Pada prinsipnya adalah mengkaitkan node baru dengan head, kemudian head akan menunju pada data baru tersebut sehingga head akan tetap selalu menjadi data terdepan.
public boolean sisip (int dt1, int dt2) {
Node n = pointer;
while ((n!=null) && (n.data!= dt2))
n = n.next;
if (n==null) return false;
Node nn = new Node ();
nn.data=dt1;
nn.next=n.next;
n.next=nn;
return true;
}
Menghapus data dari depan
Function di atas akan menghapus data terdepan (pertama) yang ditunjuk oleh head pada linked list, Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer. Sebelum data terdepan dihapus, head harus ditunjukkan ke node sesudahnya terlebih dahulu agar list tidak putus, sehingga node setelah head lama akan menjadi head baru (data terdepan yang baru). Jika head masih NULL maka berarti data masih kosong!
public int hapusDiDepan () {
Node hapus = pointer;
pointer = pointer.next;
return hapus.data;
}
# 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.
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.
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.
Deklarasi Node :
typedef struct TNode{
int data;
TNode *next;
};
Fungsi Inisialisasi Single Linked List
void init()
{
head = NULL;
}
void init()
{
head = NULL;
}
Function untuk mengetahui kondisi Single Linked List
Jika pointer head tidak menunjuk pada suatu node maka kosong
int isEmpty()
{
if (head == NULL) return 1;
else return 0;
}
Jika pointer head tidak menunjuk pada suatu node maka kosong
int isEmpty()
{
if (head == NULL) return 1;
else return 0;
}
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.
Menambah Node di Depan dengan C++
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”);
}
- 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.
Menambah Node di Belakang
- Penambahan data dilakukan di belakang, namun pada saat pertama 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.
Menambahan node dibelakang dengan C++
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“);
}
- Penambahan data dilakukan di belakang, namun pada saat pertama 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.
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!
Menghapus Node didepan dengan C++
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";
}
- 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!
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.
Menghapus node dibelakang dengan C++
void hapusBelakang(){
TNode *hapus,*bantu;
int d;
if (isEmpty()==0){
if(head->next != NULL){
bantu = head;
while(bantu->next->next!=NULL){
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“);
}
# Single Linked List non Circular Menggunakan Head
- Dibutuhkan satu buah variabel pointer : head
- Head akan selalu menunjuk pada node pertama
Deklarasi Pointer Penunjuk Kepala Single Linked List
Manipulasi linked list tidak bisa dilakukan langsung ke node yang dituju,
melainkan harus melalui node pertama dalam linked list. Deklarasinya sebagai berikut:
TNode *head;
Fungsi Inisialisasi Single LinkedList
void init(){
head = NULL;
}
Function untuk mengetahui kosong tidaknya Single LinkedList
int isEmpty(){
if(head == NULL) return 1;
else return 0;
}
PENAMBAHAN DATA
Penambahan data di depan
Penambahan node baru akan dikaitan di node paling depan, namun pada saat
pertama kali (data masih kosong), maka penambahan data dilakukan pada
head nya.
Pada prinsipnya adalah mengkaitkan data baru dengan head, kemudian head
akan menunjuk pada data baru tersebut sehingga head akan tetap selalu
menjadi data terdepan. Untuk menghubungkan node terakhir dengan node
terdepan dibutuhkan pointer bantu.
void insertDepan(int databaru){
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
head->next=head;
}
else {
bantu = head;
while(bantu->next!=head){
bantu=bantu->next;
}
baru->next = head;
head = baru;
bantu->next = head;
}
cout<<"Data masuk\n";
}
Penambahan data di belakang Penambahan data dilakukan di belakang, namun pada saat pertama kali data langsung ditunjuk pada head-nya. Penambahan di belakang lebih sulit karena kita membutuhkan pointer bantu untuk mengetahui data terbelakang, kemudian dikaitkan dengan data baru. Untuk mengetahui data terbelakang perlu digunakan perulangan.
void insertBelakang (int databaru)
{
TNode *baru,*bantu;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
head->next=head;
}
else {
bantu = head;
while(bantu->next != head){
bantu=bantu->next;
}
bantu->next = baru;
baru->next = head;
}
cout<<"Data masuk\n";
}
“Bagaimana dengan penambahan di tengah?”
MENAMPILKAN DATA
Function untuk menampilkan isi single linked list
void tampil(){ TNode *b;
b = head;
if(isEmpty()==0)
{
do
{
cout<data<<" ";
b=b->next;
}
while(b!=head);
cout<<<"Masih kosong\n";
}
- Function di atas digunakan untuk menampilkan semua isi list, di mana linked list ditelusuri satu-persatu dari awal node sampai akhir node. Penelusuran ini dilakukan dengan menggunakan suatu variabel node bantu, karena pada prinsipnya variabel node head yang menjadi tanda awal list tidak boleh berubah/berganti posisi.
- Penelusuran dilakukan terus sampai node terakhir ditemukan menunjuk ke head lagi. Jika belum sama dengan head, 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!
PENGHAPUSAN DATA
Function untuk menghapus data terdepan
void hapusDepan ()
{ TNode *hapus,*bantu;
if (isEmpty()==0)
{
int d;
hapus = head; d = head->data;
if(head->next != head){
bantu = head;
while(bantu->next!=head){
bantu=bantu->next;
}
head = head->next;
delete hapus;
bantu->next = head;
}else{
head=NULL;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}
- Function di atas akan menghapus data teratas (pertama) yang ditunjuk oleh head pada linked list
- Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus ditampung dahulu pada variabel hapus dan barulah kemudian menghapus variabel hapus dengan menggunakan perintah delete.
- Sebelum data terdepan dihapus, head harus ditunjukkan ke data sesudahnya terlebih dahulu sehingga data setelah head lama akan menjadi head baru (data terdepan yang baru).
- Jika head masih NULL maka berarti data masih kosong!
Penghapusan data di belakang:
void hapusBelakang()
{ TNode *hapus,*bantu;
if (isEmpty()==0)
{
int d;
hapus = head;
if(head->next == head){
head = NULL;
}
else
{
bantu = head;
while(bantu->next->next != head){
bantu = bantu->next;
}
hapus = bantu->next;
d = bantu->data;
bantu->next = head;
delete hapus;
}
cout<<<" terhapus\n";
}
else
cout<<"Masih kosong\n";
}
- Membutuhkan pointer bantu dan hapus.
- Pointer hapus digunakan untuk menunjuk node yang akan dihapus, dan pointer bantu digunakan untuk menunjuk node sebelum node yang dihapus.
- Pointer bantu akan digunakan untuk menunjuk ke nilai NULL.
- Pointer bantu akan selalu bergerak bersama dengan pointer hapus tapi letak pointer bantu harus selalu dibelakang pointer hapus.
Function untuk menghapus semua elemen Linked List
void clear(){ TNode *bantu,*hapus;
bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
}
# 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.
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;
}
Menambah Node di Depan Dengan Head dan Tail
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 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“);
}
Menghapus Node di Depan (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“);
}
Menghapus Node di Belakang (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";
}
- 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.
Penggambaran untuk menambah dan menghapus node di posisi tengah pada :
- Single Linked List dengan Head
- Single Linked List dengan Head & Trail
ILUSTRASI/PENGGAMBARAN UNTUK MENAMBAH DAN MENGHAPUS NODE DI POSISI TENGAH PADA.
SINGLE LINKED DENGAN HEAD
# include <iostream.h>
# include <conio.h>
struct TNode{
char data[15];
TNode *next;
};
TNode *head;
int opsi = 0;
void init(){
head = NULL;
}
bool isEmpty(){
if (head ==NULL) return true;
else return false;
}
void tambahdepan(){
TNode *baru;
baru = new TNode;
cout << "Masukkan DATA : ";
cin >> baru-> data;
baru->next = NULL;
clrscr();
if(isEmpty()==true){
head=baru;
head->next = NULL;
}else {
baru->next = head;
head = baru;
}
}
void tambahbelakang(){
TNode *baru,*bantu;
baru = new TNode;
cout << "Masukkan DATA : ";
cin >> baru-> data;
baru->next = NULL;
clrscr();
if(isEmpty()== true){
head=baru;
head->next = NULL;
} else {
bantu=head;
while(bantu->next!=NULL){
bantu=bantu->next;
}
bantu->next = baru;
}
}
void tambahtengah(){
TNode *baru, *bantu;
int posisiSisip;
if(isEmpty()== false){
cout<<"Akan disisip setelah Data Ke ? : "; cin>>posisiSisip;
bantu=head;
baru=new TNode;
for(int i=1;i<posisiSisip;i++){
if(bantu->next!=NULL)
bantu=bantu->next;
else break;
}
cout << "Masukkan DATA : ";
cin >> baru-> data;
baru->next=bantu->next;
bantu->next=baru;
clrscr();
}
else cout<<"Mau sisip tengah Belum ada data !! …silahkan masukkan Data dula aja…..";
}
void hapusdepan() {
TNode *hapus;
if (isEmpty() == false){
if(head->next !=NULL){
hapus = head;
head = head->next;
delete hapus;
clrscr();
} else {
head = NULL;
}
}else {
cout<<"Data anda masih kosong !!!!\n";
}
}
void hapusbelakang(){
TNode *hapus, *bantu;
if (isEmpty()==false){
if(head->next !=NULL){
bantu = head;
while(bantu->next->next!=NULL){
bantu = bantu->next;
}
hapus = bantu->next;
bantu->next = NULL;
delete hapus;
clrscr();
} else {
head = NULL;
}
} else {
cout<<"Data anda masih kosong !!!!\n";
}
}
void hapustengah(){
int banyakdata,posisiSisip,poshapus;
TNode *hapus, *bantu;
if(isEmpty()== false){
cout<<" Akan dihapus pada data ke : "; cin>>posisiSisip;
banyakdata=1;
bantu=head;
while(bantu->next!=NULL)
{
bantu=bantu->next;
banyakdata++;
}
if((posisiSisip<1)||(posisiSisip>banyakdata)){
cout<<"Belum ada data !! …silahkan masukkan Data dula aja…..\n";
}else {
bantu=head;
poshapus=1;
while(poshapus<(posisiSisip-1))
{
bantu=bantu->next;
poshapus++;
}
hapus=bantu->next;
bantu->next=hapus->next;
delete hapus;
clrscr();
}
}
else cout<<"Data Masih kosong, tidak bisa hapus data dari tengah! ";
}
void display(){
clrscr();
TNode *bantu;
bantu = head;
if(isEmpty()==true){
cout<<"Data masih kosong\n";
} else {
cout<<endl<<"DATA LINKED LIST\n";
while(bantu!=NULL){
cout<<"--------------- "<<endl;
cout<<"DATA : " << bantu->data << " ";
cout<<endl;
bantu=bantu->next;
cout<<"--------------- "<<endl;
}
cout<<endl;
}
}
void main(){
int();
do{
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"-:: MENU PILIHAN::-" <<endl;
cout<<endl;
cout<<"1. Tambah Simpul dari Depan." <<endl;
cout<<"2. Tambah Simpul dari Belakang." <<endl;
cout<<"3. Tambah Simpul dari Tengah." <<endl;
cout<<"4. Hapus Simpul dari Depan." <<endl;
cout<<"5. Hapus Simpul dari Belakang." <<endl;
cout<<"6. Hapus Simpul dari Tengah." <<endl;
cout<<"7. Tampil Data." <<endl;
cout<<"8. Keluar." <<endl;
cout<<endl;
cout<< "Pilihan Menu : ";
cin >> opsi;
switch(opsi){
case 1 : tambahdepan();break;
case 2 : tambahbelakang();break;
case 3 : tambahtengah();break;
case 4 : hapusdepan();break;
case 5 : hapusbelakang();break;
case 6 : hapustengah();break;
case 7 : display();break;
}
}while (opsi != 8);
}
- Single Linked List dengan Head
- Single Linked List dengan Head & Trail
# include <iostream.h>
# include <conio.h>
struct TNode{
char data[15];
TNode *next;
};
TNode *head;
int opsi = 0;
void init(){
head = NULL;
}
bool isEmpty(){
if (head ==NULL) return true;
else return false;
}
void tambahdepan(){
TNode *baru;
baru = new TNode;
cout << "Masukkan DATA : ";
cin >> baru-> data;
baru->next = NULL;
clrscr();
if(isEmpty()==true){
head=baru;
head->next = NULL;
}else {
baru->next = head;
head = baru;
}
}
void tambahbelakang(){
TNode *baru,*bantu;
baru = new TNode;
cout << "Masukkan DATA : ";
cin >> baru-> data;
baru->next = NULL;
clrscr();
if(isEmpty()== true){
head=baru;
head->next = NULL;
} else {
bantu=head;
while(bantu->next!=NULL){
bantu=bantu->next;
}
bantu->next = baru;
}
}
void tambahtengah(){
TNode *baru, *bantu;
int posisiSisip;
if(isEmpty()== false){
cout<<"Akan disisip setelah Data Ke ? : "; cin>>posisiSisip;
bantu=head;
baru=new TNode;
for(int i=1;i<posisiSisip;i++){
if(bantu->next!=NULL)
bantu=bantu->next;
else break;
}
cout << "Masukkan DATA : ";
cin >> baru-> data;
baru->next=bantu->next;
bantu->next=baru;
clrscr();
}
else cout<<"Mau sisip tengah Belum ada data !! …silahkan masukkan Data dula aja…..";
}
void hapusdepan() {
TNode *hapus;
if (isEmpty() == false){
if(head->next !=NULL){
hapus = head;
head = head->next;
delete hapus;
clrscr();
} else {
head = NULL;
}
}else {
cout<<"Data anda masih kosong !!!!\n";
}
}
void hapusbelakang(){
TNode *hapus, *bantu;
if (isEmpty()==false){
if(head->next !=NULL){
bantu = head;
while(bantu->next->next!=NULL){
bantu = bantu->next;
}
hapus = bantu->next;
bantu->next = NULL;
delete hapus;
clrscr();
} else {
head = NULL;
}
} else {
cout<<"Data anda masih kosong !!!!\n";
}
}
void hapustengah(){
int banyakdata,posisiSisip,poshapus;
TNode *hapus, *bantu;
if(isEmpty()== false){
cout<<" Akan dihapus pada data ke : "; cin>>posisiSisip;
banyakdata=1;
bantu=head;
while(bantu->next!=NULL)
{
bantu=bantu->next;
banyakdata++;
}
if((posisiSisip<1)||(posisiSisip>banyakdata)){
cout<<"Belum ada data !! …silahkan masukkan Data dula aja…..\n";
}else {
bantu=head;
poshapus=1;
while(poshapus<(posisiSisip-1))
{
bantu=bantu->next;
poshapus++;
}
hapus=bantu->next;
bantu->next=hapus->next;
delete hapus;
clrscr();
}
}
else cout<<"Data Masih kosong, tidak bisa hapus data dari tengah! ";
}
void display(){
clrscr();
TNode *bantu;
bantu = head;
if(isEmpty()==true){
cout<<"Data masih kosong\n";
} else {
cout<<endl<<"DATA LINKED LIST\n";
while(bantu!=NULL){
cout<<"--------------- "<<endl;
cout<<"DATA : " << bantu->data << " ";
cout<<endl;
bantu=bantu->next;
cout<<"--------------- "<<endl;
}
cout<<endl;
}
}
void main(){
int();
do{
cout<<endl;
cout<<endl;
cout<<endl;
cout<<"-:: MENU PILIHAN::-" <<endl;
cout<<endl;
cout<<"1. Tambah Simpul dari Depan." <<endl;
cout<<"2. Tambah Simpul dari Belakang." <<endl;
cout<<"3. Tambah Simpul dari Tengah." <<endl;
cout<<"4. Hapus Simpul dari Depan." <<endl;
cout<<"5. Hapus Simpul dari Belakang." <<endl;
cout<<"6. Hapus Simpul dari Tengah." <<endl;
cout<<"7. Tampil Data." <<endl;
cout<<"8. Keluar." <<endl;
cout<<endl;
cout<< "Pilihan Menu : ";
cin >> opsi;
switch(opsi){
case 1 : tambahdepan();break;
case 2 : tambahbelakang();break;
case 3 : tambahtengah();break;
case 4 : hapusdepan();break;
case 5 : hapusbelakang();break;
case 6 : hapustengah();break;
case 7 : display();break;
}
}while (opsi != 8);
}
# Perbedaan Array dan Linked Lis
A. ARRAY
Variable bertipe array adalah suatu tipe data yang bersifat statis (urutan dan ukuran sudah pasti).Kelemahan dari array statis adalah penggunaan ruang memori yang sudah digunakan tidak dapat dihapus apabila nama variable array tersebut sudah tidak digunakan kembali dalam suatu program (penyebab kemubaziran).
Untuk pemecahannya maka digunakan struktur data dinamis dengan menggunakan variable dinamis.
Variabel dinamis tidak dapat dideklarasikan secara eksplisit seperti halnya variable statis dan tidak dapat ditunjuk oleh identifier secara langsung, tetapi dapat ditunjuk secara khusus oleh variable dinamis yaitu POINTER.
ARRAYB. LINKED LIST
- Elemen data bisa menggunakan RECORD.
- Bersifat Statis
- volumenya selalu tetap tidak tergantung pada jumlah data.
- alokasi memori dilakukan pada saat array didefinisikan.
- pembebasan memori dilakukan pada saat program berhenti.
- Cara akses bersifat random dengan menggunakan nomor index.
-Struktur ini terdiri dari rangkaian elemen yang saling berhubungan / berkaitan, dimana setiap elemen dihubungkan dengan elemen lainnya oleh sebuah pointer.
-Pointer, sel yang nilainya merupakan alamat sel yang lain dimana sel yang lain itu dapat berupa data atau berupa pointer juga
-Setiap elemen dalam linked list selalu berisi pointer
Istilah – istilah
*Simpul, terdiri dari dua bagian :
a. Bagian/medan data (info)
b. Bagian/medan sambungan (pointer yang menunjuk kesimpul berikutnya)
*Awal (First), variable yang berisi alamat yang menunjuk lokasi simpul pertama linked list
*Nil / Null, Tidak bernilai yaitu menyatakan tidak mengacu kealamat manapun.
*Akhir, sebuah simpul yang menunjuk pada simpul terakhir
LINKED LIST
- Elemen data selalu menggunakan RECORD.
- Bersifat Dinamis
- ukurannya berubah-ubah disesuaikan dengan kebutuhan.
- alokasi memori ditentukan pada saat data baru dibuat.
- pembebasan memori dilakukan setiap ada penghapusan data.
- Cara akses ke masing-masing class data dilakukan secara linier (selalu dimulai dari elemen pertama).
Tidak ada komentar:
Posting Komentar