BAB
V
LINKED
LIST
Konsep dasar struktur data dinamis adalah alokasi
memori yang dilakukan secara dinamis. Pada konsep ini, terdapat suatu struktur
yang disebut dengan struktur referensi diri (self-referntial structure),
mempunyai anggota pointer yang menunjuk ke struktur yang sama dengan dirinya
sendiri. Struktur data dinamis sederhana dapat dibagi menjadi empat jenis,
yaitu :
1. Linked list
2. Stack
3. Queue
4. Binary tree
DEFINISI
LINKED LIST
Linked list adalah suatu cara untuk menyimpan data
dengan struktur sehingga dapat secara otomatis menciptakan suatu tempat baru
untuk menyimpan data yang diperlukan. Program akan berisi suatu struct atau
definisi kelas yang berisi variabel yang memegang informasi yang ada
didalamnya, dan mempunyai suatu pointer yang menunjuk ke suatu struct sesuai
dengan tipe datanya. Struktur dinamis ini mempunyai beberapa keuntungan disbanding
struktur array yang bersifat statis. Struktur ini lebih dinamis, karena
banyaknya elemen dengan mudah ditambah atau dikurangi, berbeda dengan array
yang ukurannya bersifat tetap. Manipulasi setiap elemen seperti menyisipkan,
menghapus, maupun menambah dapat dilakukan dengan lebih mudah.
Contoh:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
typedef struct nod {
int data;
struct nod *next;
} NOD, *NODPTR;
void CiptaSenarai(NODPTR *s)
{
*s = NULL;
}
NODPTR NodBaru(int m)
{
NODPTR n;
n = (NODPTR) malloc(sizeof(NOD));
if(n != NULL) {
n -> data = m;
n -> next = NULL;
}
return n;
}
void SisipSenarai (NODPTR *s, NODPTR t, NODPTR p)
{
if (p==NULL) {
t -> next = *s;
*s = t;
}
else {
t -> next = p -> next;
p ->next = t;
}
}
void CetakSenarai (NODPTR s)
{
NODPTR ps;
for (ps = s; ps != NULL; ps = ps -> next)
printf("%d -->", ps -> data);
printf("NULL\n");
}
int main ()
{
NODPTR pel;
NODPTR n;
CiptaSenarai(&pel);
n = NodBaru(55);
SisipSenarai(&pel, n, NULL);
n= NodBaru(75);
SisipSenarai(&pel, n, NULL);
CetakSenarai(pel);
return 0;
}
|
Tampilan
CONTOH
LATIHAN:
Buatlah program untuk memeasukkan beberapa data
dalam sebuah senarai (linked list), jika akan mengakhiri tekan n maka akan
muncul semua node yang masuk ke dalam linked list tersebut.
#include<stdio.h>
#include<conio.h>
#include<ctype.h>
#include<stdlib.h>
typedef
struct NODE {
int
lkey;
char
name[10];
struct
NODE* next;
}
TNODE;
TNODE
*first, *last;
int
LoadNode(TNODE *p);
void
FreeNode(TNODE *p);
void
PrintNode(TNODE *p);
void
CreateList()
{
TNODE
*p;
int
n = sizeof (TNODE);
first=last=0;
for(;;)
{
if((p=(TNODE*)malloc(n))==0)
{
printf("\nmemori
tidak cukup");
break;
}
if
(LoadNode(p) !=1)
{
FreeNode
(p);
break;
}
p->next=0;
if
(first==0)
first=last=p;
else{
last->next=p;
last=p;
}
}
}
int
LoadNode(TNODE *p)
{
char
opt;
printf("\nMasukkkan
node baru ?");
opt=getche();
opt=toupper(opt);
if
(opt!= 'N') {
puts("\nMasukan
data untuk node : ");
printf("\nname
:\t");
if
(scanf("%d", &(p->lkey))!=1)
return
0;
printf("\nname:\t");
if
(scanf("%s",p->name)!=1)
return
0;
return
1;
}
else
return
-1;
}
void
FreeNode(TNODE *p){
free(p);
}
void
ViewAllList()
{
TNODE
*p;
p=first;
while(p){
PrintNode(p);
p=p->next;
}
}
TNODE*
FindNode(int key)
{
TNODE
*p;
p=first;
while(p)
{
if(p->lkey
== key) return p;
p=p->next;
}
return
0;
}
void
PrintNode(TNODE *p)
{
if
(p) printf("\n%d\t%s",p->lkey,p->name);
}
TNODE*
InsertBeforeFirst()
{
TNODE
*p;
int
n=sizeof(TNODE);
if
(((p=(TNODE*)malloc(n))!=0)
&&
(LoadNode(p)==1))
{
if
(first==0){
p->next=0;
first=last=p;
}
else{
p->next=first;
first=p;
}
return
p;
}
if(p==0)
printf("\nMemori
tidak cukup");
else
FreeNode(p);
return
0;
}
TNODE*
InsertBeforeKey(int key)
{
TNODE
*p,*q,*ql;
int
n=sizeof(TNODE);
ql=0;
q=first;
while(q){
if(q->lkey==key)break;
ql=q;
q=q->next;
}
if(q==0){
printf("\nTidak
ada node yang mempunyai kunci atau senarai kosong");
return
0;
}
if
(((p=(TNODE*)malloc(n))!=0)
&&
(LoadNode(p)==1)){
if
(q==first){
p->next=first;
first=p;
}
else
{
p->next=q;
ql->next=p;
}
return
p;
}
if(p==0)
printf("\nMemori
tidak cukup");
else
FreeNode(p);
return
0;
}
TNODE*
InsertAfterKey(int key)
{
TNODE
*p, *q;
int
n=sizeof(TNODE);
q
= first;
while(q){
if(q->lkey
== key) break;
q=q->next;
}
if(q==0){
printf("\nTidak
ada nod yang mempunyai kunci atau senarai yang kosong");
return
0;
}
if
(((p=(TNODE*)malloc(n))!=0) && (LoadNode(p)==1))
{
if
(q==last){
p->next=0;
last->next=p;
last=p;
}
else
{
p->next=q->next;
q->next=p;
}
return
p;
}
if
(p==0)
printf("\nMemori
Tidak cukup ");
else
FreeNode(p);
return
0;
}
TNODE*
InsertAfterLast()
{
TNODE
*p;
int
n=sizeof(TNODE);
if
(((p=(TNODE*)malloc(n))!=0)&&
(LoadNode(p)==1))
{
p->next=0;
if
(first==0)
first=last=p;
else
{
last->next=p;
last=p;
}
return
p;
}
if(p==0)
printf("\nMemori
todak cukup");
else
FreeNode(p);
return
0;
}
void
RemoveFirst()
{
TNODE
*p;
if
(first==last){
FreeNode(first);
first=last=0;
return;
}
p=first;
first=first->next;
FreeNode(p);
}
void
RemoveLast()
{
TNODE
*p, *q;
if(first==0)
return;
if
(first==last){
FreeNode(first);
first=last=0;
return;
}
q=0;
p=first;
while(p!=last){
q=p;
p=p->next;
}
p=last;
FreeNode(p);
q->next=0;
last=q;
}
void
RemoveByKey(int key)
{
TNODE
*p, *q;
if
(first==0)
return;
q=0;
p=first;
while(p){
if(p->lkey==key)
break;
q=p;
p=p->next;
}
if(!p){
printf("\nTidak
ada node yang mempunyai kunci");
return;
}
if
(first==last){
FreeNode(first);
first=last=0;
return;
}
if(p==first){
first=first->next;
FreeNode(p);
return;
}
if(q==last){
q->next=0;
last=q;
FreeNode(p);
return;
}
q->next=p->next;
FreeNode(p);
}
void
DeletList()
{
TNODE
*p;
p=first;
while(p){
first=first->next;
FreeNode(p);
p=first;
}
last=0;
}
void
main()
{
CreateList();
ViewAllList();
InsertAfterLast();
ViewAllList();
RemoveFirst();
ViewAllList();
InsertAfterKey(1);
ViewAllList();
RemoveByKey(1);
ViewAllList();
DeletList();
ViewAllList();
}
|
Tampilan
Analisa : Diatas merupakan salah satu program yang
menggunakan Linked List, Linked List adalah adalah suatu cara untuk menyimpan
data dengan struktur sehingga dapat
secara otomatis menciptakan suatu tempat baru untuk meyimpan data yang
diperlukan. dapat berisi struct atau definisi kelas yang berisi variable yang
memegang informasi yang ada di dalamnya
dan mempunyai satu pointer yang menunjuk ke suatu struct sesuai dengan tipe
datanya. Bias d liat program nya diatas.
LATIHAN
1.
#include
<iostream.h>
#include
<conio.h>
#include
<string.h>
#include
<stdio.h>
#include
<alloc.h>
int pil;
int
tdkblhsm();
void
pilih();
void
buat_baru();
int
tambah();
void
hapus();
void
tampil();
struct
simpul
{
char nama [20];
long int nim;
struct simpul *next;
} mhs, *baru,
*awal=NULL, *akhir=NULL,*hps, *bantu;
int x=0;
int
tdkblhsm(int cari)
{
struct simpul *baru;
int ketemu=0;
if(awal==NULL)
ketemu=0;
else
{
baru=awal;
while(baru!=NULL)
{
if(cari==baru->nim)
{
ketemu=1;
break;
}
baru=baru->next;
}
}
return ketemu;
}
int main()
{
do
{
clrscr();
cout<<"MENU SINGLE
LINKEDLIST"<<endl;
cout<<"1. Tambah
"<<endl;
cout<<"2.
Hapus"<<endl;
cout<<"3.
Tampilkan"<<endl;
cout<<"4.
Selesai"<<endl;
cout<<"Pilihan Anda : ";
cin>>pil;
pilih();
} while(pil!=4);
return 0;
}
void pilih()
{
if(pil==1)
tambah();
else if(pil==2)
hapus();
else if(pil==3)
tampil();
else
cout<<"selesai";
}
int tambah()
{
baru=(struct simpul
*)malloc(sizeof(struct simpul));
cout<<"input nim : ";cin>>baru->nim;
if(tdkblhsm(baru->nim)!=0)
{
cout<<"NIM sudah ada, silahkan
input NIM yang lain";
getch();
return 0;
}
cout<<"input nama : ";cin>>baru->nama;
baru->next=NULL;
if(awal==NULL)
{
awal=baru;
akhir=baru;
}
//jika data hanya 1
else if (baru->nim < awal->nim)
{
baru->next=awal;
awal=baru;
}
else
{
bantu=awal;
while(bantu->next!=NULL
&& baru->nim > bantu->next->nim)
{
bantu=bantu->next;
}
baru->next=bantu->next;
bantu->next=baru;
}
}
void hapus()
{
long int nim_cari;
struct simpul *bantu1;
if (awal==NULL)
cout<<"Simpul
Kosong";
else
{
cout<<" Masukan NIM
yang akan dihapus : ";
cin>>nim_cari;
bantu=awal;
{
while(bantu!=NULL &&
bantu->nim!=nim_cari)
bantu=bantu->next;
if (bantu==NULL)
cout<<"Data
tidak ditemukan";
else if (bantu==awal)
{
awal=awal->next;
free(bantu);
}
else if (bantu==akhir)
{
bantu=awal;
while
(bantu1->next!=akhir)
bantu1=bantu1->next;
akhir=bantu1;
akhir->next=NULL;
free(bantu);
}
else
{
bantu1=awal;
while(bantu1->next!=bantu)
bantu1=bantu1->next;
bantu1->next=bantu->next;
free (bantu);
}
}
}
getch();
}
void
tampil()
{
if (awal==NULL)
cout<<"Tidak Ada Data";
else
{
bantu=awal;
while(bantu!=NULL)
{
cout<<"Nim :
"<<bantu->nim;
cout<<"Nama :
"<<bantu->nama;
bantu=bantu->next;
}
}
getch();
}
|
Tampilan
Analisa : Diatas merupakan salah satu program yang
menggunakan Linked List, Linked List adalah adalah suatu cara untuk menyimpan
data dengan struktur sehingga dapat
secara otomatis menciptakan suatu tempat baru untuk meyimpan data yang
diperlukan. dapat berisi struct atau definisi kelas yang berisi variable yang
memegang informasi yang ada di dalamnya
dan mempunyai satu pointer yang menunjuk ke suatu struct sesuai dengan tipe
datanya.
2.
int tambah()
{
baru=(struct simpul
*)malloc(sizeof(struct simpul));
cout<<"input nim : ";cin>>baru->nim;
if(tdkblhsm(baru->nim)!=0)
{
cout<<"NIM sudah ada, silahkan
input NIM yang lain";
getch();
return 0;
}
cout<<"input nama : ";cin>>baru->nama;
baru->next=NULL;
if(awal==NULL)
{
awal=baru;
akhir=baru;
}
//jika data hanya 1
else if (baru->nim < awal->nim)
{
baru->next=awal;
awal=baru;
}
else
{
bantu=awal;
while(bantu->next!=NULL
&& baru->nim > bantu->next->nim)
{
bantu=bantu->next;
}
baru->next=bantu->next;
bantu->next=baru;
}
}
|
Tampilan
Analisa : Diatas merupakan salah satu program yang
menggunakan Linked List, Linked List adalah adalah suatu cara untuk menyimpan
data dengan struktur sehingga dapat
secara otomatis menciptakan suatu tempat baru untuk meyimpan data yang
diperlukan. dapat berisi struct atau definisi kelas yang berisi variable yang
memegang informasi yang ada di dalamnya
dan mempunyai satu pointer yang menunjuk ke suatu struct sesuai dengan tipe
datanya. Struktur ini lebih dinamis, karena banyaknya elemen dengan mudah
ditambah atau dikurangi, berbeda dengan array yang ukurannya bersifat tetap.
3.
void
tampil()
{
if (awal==NULL)
cout<<"Kosong";
else
{
bantu=awal;
while(bantu!=NULL)
{
cout<<"nim :
"<<bantu->nim;
cout<<" nama : "<<bantu->nama;
bantu=bantu->next;
}
}
getch();
}
|
Tampilan
Analisa : Diatas merupakan salah satu program yang
menggunakan Linked List, Linked List adalah adalah suatu cara untuk menyimpan
data dengan struktur sehingga dapat
secara otomatis menciptakan suatu tempat baru untuk meyimpan data yang
diperlukan. dapat berisi struct atau definisi kelas yang berisi variable yang
memegang informasi yang ada di dalamnya
dan mempunyai satu pointer yang menunjuk ke suatu struct sesuai dengan tipe
datanya. Struktur ini lebih dinamis, karena banyaknya elemen dengan mudah
ditambah atau dikurangi, berbeda dengan array yang ukurannya bersifat tetap.
5.
1. void
hapus()
{
long int nim_cari;
struct simpul *bantu1;
if (awal==NULL)
cout<<"Simpul
Kosong";
else
{
cout<<" Masukan NIM
yang akan dihapus : ";
cin>>nim_cari;
bantu=awal;
{
while(bantu!=NULL
&& bantu->nim!=nim_cari)
bantu=bantu->next;
if (bantu==NULL)
cout<<"Data
tidak ditemukan";
else if (bantu==awal)
{
awal=awal->next;
free(bantu);
}
else if (bantu==akhir)
{
bantu=awal;
while (bantu1->next!=akhir)
bantu1=bantu1->next;
akhir=bantu1;
akhir->next=NULL;
free(bantu);
}
else
{
bantu1=awal;
while(bantu1->next!=bantu)
bantu1=bantu1->next;
bantu1->next=bantu->next;
free (bantu);
}
}
}
getch();
}
|
Tampilan
Analisa : Diatas merupakan salah satu program yang
menggunakan Linked List, Linked List adalah adalah suatu cara untuk menyimpan
data dengan struktur sehingga dapat
secara otomatis menciptakan suatu tempat baru untuk meyimpan data yang
diperlukan. dapat berisi struct atau definisi kelas yang berisi variable yang
memegang informasi yang ada di dalamnya
dan mempunyai satu pointer yang menunjuk ke suatu struct sesuai dengan tipe
datanya. dan merupakan sebuah fungsi untuk menghapus sebuah node berdasarkan
input nim.
6.
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
struct
batang
{
int
data;
batang
*lanjut;
}
*kepala, *buntut, *baru, *hapus, *bantuan;
main()
{
int
jml,d;
char
pilih;
menu:
clrscr();
printf("Menu:\n");
printf("1.
Tambah data dari depan\n");
printf("2.
Tambah data dari belakang\n");
printf("3.
Hapus data dari depan\n");
printf("4.
Hapus data dari belakang\n");
printf("5.
Tampil data\n");
pilih=getch();
if
(pilih=='1')
{
clrscr();
printf("Berapa
data yang akan dimasukan? ");scanf("%i",&jml);
for
(int i=1;i<=jml;i++)
{
baru
= new batang;
printf("Masukan
data ke - %i = ",i);scanf("%i",&baru->data);
if
(kepala==NULL)
{
kepala
= buntut = baru;
buntut->lanjut
= NULL;
}
else
{
baru->lanjut=kepala;
kepala=baru;
}
}
goto
menu;
}
if
(pilih=='2')
{
clrscr();
printf("Berapa
data yang akan dimasukan? ");scanf("%i",&jml);
for
(int i=1;i<=jml;i++)
{
baru
= new batang;
printf("Masukan
data ke - %i = ",i);scanf("%i",&baru->data);
baru->lanjut=NULL;
if
(kepala==NULL)
{
kepala
= baru;
buntut
= baru;
buntut->lanjut
= NULL;
}
else
{
buntut->lanjut=baru;
buntut=baru;
}
}
goto
menu;
}
if
(pilih=='3')
{
clrscr();
printf("Berapa
data yang ingin anda hapus dari depan?
");scanf("%i",&jml);
for
(int i=1;i<=jml;i++)
{
if(kepala!=buntut)
{
hapus
= kepala;
d
= hapus->data;
kepala
= kepala->lanjut;
delete
hapus;
}
else
{
d
= buntut->data;
kepala=buntut=NULL;
}
printf("%i
terhapus\n",d);
}
getch();
goto
menu;
}
if
(pilih=='4')
{
clrscr();
printf("Berapa
data yang ingin anda hapus dari belakang?
");scanf("%i",&jml);
for
(int i=1;i<=jml;i++)
{
bantuan=kepala;
if(kepala!=buntut)
{
while
(bantuan->lanjut!=buntut)
{
bantuan
= bantuan->lanjut;
}
hapus
= buntut;
buntut
= bantuan;
d
= hapus->data;
delete
hapus;
buntut->lanjut=NULL;
}
else
{
d
= buntut->data;
kepala=buntut=NULL;
}
printf("%i
terhapus\n",d);
}
getch();
goto
menu;
}
if
(pilih=='5')
{
clrscr();
bantuan
= kepala;
while
(bantuan!=NULL)
{
printf("%i
",bantuan->data);
bantuan=bantuan->lanjut;
}
getch();
goto
menu;
}
else
goto menu;
}
|
Tampilan
Analisa : Diatas merupakan salah satu program yang
menggunakan Linked List, Linked List adalah adalah suatu cara untuk menyimpan
data dengan struktur sehingga dapat
secara otomatis menciptakan suatu tempat baru untuk meyimpan data yang diperlukan.
dapat berisi struct atau definisi kelas yang berisi variable yang memegang
informasi yang ada di dalamnya dan
mempunyai satu pointer yang menunjuk ke suatu struct sesuai dengan tipe
datanya.
7.
#include<stdio.h>
#include<iostream.h>
#include<conio.h>
struct
batang
{
int data;
batang
*lanjut;
} *kepala,
*buntut, *baru, *hapus, *bantuan;
main()
{
int jml,d;
char pilih;
menu:
clrscr();
printf("Menu:\n");
printf("1.
Tambah data dari depan\n");
printf("2.
Tambah data dari belakang\n");
printf("3.
Hapus data dari depan\n");
printf("4.
Hapus data dari belakang\n");
printf("5.
Tampil data\n");
pilih=getch();
if
(pilih=='1')
{
clrscr();
printf("Berapa
data yang akan dimasukan? ");scanf("%i",&jml);
for (int
i=1;i<=jml;i++)
{
baru = new
batang;
printf("Masukan
data ke - %i = ",i);scanf("%i",&baru->data);
if
(kepala==NULL)
{
kepala =
buntut = baru;
buntut->lanjut
= NULL;
}
else
{
baru->lanjut=kepala;
kepala=baru;
}
}
goto menu;
}
if
(pilih=='2')
{
clrscr();
printf("Berapa
data yang akan dimasukan? ");scanf("%i",&jml);
for (int
i=1;i<=jml;i++)
{
baru = new
batang;
printf("Masukan
data ke - %i = ",i);scanf("%i",&baru->data);
baru->lanjut=NULL;
if
(kepala==NULL)
{
kepala =
baru;
buntut =
baru;
buntut->lanjut
= NULL;
}
else
{
buntut->lanjut=baru;
buntut=baru;
}
}
goto menu;
}
if
(pilih=='3')
{
clrscr();
printf("Berapa
data yang ingin anda hapus dari depan?
");scanf("%i",&jml);
for (int
i=1;i<=jml;i++)
{
if(kepala!=buntut)
{
hapus =
kepala;
d =
hapus->data;
kepala =
kepala->lanjut;
delete
hapus;
}
else
{
d =
buntut->data;
kepala=buntut=NULL;
}
printf("%i
terhapus\n",d);
}
getch();
goto menu;
}
if
(pilih=='4')
{
clrscr();
printf("Berapa
data yang ingin anda hapus dari belakang?
");scanf("%i",&jml);
for (int
i=1;i<=jml;i++)
{
bantuan=kepala;
if(kepala!=buntut)
{
while
(bantuan->lanjut!=buntut)
{
bantuan =
bantuan->lanjut;
}
hapus =
buntut;
buntut =
bantuan;
d =
hapus->data;
delete
hapus;
buntut->lanjut=NULL;
}
else
{
d =
buntut->data;
kepala=buntut=NULL;
}
printf("%i
terhapus\n",d);
}
getch();
goto menu;
}
if
(pilih=='5')
{
clrscr();
bantuan =
kepala;
while
(bantuan!=NULL)
{
printf("%i
",bantuan->data);
bantuan=bantuan->lanjut;
}
getch();
goto menu;
}
else goto
menu;
}
|
Analisa : Diatas merupakan salah satu program yang
menggunakan Linked List, Linked List adalah adalah suatu cara untuk menyimpan
data dengan struktur sehingga dapat
secara otomatis menciptakan suatu tempat baru untuk meyimpan data yang
diperlukan. dapat berisi struct atau definisi kelas yang berisi variable yang
memegang informasi yang ada di dalamnya
dan mempunyai satu pointer yang menunjuk ke suatu struct sesuai dengan tipe
datanya. user dapat memilih sesuai menu yang ada yaitu menambah simpul baru
berserta datanya, membaca semua data pada senarai, menghapus simpul dengan
data yang ditentukan user dan dapat
menghapus semua simpul yang ada.
Tidak ada komentar:
Posting Komentar