Single Linked List
Linked List adalah salah satu bentuk struktur data, berisi kumpulan data
(node) yang tersusun secara sekuensial, saling sambungmenyambung,
dinamis dan terbatas.
- Linked List sering disebut juga Senarai Berantai
- 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 Linked List adalah sebuah LINKED LIST yang menggunakan sebuah variabel pointer saja untuk menyimpan banyak data dengan metode LINKED LIST, suatu daftar isi yang saling berhubungan.
Ilustrasi single LINKED LIST:
Pada gambar di atas,
data terletak pada sebuah lokasi dalam sebuah memory, tempat yang disediakan
memory untuk menyimpan data disebut node ? simpul, setiap node memiliki pointer
( penunjuk ) yang menunjuk ke node berikutnya sehingga terbentuk suatu untaian
yang disebut single LINKED LIST. Bila dalam single LINKED LIST pointer hanya
dapat bergerak ke satu arah saja, maju / mundur, kanan / kiri, sehingga
pencarian datanya juga hanya satu arah saja.
Ada 2 Tipe Single Linked List yaitu
·
Single
Linked List Circular
·
Single
Linked List Non Circular
1. Single Linked List Circular
Single Linked List Circular
adalah Single Linked List yang
pointer nextnya menunjuk pada dirinya sendiri. Jika Single Linked List tersebut
terdiri dari beberapa node,
maka pointer next pada node terakhir akan menunjuk ke node terdepannya.
maka pointer next pada node terakhir akan menunjuk ke node terdepannya.
Pengertian:
Single : artinya field pointer-nya hanya satu buah saja dan satu arah.
Circular : artinya pointer next-nya akan menunjuk pada dirinya sendiri sehingga berputar
Single : artinya field pointer-nya hanya satu buah saja dan satu arah.
Circular : artinya pointer next-nya akan menunjuk pada dirinya sendiri sehingga berputar
Ilustrasi Single
Linked List Circular
- Setiap node pada linked list mempunyai field yang berisi pointer ke node
berikutnya, dan juga memiliki field yang berisi data.
- Pada akhir linked list, node terakhir akan menunjuk ke node terdepan
sehingga linked list tersebut berputar. Node terakhir akan menunjuk lagi
ke head.
- Setiap node pada linked list mempunyai field yang berisi pointer ke node
berikutnya, dan juga memiliki field yang berisi data.
- Pada akhir linked list, node terakhir akan menunjuk ke node terdepan
sehingga linked list tersebut berputar. Node terakhir akan menunjuk lagi
ke head.
PEMBUATAN
SINGLE LINKED LIST CIRCULAR
Deklarasi node
Dibuat dari struct berikut ini:
typedef struct TNode{
int data;
TNode *next;
};
Deklarasi node
Dibuat dari struct berikut ini:
typedef struct TNode{
int data;
TNode *next;
};
Penjelasan:
- Pembuatan struct bernama TNode yang berisi 2 field, yaitu field data
bertipe integer dan field next yang bertipe pointer dari TNode
- Setelah pembuatan struct, buat variabel haed yang bertipe pointer dari
TNode yang berguna sebagai kepala linked list.
- Pembuatan struct bernama TNode yang berisi 2 field, yaitu field data
bertipe integer dan field next yang bertipe pointer dari TNode
- Setelah pembuatan struct, buat variabel haed yang bertipe pointer dari
TNode yang berguna sebagai kepala linked list.
Pembentukan
node baru
Digunakan keyword new yang berarti mempersiapkan sebuah node baru
berserta alokasi memorinya.
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
SINGLE LINKED LIST 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 MENGGUNAKAN HEAD DAN TAIL
- Dibutuhkan dua buah variabel pointer: head dan tail
- Head akan selalu menunjuk pada node pertama, sedangkan tail akan
selalu menunjuk pada node terakhir.
Inisialisasi LinkedList
TNode *head, *tail;
Fungsi Inisialisasi LinkedList
void init(){
head = NULL;
tail = NULL;
}
Function untuk mengetahui kosong tidaknya LinkedList
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
PENAMBAHAN DATA
Pengkaitan node baru ke linked list di depan
Penambahan data baru di depan akan selalu menjadi head.
void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next=head;
tail->next=tail;
}
else {
baru->next = head;
head = baru;
tail->next = head;
}
cout<<"Data masuk\n";
}
Penambahan Data di belakang Pada penambahan data di belakang, data akan selalu dikaitkan dengan tail, karena tail terletak di node paling belakang. Setelah dikaitkan dengan node baru, maka node baru tersebut akan menjadi tail.
void tambahBelakang(int databaru){ TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next=head;
tail->next=tail;
}
else
{
tail->next = baru;
tail = baru;
tail->next = head;
}
cout<<"Data masuk\n";
}
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.
Function untuk menampilkan isi linked list:
void tampil(){ TNode *b;
b = head; if(isEmpty()==0)
{
do
{ cout<data<<" ";
b=b->next;
}
while(b!=tail->next);
cout<<<"Masih kosong\n";
}
Pada prinsipnya sama dengan function tampil sebelumnya.
Function untuk menghapus data di depan
void hapusDepan(){ TNode *hapus;
if (isEmpty()==0){ int d;
hapus = head;
d = head->data;
if(head != tail){
hapus = head;
head = head->next;
tail->next = head;
delete hapus;
}else{
head=NULL;
tail=NULL;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}
- 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, maka harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus pada head, kemudian dilakukan pergeseran ke node berikutnya sehingga data setelah head menjadi head baru, kemudian menghapus variabel hapus dengan menggunakan perintah delete.
- Jika tail masih NULL maka berarti data masih kosong!
Function untuk menghapus data di belakang:
Dengan menggunakan Single Linked List ber-Head dan Tail, pengahapusan data di belakang akan mudah dilakukan, tidak seperti pada Single Linked List hanya ber-Head saja.
void hapusBelakang(){ TNode *hapus,*bantu;
if (isEmpty()==0){ int d;
if(head == tail){ d = tail->data;
head = NULL;
tail = NULL;
}
else
{
bantu = head;
while(bantu->next != tail){
bantu = bantu->next;
}
hapus = tail;
tail = bantu;
d = hapus->data;
tail->next = head;
delete hapus;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}
- Function di atas akan menghapus data terbelakang (terakhir) yang ditunjuk oleh tail pada linked list
- Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus pada tail, kemudian dibutuhkan pointer bantu untuk membantu pergeseran dari head ke node berikutnya sampai sebelum tail, sehingga tail dapat ditunjukkan ke bantu tersebut, dan bantu tersebut akan menjadi tail yang baru. Setelah itu hapus variabel hapus dengan menggunakan perintah delete.
- Jika tail masih NULL maka berarti data masih kosong!
Function untuk menghapus semua elemen LinkedList
void clear(){ TNode *bantu,*hapus;
if(isEmpty() == 0){ bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
tail = NULL;
}
}
- Menggunakan pointer bantu yang digunakan untuk bergerak sepanjang
list, dan menggunakan pointer hapus yang digunakan untuk menunjuk
node-node yang akan dihapus.
- Pada saat pointer hapus menunjuk pada node yang akan dihapus, pointer
bantu akan bergerak ke node selanjutnya, dan kemudian pointer hapus
akan didelete.
Digunakan keyword new yang berarti mempersiapkan sebuah node baru
berserta alokasi memorinya.
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
SINGLE LINKED LIST 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 MENGGUNAKAN HEAD DAN TAIL
- Dibutuhkan dua buah variabel pointer: head dan tail
- Head akan selalu menunjuk pada node pertama, sedangkan tail akan
selalu menunjuk pada node terakhir.
Inisialisasi LinkedList
TNode *head, *tail;
Fungsi Inisialisasi LinkedList
void init(){
head = NULL;
tail = NULL;
}
Function untuk mengetahui kosong tidaknya LinkedList
int isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
PENAMBAHAN DATA
Pengkaitan node baru ke linked list di depan
Penambahan data baru di depan akan selalu menjadi head.
void insertDepan(int databaru){
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next=head;
tail->next=tail;
}
else {
baru->next = head;
head = baru;
tail->next = head;
}
cout<<"Data masuk\n";
}
Penambahan Data di belakang Pada penambahan data di belakang, data akan selalu dikaitkan dengan tail, karena tail terletak di node paling belakang. Setelah dikaitkan dengan node baru, maka node baru tersebut akan menjadi tail.
void tambahBelakang(int databaru){ TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = baru;
if(isEmpty()==1){
head=baru;
tail=baru;
head->next=head;
tail->next=tail;
}
else
{
tail->next = baru;
tail = baru;
tail->next = head;
}
cout<<"Data masuk\n";
}
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.
Function untuk menampilkan isi linked list:
void tampil(){ TNode *b;
b = head; if(isEmpty()==0)
{
do
{ cout<data<<" ";
b=b->next;
}
while(b!=tail->next);
cout<<<"Masih kosong\n";
}
Pada prinsipnya sama dengan function tampil sebelumnya.
Function untuk menghapus data di depan
void hapusDepan(){ TNode *hapus;
if (isEmpty()==0){ int d;
hapus = head;
d = head->data;
if(head != tail){
hapus = head;
head = head->next;
tail->next = head;
delete hapus;
}else{
head=NULL;
tail=NULL;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}
- 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, maka harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus pada head, kemudian dilakukan pergeseran ke node berikutnya sehingga data setelah head menjadi head baru, kemudian menghapus variabel hapus dengan menggunakan perintah delete.
- Jika tail masih NULL maka berarti data masih kosong!
Function untuk menghapus data di belakang:
Dengan menggunakan Single Linked List ber-Head dan Tail, pengahapusan data di belakang akan mudah dilakukan, tidak seperti pada Single Linked List hanya ber-Head saja.
void hapusBelakang(){ TNode *hapus,*bantu;
if (isEmpty()==0){ int d;
if(head == tail){ d = tail->data;
head = NULL;
tail = NULL;
}
else
{
bantu = head;
while(bantu->next != tail){
bantu = bantu->next;
}
hapus = tail;
tail = bantu;
d = hapus->data;
tail->next = head;
delete hapus;
}
cout<<<" terhapus\n";
}
else cout<<"Masih kosong\n";
}
- Function di atas akan menghapus data terbelakang (terakhir) yang ditunjuk oleh tail pada linked list
- Penghapusan node tidak boleh dilakukan jika keadaan node sedang ditunjuk oleh pointer, maka harus dilakukan penunjukkan terlebih dahulu dengan variabel hapus pada tail, kemudian dibutuhkan pointer bantu untuk membantu pergeseran dari head ke node berikutnya sampai sebelum tail, sehingga tail dapat ditunjukkan ke bantu tersebut, dan bantu tersebut akan menjadi tail yang baru. Setelah itu hapus variabel hapus dengan menggunakan perintah delete.
- Jika tail masih NULL maka berarti data masih kosong!
Function untuk menghapus semua elemen LinkedList
void clear(){ TNode *bantu,*hapus;
if(isEmpty() == 0){ bantu = head;
while(bantu->next!=head){
hapus = bantu;
bantu = bantu->next;
delete hapus;
}
head = NULL;
tail = NULL;
}
}
- Menggunakan pointer bantu yang digunakan untuk bergerak sepanjang
list, dan menggunakan pointer hapus yang digunakan untuk menunjuk
node-node yang akan dihapus.
- Pada saat pointer hapus menunjuk pada node yang akan dihapus, pointer
bantu akan bergerak ke node selanjutnya, dan kemudian pointer hapus
akan didelete.
2. Single
Linked List Non Circular
Pengertian:
Single : artinya field pointer-nya hanya satu buah saja dan satu arah.
Linked List : artinya node-node tersebut saling terhubung satu sama lain.
Ilustrasi Linked List
- Setiap node pada linked list mempunyai field yang berisi pointer ke node
berikutnya, dan juga memiliki field yang berisi data.
- Pada akhir linked list, node terakhir akan menunjuk ke NULL yang akan
digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list
Single : artinya field pointer-nya hanya satu buah saja dan satu arah.
Linked List : artinya node-node tersebut saling terhubung satu sama lain.
Ilustrasi Linked List
- Setiap node pada linked list mempunyai field yang berisi pointer ke node
berikutnya, dan juga memiliki field yang berisi data.
- Pada akhir linked list, node terakhir akan menunjuk ke NULL yang akan
digunakan sebagai kondisi berhenti pada saat pembacaan isi linked list
Contoh
program single linked list non circular tambah list di depan :
#
include<stdio.h>
#
include<stdlib.h>
#
include<conio.h>
#
include<iostream.h>
#
include<ctype.h>
#
include<string.h>
struct
simpul
{
int angka;
struct simpul*berikut;
}
;
struct
simpul *awal=NULL;
int
bil;
void
tambah_list_didepan(int info);
void
isi_list();
void
tampil_list();
void
hapus_list();
void
main ()
{
clrscr();
isi_list();
clrscr();
tampil_list();
hapus_list();
getch();
}
void
tambah_list_didepan(int info)
{
struct simpul *baru;
baru=(struct simpul
*)malloc(sizeof(struct simpul));
baru->angka=info;
baru->berikut=awal;
awal=baru;
}
void
isi_list()
{
char jawab;
do
{
clrscr();
cout<<"\ninput bilangan
:";
cin>>bil;
tambah_list_didepan(bil);
cout<<"\ntambah data Y/T
:" ;
cin>>jawab;
}
while (toupper(jawab)!='T');
}
void
tampil_list()
{
struct simpul* baca;
int i;
baca=awal;
i=1;
while(baca!=NULL)
{
cout<<"\nbilangan
ke-"<<i<<"yang dibaca :"<<baca->angka;
i++;
baca=baca->berikut;
}
}
void
hapus_list()
{
struct simpul*hapus;
hapus=awal;
while(hapus!=NULL)
{
awal=hapus->berikut;
free(hapus);
hapus=awal;
}
}
Contoh
program single linked list non circular tambah di belakang :
#include
<stdio.h>
#include
<stdlib.h>
#include
<constream.h>
#include
<ctype.h>
#include
<string.h>
struct
siswa
{
char nrp[8],nama[20];
int umur;
float ipk;
};
struct
simpul
{
char nrp[8],nama[20];
int umur;
float ipk;
struct simpul *berikut;
};
struct
simpul *awal = NULL, *akhir = NULL;
struct
siswa mhs;
void
tambah_list_dibelakang(struct siswa info);
void
isi_list();
void
tampil_list();
void
hapus_list();
void
main()
{
clrscr();
isi_list();
clrscr();
tampil_list();
hapus_list();
getch();
}
void
tambah_list_dibelakang(struct siswa info)
{
struct simpul *baru;
baru = (struct simpul *) malloc(sizeof(struct
simpul));
strcpy (baru -> nrp,info.nrp);
strcpy (baru -> nama,info.nama);
baru -> umur = info.umur;
baru -> ipk
= info.ipk;
if (awal == NULL)
{
awal = baru;
}
else
{
akhir -> berikut = baru;
}
akhir = baru;
akhir -> berikut = NULL;
}
void
isi_list()
{
char jawab;
do
{
clrscr();
cout<<"NRP : ";cin>>mhs.nrp;
cout<<"Nama : ";cin>>mhs.nama;
cout<<"Umur : ";cin>>mhs.umur;
cout<<"IPK : ";cin>>mhs.ipk;
tambah_list_dibelakang(mhs);
cout<<"\nTambah Data [Y/T]? :
";
cin>>jawab;
}
while (toupper(jawab) != 'T');
}
void
tampil_list()
{
struct simpul *baca;
int i;
baca = awal;
i = 1;
while (baca != NULL)
{
cout<<"Data Ke :
"<<i<<endl;
cout<<"NRP : "<<baca ->
nrp<<endl;
cout<<"Nama : "<<baca ->
nama<<endl;
cout<<"Umur : "<<baca ->
umur<<endl;
cout<<"IPK : "<<baca ->
ipk<<endl;
cout<<endl;
i++;
baca = baca -> berikut;
}
}
void
hapus_list()
{
struct simpul *hapus;
hapus = awal;
while (hapus != NULL)
{
awal = hapus -> berikut;
free (hapus);
hapus = awal;
}
}
Contoh
program single linked list non circular tambah list ditengah :
#include
<stdio.h>
#include
<constream.h>
#include
<stdlib.h>
#include
<ctype.h>
#include
<string.h>
struct
siswa
{
char nama[20];
int umur;
};
struct
simpul
{
char nama[20];
int umur;
struct simpul *berikut;
};
struct
simpul *awal=NULL,*akhir=NULL;
struct
siswa mhs;
void
tambah_list_belakang(struct siswa info);
void
isi_list();
void
sisip_list(struct simpul *first,struct siswa info,char posisi[20]);
void
sisip_isi_list();
void
tampil_list();
void
hapus_list();
void
main()
{
clrscr();
isi_list();
clrscr();
tampil_list();
sisip_isi_list();
tampil_list();
hapus_list();
getch();
}
void
tambah_list_dibelakang(struct siswa info)
{
struct simpul *baru;
baru=(struct simpul*)malloc(sizeof(struct
simpul));
strcpy(baru->nama,info.nama);
baru->umur=info.umur;
if (awal==NULL)
{
awal=baru;
}
else
{
akhir->berikut=baru;
}
akhir=baru;
akhir ->berikut=NULL;
}
void
isi_list()
{
char jawab;
do
{
clrscr();
cout<<"Nama:
";gets(mhs.nama);
cout<<"Umur:
";cin>>mhs.umur;
tambah_list_dibelakang(mhs);
cout<<"\nTambah Data [Y/T]:
";
cin>>jawab;
}
while (toupper(jawab)!='T');
}
void
sisip_list(struct simpul *first,struct siswa info,char posisi[20])
{
struct
simpul *bantu,*baru;
baru
= new simpul;
strcpy(baru->nama,info.nama);
baru->umur=info.umur;
bantu=first;
do
{
if
(strcmp(posisi,bantu->nama)!=0)
{bantu=bantu->berikut;}
}
while
(bantu!=NULL && strcmp(posisi,bantu->nama)!=0);
baru->berikut=bantu->berikut;
bantu->berikut=baru;
}
void
sisip_isi_list()
{
char
cari[20];
struct
siswa ganti;
cout<<"\nInput
Data Baru :";
cout<<"\nNama
:";gets(ganti.nama);
cout<<"\nUmur
:";cin>>ganti.umur;
cout<<"\n";
cout<<"\nData
Akan Disisipkan Setelah Nama: ";
gets(cari);
sisip_list(awal,ganti,cari);
}
void
tampil_list()
{
struct simpul *baca;
int i;
baca=awal;
i=1;
while(baca!=NULL)
{
cout<<"\nNama :
"<<baca->nama;
cout<<"\nUmur :
"<<baca->umur;
cout<<"\n";
i++;
baca=baca->berikut;
}
}
void
hapus_list()
{
struct simpul *hapus;
hapus=awal;
while(hapus!=NULL)
{
awal=hapus->berikut;
free(hapus);
hapus=awal;
}
}
Contoh
program single linked list non circular untuk menghapus semua list ataupun salah
satu dengan menggunakan menu:
#include
<constream.h>
#include
<stdio.h>
#include
<stdlib.h>
#include
<ctype.h>
#include
<string.h>
struct
nasabah
{
char norek[12];
char nama[25];
char alamat[50];
double saldo;
};
struct
simpul
{
char norek[12];
char nama[25];
char alamat[50];
double saldo;
struct simpul *berikut;
};
struct
simpul *awal=NULL, *akhir=NULL;
struct
nasabah bank;
void
tambah_list_dibelakang(struct nasabah info);
void
isi_list();
void
sisip_list(struct simpul *first,struct nasabah info,char posisi[20]);
void
sisip_isi_list();
void
tampil_list();
void
hapus_simpul(char info);
void
hapus_data();
void
hapus_list();
void
menu();
void
main()
{
clrscr();
menu();
getch();
}
void
menu()
{
int pil;
clrscr();
cout<<"Programmer : Shandy
Johan_6311171"<<endl<<endl;
cout<<"Pilih Transaksi : "<<endl;
cout<<" 1. Isi List"<<endl;
cout<<" 2. Sisip List"<<endl;
cout<<" 3. Tampil List"<<endl;
cout<<" 4. Hapus Salah
Satu"<<endl;
cout<<" 5. Hapus Semua
List"<<endl;
cout<<" 6.
Exit"<<endl<<endl;
cout<<"Tentukan Pilihan : ";
cin>>pil;
switch (pil)
{
case 1:
isi_list();
break;
case 2:
sisip_isi_list();
break;
case 3:
tampil_list();
break;
case 4:
hapus_data();
break;
case 5:
hapus_list();
break;
case 6:
clrscr();
gotoxy(21,13);cout<<"Terima
Kasih Telah Menggunakan Program Ini";
break;
}
}
void
isi_list()
{
char jawab;
do
{
clrscr();
cout<<"No Rekening : ";
cin>>bank.norek;
cout<<"Nama : ";
cin>>bank.nama;
cout<<"Alamat : ";
cin>>bank.alamat;
cout<<"Saldo Awal : ";
cin>>bank.saldo;
tambah_list_dibelakang(bank);
cout<<"\n\nTambah Data [Y/T] :
";
cin>>jawab;
}
while (toupper(jawab)!='T');
menu();
}
void
tambah_list_dibelakang(struct nasabah info)
{
struct simpul *baru;
baru = (struct simpul *) malloc (sizeof(struct
simpul));
strcpy (baru -> norek,info.norek);
strcpy (baru -> nama,info.nama);
strcpy (baru -> alamat,info.alamat);
baru -> saldo = info.saldo;
if (awal == NULL)
{
awal = baru;
}
else
{
akhir -> berikut = baru;
}
akhir = baru;
akhir -> berikut = NULL;
}
void
tampil_list()
{
clrscr();
struct simpul *baca;
int i;
baca = awal;
i = 1;
while (baca != NULL)
{
cout<<"Data Ke :
"<<i<<endl;
cout<<"No Rekening : "<<baca -> norek<<endl;
cout<<"Nama : "<<baca ->
nama<<endl;
cout<<"Alamat : "<<baca ->
alamat<<endl;
cout<<"Saldo Awal : "<<baca ->
saldo<<endl;
cout<<endl;
i++;
baca = baca -> berikut;
}
getch();
menu();
}
void
hapus_list()
{
struct simpul *hapus;
hapus = awal;
while (hapus != NULL)
{
awal = hapus -> berikut;
free(hapus);
hapus = awal;
}
menu();
}
void
sisip_list(struct simpul *first, struct nasabah info, char posisi[20])
{
struct simpul *bantu,*baru;
baru = new simpul;
strcpy (baru -> norek,info.norek);
strcpy (baru -> nama,info.nama);
strcpy (baru -> alamat,info.alamat);
baru-> saldo = info.saldo;
bantu = first;
do
{
if (strcmp(posisi,bantu->norek)!=0)
{
bantu = bantu->berikut;
}
}
while (bantu !=NULL &
strcmp(posisi,bantu->norek)!=0);
baru->berikut = bantu -> berikut;
bantu -> berikut = baru;
}
void
sisip_isi_list()
{
char cari[20];
struct nasabah ganti;
clrscr();
cout<<"Input Data
Baru"<<endl;
cout<<"No Rekening : ";
cin>>ganti.norek;
cout<<"Nama : ";
cin>>ganti.nama;
cout<<"Alamat : ";
cin>>ganti.alamat;
cout<<"Saldo Awal : ";
cin>>ganti.saldo;
cout<<endl;
cout<<"Data Akan Disisipkan
Setelah No Rekening : ";
gets(cari);
sisip_list(awal,ganti,cari);
menu();
}
void
hapus_simpul(char info[20])
{
struct simpul *bantu,*hapus;
if (awal==NULL) { cout<<"\n Data
List Kosong ";}
else
{
if (strcmp(awal->norek,info)==0)
{
hapus=awal;
awal=hapus->berikut;
free(hapus);
}
else
{
bantu=awal;
while
((strcmp(info,bantu->berikut->norek)!=0) &&
(bantu->berikut!=NULL))
{
bantu=bantu->berikut;
}
hapus=bantu->berikut;
if (hapus!=NULL)
{
if (hapus!=akhir) {
bantu->berikut=hapus->berikut;}
else
{
akhir=bantu;
akhir->berikut=NULL;
}
free(hapus);
}
}
}
}
void
hapus_data()
{
char cari[20];
char jawab;
clrscr();
cout<<"\nAda data yang akan dihapus
Y/T :";cin>>jawab;
if (toupper(jawab)=='Y')
{
cout<<"\nNo.Rekening yang akan
dihapus :";
gets(cari);
hapus_simpul(cari);
menu();
}
}
30 komentar:
Terima Kasih Atas Postingan Yang Bermanfaat...
Visit My Blog... lautanilmumahasiswasttpln.blogspot.com
:-) :-) :-)
ijin copast om hehehe
Nice blog...
ijin sedot gan :D
The best for you :)
Tertolong saya gan...Makasih <(O.O)>
woyoo thanks
cakdarwis.blogspot.com
mkasih bntu bgt.
sebenarnya tanda -> artinya apa?
makasih bermanfaat banget
terimakasih postingnya mas ndut :-D
thank you,,
this isn't annoying :-D
Cakeep,
izin mempelajari
keren membantu,
husentulis.blogspot.co.id
keren membantu,
husentulis.blogspot.co.id
sangat membantu gan.. ngomong2 Double linked list nya mana nih :D
Gan kenapa ya pas pake program yg nasabah itu pas di menu nomor 2 selalu not responding?
Perkenalkan, saya dari tim kumpulbagi. Saya ingin tau, apakah kiranya anda berencana untuk mengoleksi files menggunakan hosting yang baru?
Jika ya, silahkan kunjungi website ini www.kbagi.com untuk info selengkapnya.
Di sana anda bisa dengan bebas share dan mendowload foto-foto keluarga dan trip, music, video, filem dll dalam jumlah dan waktu yang tidak terbatas, setelah registrasi terlebih dahulu. Gratis :)
izin copas . mrabdaz.blogspot.com
ijin sedot min.
XCODEPLUS - The Best Resource to Learn to Code
C++ & C# Tutorials and more...
http://www.xcodeplus.net/
Website Seputar Programing Indonesia
Bisa bantu yang inikah gan
1. Buatlah sebuah program yang mengimplementasikan Doubly Linked List dengan menggunakan struktur yang anggotanya terdiri atas:
a. Nama dengan panjang karakter 10,
b. Alamat dengan panjang karakter 20,
c. No telepon berupa String panjang 13 karakter.
Program linked list anda harus mengimplementasikan ascending sorting(urut naik) berdasarkan Nama
2. Jumlah maksimal rekaman yang dapat ditampung yaitu sebanyak 20 rekaman.
3. Pada program anda, berikut ini adalah menu wajib yang harus anda bangun:
e) Tambah Data Rekaman
f) Lihat List Rekaman
g) Cari Data Rekaman
h) Keluar
Penjelasan: pada menu a, program anda diminta harus mampu menambah data rekaman baru (Gunakan doubly linked list); pada menu b, program anda memiliki fasilitas untuk menampilkan semua rekaman yang sudah masuk(diinput pada menu a); pada menu c, program mampu mencari data yang diingikan user, jika data tidak ketemu pada list, maka program harus memberikan konfirmasi bahwa data tidak ditemukan, jika sebaliknya maka program menampilkan dengan data lengkap.
4. Pada metode pencarian yang digunakan, sebutkan metode pencarian apa yang digunakan!
5. Buatlah sebuah file dataku.txt yang berisi data anda juga untuk jawaban nomor 4 dan kelemahan program anda(jika ada).
cara mudah dapet dollat minimal 3 dollar/bln!! >>http://belajarbarengz.blogspot.co.id/2017/06/cara-mudah-memperoleh-dollar-dengan.html?m=1
Terima Kasih, Ilmu sangat bermanfaat....
c. Edit Harga(cari buku yang akan di edit berdasarkan nomer buku, lalu harganya saja yang diedit)
Mantap Sekali Danielxyz saya suka itu
ok min, makasih
Solder uap
makasih min semoga bermanfaat
makasih min semoga bermanfaat
makasih sudah share
pinset lurus
jejak
ijin copas
Posting Komentar