Pengertian Struktur Data
Struktur data adalah cara menyimpan atau merepresentasikan data didalam komputer agar bisa dipakai secara efisien.Sedangkan data adalah representasi dari fakta dunia nyata. Fakta atau keterangan tentang kenyataan yang disimpan, direkam atau direpresentasikan dalam bentuk tulisan, suara, gambar, sinyal atau simbol.Struktur data menyangkut susunan fisik data dalam komputer dan berfungsi agar :
- Penyimpanan lebih efesien
- Agar tersusun lebih terurut
- Agar data retrieval lebih efektif
Secara garis besar type data dapat dikategorikan menjadi :
- Type data sederhana
-Type data sederhana tunggal (Integer, real, boolean dan karakter)
-Type data sederhana majemuk (String)
-Struktur data sederhana (array dan record)
-Struktur data majemuk
Linier : Stack, Queue, serta List dan Multilist
NonLinier : Pohon Biner dan Graph
- List linier (Linked List) dan variasinya Multilist
- Stack (Tumpukan)
- Queue (Antrian)
- Tree ( Pohon )
- Graph ( Graf )
Single Linked List
Linked List adalah salah satu bentuk struktur data,
berisi kumpulan data
(node) yang tersusun secara sekuensial, saling sambungmenyambung,
dinamis dan terbatas.
(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.
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.
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.
PEMBUATAN
SINGLE LINKED LIST CIRCULAR
Deklarasi
node
Dibuat dari struct berikut ini:
Dibuat dari struct berikut ini:
typedef
struct TNode{
int data;
TNode *next;
};
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.
Pembentukan
node baru
Digunakan keyword new yang berarti mempersiapkan sebuah node baru berserta alokasi memorinya.
Digunakan keyword new yang berarti mempersiapkan sebuah node baru berserta alokasi memorinya.
TNode *baru;
baru = new TNode;
baru->data = databaru;
baru->next = 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:
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;
}
head = NULL;
}
Function untuk mengetahui kosong tidaknya Single
LinkedList
int
isEmpty(){
if(head == NULL) return 1;
else return 0;
}
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.
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;
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”;
}
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.
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”;
}
{
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”;
}
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”;
}
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!
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”;
}
{ 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 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”;
}
{ 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;
}
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;
}
head = NULL;
tail = NULL;
}
Function
untuk mengetahui kosong tidaknya LinkedList
int
isEmpty(){
if(tail == NULL) return 1;
else return 0;
}
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.
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”;
}
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.
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”;
}
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”;
}
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”;
}
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.
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”;
}
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;
}
}
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.
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>
# include<stdlib.h>
# include<conio.h>
# include<iostream.h>
# include<ctype.h>
# include<string.h>
struct
simpul
{
int angka;
struct simpul*berikut;
} ;
{
int angka;
struct simpul*berikut;
} ;
struct
simpul *awal=NULL;
int bil;
int bil;
void
tambah_list_didepan(int info);
void isi_list();
void tampil_list();
void hapus_list();
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;
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’);
{
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;
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;
}
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;
}
}
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>
#include <stdlib.h>
#include <constream.h>
#include <ctype.h>
#include <string.h>
struct siswa
{
char nrp[8],nama[20];
int umur;
float ipk;
};
{
char nrp[8],nama[20];
int umur;
float ipk;
};
struct
simpul
{
char nrp[8],nama[20];
int umur;
float ipk;
struct simpul *berikut;
};
{
char nrp[8],nama[20];
int umur;
float ipk;
struct simpul *berikut;
};
struct
simpul *awal = NULL, *akhir = NULL;
struct siswa mhs;
struct siswa mhs;
void
tambah_list_dibelakang(struct siswa info);
void isi_list();
void tampil_list();
void hapus_list();
void isi_list();
void tampil_list();
void hapus_list();
void main()
{
clrscr();
isi_list();
clrscr();
tampil_list();
hapus_list();
getch();
}
{
clrscr();
isi_list();
clrscr();
tampil_list();
hapus_list();
getch();
}
void
tambah_list_dibelakang(struct siswa info)
{
struct simpul *baru;
{
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;
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;
}
{
awal = baru;
}
else
{
akhir -> berikut = baru;
}
akhir = baru;
akhir -> berikut = NULL;
}
void
isi_list()
{
char jawab;
{
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;
{
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’);
}
while (toupper(jawab) != ’T’);
}
void tampil_list()
{
struct simpul *baca;
int i;
{
struct simpul *baca;
int i;
baca = awal;
i = 1;
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;
}
}
{
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;
{
struct simpul *hapus;
hapus =
awal;
while (hapus != NULL)
{
awal = hapus -> berikut;
free (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>
#include <constream.h>
#include <stdlib.h>
#include <ctype.h>
#include <string.h>
struct siswa
{
char nama[20];
int umur;
{
char nama[20];
int umur;
};
struct
simpul
{
char nama[20];
int umur;
{
char nama[20];
int umur;
struct
simpul *berikut;
};
};
struct
simpul *awal=NULL,*akhir=NULL;
struct siswa mhs;
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 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();
isi_list();
clrscr();
tampil_list();
sisip_isi_list();
tampil_list();
hapus_list();
getch();
}
tampil_list();
sisip_isi_list();
tampil_list();
hapus_list();
getch();
}
void
tambah_list_dibelakang(struct siswa info)
{
struct simpul *baru;
{
struct simpul *baru;
baru=(struct
simpul*)malloc(sizeof(struct simpul));
strcpy(baru->nama,info.nama);
baru->umur=info.umur;
strcpy(baru->nama,info.nama);
baru->umur=info.umur;
if
(awal==NULL)
{
awal=baru;
}
else
{
akhir->berikut=baru;
}
akhir=baru;
{
awal=baru;
}
else
{
akhir->berikut=baru;
}
akhir=baru;
akhir
->berikut=NULL;
}
}
void
isi_list()
{
char jawab;
{
char jawab;
do
{
clrscr();
cout<<“Nama: ”;gets(mhs.nama);
cout<<“Umur: ”;cin>>mhs.umur;
{
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;
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;
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);
{
if (strcmp(posisi,bantu->nama)!=0) {bantu=bantu->berikut;}
}
while (bantu!=NULL && strcmp(posisi,bantu->nama)!=0);
baru->berikut=bantu->berikut;
bantu->berikut=baru;
}
bantu->berikut=baru;
}
void
sisip_isi_list()
{
char cari[20];
struct siswa ganti;
{
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);
}
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;
{
struct simpul *baca;
int i;
baca=awal;
i=1;
i=1;
while(baca!=NULL)
{
{
cout<<“\nNama
: ”<<baca->nama;
cout<<“\nUmur : ”<<baca->umur;
cout<<“\n”;
i++;
baca=baca->berikut;
}
}
cout<<“\nUmur : ”<<baca->umur;
cout<<“\n”;
i++;
baca=baca->berikut;
}
}
void
hapus_list()
{
struct simpul *hapus;
{
struct simpul *hapus;
hapus=awal;
while(hapus!=NULL)
{
awal=hapus->berikut;
free(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>
#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;
};
{
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;
};
{
char norek[12];
char nama[25];
char alamat[50];
double saldo;
struct simpul *berikut;
};
struct
simpul *awal=NULL, *akhir=NULL;
struct nasabah bank;
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 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;
}
}
{
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;
{
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();
}
{
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;
{
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;
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;
}
{
awal = baru;
}
else
{
akhir -> berikut = baru;
}
akhir = baru;
akhir -> berikut = NULL;
}
void
tampil_list()
{
clrscr();
struct simpul *baca;
int i;
{
clrscr();
struct simpul *baca;
int i;
baca = awal;
i = 1;
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();
}
{
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();
}
{
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;
{
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;
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);
{
if (strcmp(posisi,bantu->norek)!=0)
{
bantu = bantu->berikut;
}
}
while (bantu !=NULL & strcmp(posisi,bantu->norek)!=0);
baru->berikut
= bantu -> berikut;
bantu -> berikut = baru;
}
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();
}
{
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;
{
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);
}
}
}
}
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;
{
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();
}
}
if (toupper(jawab)==‘Y’)
{
cout<<“\nNo.Rekening yang akan dihapus :”;
gets(cari);
hapus_simpul(cari);
menu();
}
}
Tidak ada komentar:
Posting Komentar