Jumat, 20 Juli 2012

Struktur data Non Linear

Pohon  atau tree adalah salah satu bentuk konsep struktur data yang terdiri dari akar dan simpul-simpul yang berada dibawah akar.


Gambar : Tingkat Pohon Tree


  • Selain istilah tingkat juga ada yang disebut dengan derajat ( degree ).
  • Derajat merupakan banyak tingkat simpul turunan dari satu simpul tertentu, misalkan simpul tertentu, misalkan simpul “ Ketua Umum” memiliki derajat 3, simpul “ wakil Ketua I “ memiliki derajat 2 dan seterusnya.
  • Simpul yang memiliki derajat 0 disebut dengan daun (  leaf ), pada struktur data pohon dikenal istilah yang disebut  kedalaman  ( depth ).
  • Sedangkan sebuah simpul yang ada diatas sebuah simpul lain disebut sebagai ancestor.
  • Kumpulan pohon disebut dengan hutan ( forest ).

Ada beberapa cara untuk menggambarkan sebuah pohon yaitu :


Operasi pada pohon biner :
Operasi yang dapat dilakukan pada pohon biner antara lain kunjungan terhadap simpul - simpulnya.

Jenis-jenis kunjungan pada pohon biner antara lain :
  • Preorder
  • Inorder
  • Postorder
  • Level order
Pre Order : ==> Kunjungan preorder merupakan kunjungan pada pohon biner yang dimulai dari akar
                          kemudian ke subpohon kiri, setelah subpohon  kiri  dikunjungi  baru  subpohon  kanan
                          dikunjungi.


gambar

Maka dengan kunjungan preorder  akan  menghasilkan  urutan  simpul  yang dikunjungi
A – B – D – E – C – F – G – H

In Order : ==> Kunjungan inorder merupakan kunjungan pada pohon biner yang dimulai dari simpul-simpul
                        turunan subpohon kiri, akar, baru kemudian simpul-simpul turunan pada subpohon kanan.

gambar


Maka  kunjungan  inoeder  akan  menghasilkan urutan simpul : 
D – B – E – A – F – C – H – G

Post Order : ==> Kunjungan post order merupakan kunjungan pada pohon biner yang dimulai dari simpul-
                           simpul turunan subpohon kiri, baru kemudian simpul-simpul turunan pada subpohon kanan, 
                           kemudian akar, misalkan terdapat sebuah pohon biner seperti pada gambar .

 gambar

Post Order akan menghasilkan urutan simpul yang dikunjungi :
D – E – B – F – H – G – C – A

Level  Order : ==> Kunjungan level order merupakan kunjungan pada pohon biner yang dimulai dari simpul 
                              pada tingkat  1  kemudian  simpul-simpul pada tingkat 2  dan seterusnya., dimulai dari
                              simpul  paling kiri ke kanan.

Kunjungan level order akan menghasilkan urutan simpul
A - B - C – D – E – F – G – H
 
 
 
 
Binary Tree
 
#include <iostream>

#include <cstdlib>
using namespace std;
class BinarySearchTree
{
    private:
        struct tree_node
        {
           tree_node* left;
           tree_node* right;
           int data;
        };
        tree_node* root;
    public:
        BinarySearchTree()
        {
           root = NULL;
        }
        bool isEmpty() const { return root==NULL; }
        void print_inorder();
        void inorder(tree_node*);
        void print_preorder();
        void preorder(tree_node*);
        void print_postorder();
        void postorder(tree_node*);
        void insert(int);
        void remove(int);
};

void BinarySearchTree::insert(int d)
{
    tree_node* t = new tree_node;
    tree_node* parent;
    t->data = d;
    t->left = NULL;
    t->right = NULL;
    parent = NULL;

  if(isEmpty()) root = t;
  else
  {

    tree_node* curr;
    curr = root;

    while(curr)
    {
        parent = curr;
        if(t->data > curr->data) curr = curr->right;
        else curr = curr->left;
    }

    if(t->data < parent->data)
       parent->left = t;
    else
       parent->right = t;
  }
}

void BinarySearchTree::remove(int d)
{

    bool found = false;
    if(isEmpty())
    {
        cout<<" This Tree is empty! "<<endl;
        return;
    }
    tree_node* curr;
    tree_node* parent;
    curr = root;
    while(curr != NULL)
    {
         if(curr->data == d)
         {
            found = true;
            break;
         }
         else
         {
             parent = curr;
             if(d>curr->data) curr = curr->right;
             else curr = curr->left;
         }
    }
    if(!found)
         {
        cout<<" Data not found! "<<endl;
        return;
    }


    if((curr->left == NULL && curr->right != NULL)|| (curr->left != NULL
&& curr->right == NULL))
    {
       if(curr->left == NULL && curr->right != NULL)
       {
           if(parent->left == curr)
           {
             parent->left = curr->right;
             delete curr;
           }
           else
           {
             parent->right = curr->right;
             delete curr;
           }
       }
       else
       {
          if(parent->left == curr)
           {
             parent->left = curr->left;
             delete curr;
           }
           else
           {
             parent->right = curr->left;
             delete curr;
           }
       }
     return;
    }


         if( curr->left == NULL && curr->right == NULL)
    {
        if(parent->left == curr) parent->left = NULL;
        else parent->right = NULL;
                  delete curr;
                  return;
    }


    if (curr->left != NULL && curr->right != NULL)
    {
        tree_node* chkr;
        chkr = curr->right;
        if((chkr->left == NULL) && (chkr->right == NULL))
        {
            curr = chkr;
            delete chkr;
            curr->right = NULL;
        }
        else
        {

            if((curr->right)->left != NULL)
            {
                tree_node* lcurr;
                tree_node* lcurrp;
                lcurrp = curr->right;
                lcurr = (curr->right)->left;
                while(lcurr->left != NULL)
                {
                   lcurrp = lcurr;
                   lcurr = lcurr->left;
                }
                                    curr->data = lcurr->data;
                delete lcurr;
                lcurrp->left = NULL;
           }
           else
           {
               tree_node* tmp;
               tmp = curr->right;
               curr->data = tmp->data;
                              curr->right = tmp->right;
               delete tmp;
           }

        }
         return;
    }

}

void BinarySearchTree::print_inorder()
{
  inorder(root);
}

void BinarySearchTree::inorder(tree_node* p)
{
    if(p != NULL)
    {
        if(p->left) inorder(p->left);
        cout<<" "<<p->data<<" ";
        if(p->right) inorder(p->right);
    }
    else return;
}

void BinarySearchTree::print_preorder()
{
  preorder(root);
}

void BinarySearchTree::preorder(tree_node* p)
{
    if(p != NULL)
    {
        cout<<" "<<p->data<<" ";
        if(p->left) preorder(p->left);
        if(p->right) preorder(p->right);
    }
    else return;
}

void BinarySearchTree::print_postorder()
{
  postorder(root);
}

void BinarySearchTree::postorder(tree_node* p)
{
    if(p != NULL)
    {
        if(p->left) postorder(p->left);
        if(p->right) postorder(p->right);
        cout<<" "<<p->data<<" ";
    }
    else return;
}

int main()
{
    BinarySearchTree b;
    int n,ch,tmp,tmp1;
    cout<<"\tOperasi Pohon Biner Lukman Reza \n\n";
    cout<<"Masukkan banyak data: ";
           cin>>n;
                    for (int i=0; i<=n; i++){
                    cout<<"Angka :";cin>>i;
                    b.insert(i);}
                 
                    cout<<"\n\nIn-Order Traversal "<<endl;
                    cout<<"-------------------"<<endl;
                    b.print_inorder();
                 
                    cout<<"\n\nPre-Order Traversal "<<endl;
                    cout<<"-------------------"<<endl;
                    b.print_preorder();
               
                    cout<<"\n\nPost-Order Traversal "<<endl;
                    cout<<"--------------------"<<endl;
                    b.print_postorder();
                    cout<<endl;
                 
           system("pause");
                    return 0;
                 
 
}
 
 
Graph
 
Ini Merupakan Program C++, yang dibuat untuk mengetahui sebuah graph terhubung atau tidak!
Berikut Source Codenya:

#include <iostream.h>
#include <conio.h>

int main(){
bool ketemu,nolsemua;
int matrix[10] [10];
int i,j,jumlah_simpul,jumlah_sisi,asal,tujuan;
//isnisialisasi matrix
cout<<"jumlah simpul:";
cin>>jumlah_simpul;
cout<<"jumlah_sisi:";
cin>>jumlah_sisi;
for (i=1;i<=jumlah_simpul;i++)
for (j=1;j<=jumlah_simpul;j++)
matrix[i][j]=0;
//isi matrix sesuai input graf
for (i=1;i<=jumlah_sisi;i++){
cout<<"simpul asal:";
cin>>asal;
cout<<"simpul tujuan:";
cin>>tujuan;
matrix[asal][tujuan]=1;
matrix[tujuan][asal]=1;
}
//telusuri graf
i=1;nolsemua=false;
while (i<=jumlah_simpul && !nolsemua){
j=1;ketemu=false;
while (j<=jumlah_simpul && !ketemu){
if (matrix[i][j]==1)
ketemu=true;
else
j++;
}
if (!ketemu)
nolsemua=true;
else
i++;
}

if(nolsemua)
cout<<"graf tidak terhubung";
else
cout<<"graf terhubung";
getch();

}
 

Struktur dan Linear

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.
Secara garis besar type data dapat dikategorikan menjadi:
Type data sederhana.
  • Type data sederhana tunggal, misalnya Integer, real, boolean dan karakter.
  • Type data sederhana majemuk, misalnyaString
Struktur Data, meliputi:
Linier : Stack, Queue, sertaList dan Multilist
Non Linier : Pohon Biner dan Graph
Pemakaian struktur data yang tepat didalam proses pemrograman akan menghasilkan algoritma yang lebih jelas dan tepat, sehingga menjadikan program secara keseluruhan lebih efisien dan sederhana.
Struktur
data yang standar yang biasanya digunakan dibidang informatika adalah:
* List linier (Linked List) dan variasinya
* Multilist
* Stack (Tumpukan)
* Queue (Antrian)
* Tree ( Pohon)
* Graph ( Graf )
REVIEW RECORD (REKAMAN)
Disusun oleh satu atau lebih field. Tiap field menyimpan data dari tipe dasar tertentu atau dari tipe bentukan lain yang sudah didefinisikan sebelumnya. Nama rekaman ditentukan oleh pemrogram.
Rekaman disebut juga tipe terstruktur

DOUBLE LINKED LIST CIRCULAR (DLLC) 
Definisi
Double Linked List Circular adalah linked list dengan menggunakan pointer, dimana setiap node memiliki 3 field, yaitu 1 field pointer yang menunjuk pointer berikutnya (next), 1 field menunjuk pointer sebelumnya (prev), serta sebuah field yang berisi data untuk node tersebut. Double Linked List Circular pointer next dan prev-nya menunjuk ke dirinya sendiri secara circular.
 
Bentuk Node DLLC


Pengertian:
Double : field pointer-nya terdiri dari dua buah dan dua arah, yaitu prev dan next.
Linked List : node-node tersebut saling terhubung satu sama lain.
Circular : pointer next dan prev-nya menunjuk ke dirinya sendiri.


Ilustrasi Double Linked List Circular
 
Setiap node pada linked list mempunyai field yang berisi data dan pointer ke node berikutnya dan ke node sebelumnya.
Untuk pembentukan node baru, mulanya pointer next dan prev akan menunjuk ke dirinya sendiri.
Jika sudah lebih dari satu node, maka pointer prev akan menunjuk ke node sebelumnya, dan pointer next akan menunjuk ke node sesudahnya.
 
Pembuatan Double Linked List Circular
Deklarasi node, dibuat dari struct berikut ini:


Penjelasan:
Pembuatan struct bernama TNode yang berisi 3 field, yaitu field data bertipe integer dan field next dan prev yang bertipe pointer dari Tnode.
Setelah pembuatan struct, buat variabel haed yang bertipe pointer dari TNode yang berguna sebagai kepala linked list.

Pembuatan Node Baru:
Digunakan keyword new yang berarti mempersiapkan sebuah node baru berserta alokasi memorinya, pointer prev dan next menunju ke dirinya sendiri.

 
Double Linked List Circular Menggunakan Head 
Menggunakan 1 pointer head.
Head selalu menunjuk node pertama.



Deklarasi Pointer Head:
Manipulasi linked list tidak bisa dilakukan langsung ke node yang dituju, melainkan harus melalui node pertama dalam linked list. Deklarasinya sebagai berikut:

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. Dibutuhkan pointer bantu yang digunakan untuk menunjuk node terakhir (headprev) yang akan digunakan untuk mengikat list dengan node terdepan.
 


#include <iostream.h>
#include <conio.h>
#include <stdio.h>
#include <alloc.h>

int pil;
void pilih();
void buat_baru();
void tambah_belakang();
void tambah_depan();
void hapus_belakang();
void hapus_depan();
void tampil();


struct simpul
{
    char nim[8], nama [20];
    int umur;
    struct simpul *kiri, *kanan;
} mhs, *baru, *awal=NULL, *akhir=NULL,*hapus,*bantu;

int main()
{
    do
    {
        clrscr();
        cout<<"MENU DOUBLE LINKEDLIST"<<endl;
        cout<<"1. Tambah Depan"<<endl;
        cout<<"2. Tambah Belakang"<<endl;
        cout<<"3. Hapus Depan"<<endl;
        cout<<"4. Hapus Belakang"<<endl;
        cout<<"5. Tampilkan"<<endl;
        cout<<"6. Selesai"<<endl;
        cout<<"Pilihan Anda : ";
        cin>>pil;
        pilih();
    } while(pil!=6);
    return 0;
}

void pilih()
{
    if(pil==1)
        tambah_depan();
    else if(pil==2)
        tambah_belakang();
    else if(pil==3)
        hapus_depan();
     else if(pil==4)
        hapus_belakang();
      else if(pil==5)
        tampil();
    else
        cout<<"selesai";
}

void buat_baru()
{
    baru=(simpul*)malloc(sizeof(struct simpul));
    cout<<"input nim   : ";cin>>baru->nim;
    cout<<"input nama  : ";cin>>baru->nama;
    cout<<"input umur  : ";cin>>baru->umur;
    baru->kiri=NULL;
    baru->kanan=NULL;
}

void tambah_belakang()
{
    buat_baru();
    if(awal==NULL)
    {
        awal=baru;
        akhir=baru;
    }
    else
    {
        akhir->kanan=baru;
        baru->kiri=akhir;
        akhir=baru;
    }
    cout<<endl<<endl;
    tampil();
}

void tambah_depan()
{
    buat_baru();
    if(awal==NULL)
    {
        awal=baru;
        akhir=baru;
    }
    else
    {
        baru->kanan=awal;
        awal->kiri=baru;
        awal=baru;
    }
    cout<<endl<<endl;
    tampil();
}

void hapus_depan()
{
    if (awal==NULL)
        cout<<"Kosong";
    else if (awal->kanan==NULL)
    {
      hapus=awal;
      awal=NULL;
      akhir=NULL;
      free(hapus);
    }
    else
    {
        hapus=awal;
        awal=hapus->kanan;
        awal->kiri=NULL;
        free(hapus);
    }
    cout<<endl<<endl;
    tampil();
}

void hapus_belakang()
{
    if (awal==NULL)
        cout<<"Kosong";
    else if (awal->kanan==NULL)
    {
      hapus=awal;
      awal=NULL;
      akhir=NULL;
      free(hapus);
    }
    else
    {
     hapus=akhir;
     akhir=hapus->kiri;
     akhir->kanan=NULL;
     free(hapus);
    }
    cout<<endl<<endl;
    tampil();
}

void tampil()
{
     if (awal==NULL)
          cout<<"Kosong";
     else
     {
         bantu=awal;
         while(bantu!=NULL)
         {
            cout<<"nim : "<<bantu->nim;
            cout<<"  nama : "<<bantu->nama;
            cout<<"  umur : "<<bantu->umur<<endl;
            bantu=bantu->kanan;
         }
     }
     getch();
}


Double Linked List Non Circular ( DLLNC )

DLLNC "Double linked list non circular" adalah Double Linked List yang memiliki 2 buah pointer yaitu pointer next dan prev.
Pointer next menunjuk pada node setelahnya dan pointer prev menunjuk pada node sebelumnya.
Pengertian:
Double : artinya field pointer-nya dua buah dan dua arah, ke node sebelum dan sesudahnya.
Linked List : artinya node-node tersebut saling terhubung satu sama lain.
Non Circular : artinya pointer prev dan next-nya akan menunjuk pada NULL.

Ilustrasi DLLNC



Setiap node pada linked list mempunyai field yang berisi data dan pointer ke node berikutnya & ke node sebelumnya
Untuk pembentukan node baru , mulanya pointer next dan prev akan menunjuk ke nilai NULL
Selanjutnya pointer prev akan menunjuk ke node sebelumnya , dan pointer next akan menunjuk ke node selanjutnya pada list.


Deklarasi dan node baru DLLNC

Deklarasi node
Dibuat dari struct berikut ini :
typedef struct TNode {
int data ;
TNode *next ;
Tnode * prev ;
};

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 = NULL;
baru -> prev = NULL; 

contoh :
#include "stdio.h"
#include "stdlib.h"
#include "conio.h"
struct node{
struct node *previous;
int info;
struct node *next;
};
typedef struct node *simpul;
void main()
{
simpul baru, awal=NULL, akhir=NULL, temp;
int pilih;
do
{
cout("MENU\n");
cout("1. Isi depan\n");
cout("2. tampil\n");
cout("3. cari\n");
cout("4. hapus Depan\n");
cout("PILIH: ");
scanf("%d", &pilih);
switch(pilih)
{
case 1:
int data;
cout("Data Masuk: ");
scanf("%i", &data);
baru = (simpul) malloc(sizeof (struct node));
baru->info = data;
baru->next = NULL;
baru->previous = NULL;
if (awal == NULL)
{
awal = baru;
akhir = baru;
}
else
{
baru->next = awal;
awal->previous = baru;
awal = baru;
}
break;
case 2:
clrscr();
cout("Dari AWAL\n");
temp = awal;
while(temp!=NULL)
{
cout("%i ", temp->info);
temp = temp->next;
}
cout("\nDari AKHIR\n");
temp = akhir;
while(temp!=NULL)
{
cout("%i ", temp->info);
temp = temp->previous;
}
cout("\n");
break;
case 3:
clrscr();
int cari;
cout("Cari Angka: ");
scanf("%i", &cari);
temp = awal;
while((temp!=NULL)&&(temp->info!=cari))
{
temp = temp->next;
}
if(temp != NULL && temp->info == cari)
cout("Data Ditemukan");
else
cout("Data Tidak Ditemukan");
cout("\n");
break;
case 4:
clrscr();
temp = awal;
awal = awal->next;
if (awal != NULL)
awal->previous = NULL;
if (awal == NULL)
akhir = NULL;
free(temp);
break;
}
}while (pilih!=5);
}


Single Linked List Circular
Single Linked List Circular (SLLC) 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:
Node : rangkaian beberapa simpul
Single : artinya field pointer-nya hanya satu buah saja dan satu arah.
Linked List : artinya node-node tersebut saling terhubung satu sama lain.
Circular : artinya pointer next-nya akan menunjuk pada dirinya sendiri sehingga berputar
picture1
Ilustrasi SLLC
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.
picture2
Deklarasi:
Deklarasi node dibuat dari struct berikut ini:
typedef struct TNode{
int data;
TNode *next;
};
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;
Dibutuhkan satu buah variabel pointer: head
Head akan selalu menunjuk pada node pertama
picture3
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.

HEAD Single Linked List Circular
Penambahan data di depan
picture4

Penambahan data di depan
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;
}
printf(“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.
picture5 picture6
Penambahan data di belakang
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;
}
printf(“Data masuk\n“);
}

Operasi Penghapusan
Penghapusan node dilakukan dengan memutus rantai node kemudian menghapus node. Jika node berada di tengah rangkaian, rangkaian yang terputus perlu disambung kembali. Untuk memudahkan penghapusan simpul dibutuhkan dua cursor sebagai simpul bantu. Selain cursor juga dibutuhkan simpul head sebagai acuan awal simpul dalam rangkaian.

Berikut langkah langkah untuk menghapus simpul dalam rangkaian:
  • Buat cursor bantu yang menunjuk ke awal node(simpul).
  • Pindahkan cursor ke node berikutnya
  • Putus sambungan awal node dengan node berikutnya.
  • Hapus rangkaian
  • Jika berada di akhir rangkaian, putuskan dari rangkaian sebelumnya
  • Jika di tengah rangkaian, pindahkan penunjukan node berikutnya, atau di akhir, atau setelah node yang akan dihapus
Ilustrasi Hapus Depan
picture7
Ilustrasi Hapus Depan
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;
}
printf(“%d terhapus\n“,d);
} else printf(“Masih kosong\n“);
}
Ilustrasi Hapus Belakang
picture8
Ilustrasi Hapus 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;
}
printf(“%d terhapus\n“,d);
} else printf(“Masih kosong\n“);
}
Contoh Coding Stack Dengan Linked List
#include <iostream.h>
#include <conio.h>
/* membuat linked list */
typedef struct myLinkedList {
char nim[10];
char nama[35];
int nilai;
myLinkedList *next;
};
myLinkedList *head;
/* keadaan awal */
void init() {
head = NULL;
}
/* fungsi untuk mengecek linked list
* apakah kosong atau tidak
* jika kosong maka bernilai 1
* jika tidak kosong maka bernilai 0
*/
int paKosong() {
if (head == NULL) return 1;
else return 0;
}
/**
* fungsi untuk menambahkan data dari depan node
*/
void tambahDepan() {
myLinkedList *baru;
baru = new myLinkedList;
cout << “Masukkan Data lengkap di bawah ini : ” << endl;
cout << “NIM : “; cin >> baru->nim;
cout << “Nama : “; cin >> baru->nama;
cout << “Nilai : “; cin >> baru->nilai;
baru->next = NULL;
if (paKosong() == 1) {
head = baru;
head->next = NULL;
} else {
baru->next = head;
head = baru;
}
}
/**
* fungsu untuk menambahkan data dari depan node
*/
void tambahBelakang() {
myLinkedList *baru, *bantu;
baru = new myLinkedList;
cout << “Masukkan Data lengkap di bawah ini : ” << endl;
cout << “NIM : “; cin >> baru->nim;
cout << “Nama : “; cin >> baru->nama;
cout << “Nilai : “; cin >> baru->nilai;
baru->next = NULL;
if (paKosong() == 1) {
head = baru;
head->next = NULL;
} else {
bantu = head;
while (bantu->next != NULL) {
bantu = bantu->next;
}
bantu->next = baru;
}
}
/**
* fungsi untuk menghapus dari depan node
*/
void hapusDepan() {
myLinkedList *hapus;
char *data;
if (paKosong() == 0) {
if (head->next != NULL) {
hapus = head;
data = hapus->nim;
head = head->next;
delete hapus;
} else {
data = head->nim;
head = NULL;
}
cout << data << ” sudah terhapus \n”;
} else {
cout << “Data Masih kosong..\n”;
}
cout << “Tekan Enter untuk kembali ke Menu!”;
getch();
}
/**
* fungsi untuk menghapus dari belakang node
*/
void hapusBelakang() {
myLinkedList *hapus, *bantu;
char *data;
if (paKosong() == 0) {
if (head->next != NULL) {
bantu = head;
while(bantu->next->next != NULL) {
bantu = bantu->next;
}
hapus = bantu->next;
data = hapus->nim;
bantu->next = NULL;
delete hapus;
} else {
data = head->nim;
head = NULL;
}
cout << data << ” sudah terhapus… ” << endl;
} else {
cout << “Data masih kosong…” << endl;
}
cout << “Tekan Enter untuk kembali ke Menu!”;
getch();
}
/**
* fungsi untuk menampilkan data linked list
*/
void tampilData() {
int no = 1;
myLinkedList *bantu;
bantu = head;
if (paKosong() == 0) {
while (bantu != NULL) {
cout << “No. : ” << no << endl;
cout << “NIM : ” << bantu->nim << endl;
cout << “Nama : ” << bantu->nama << endl;
cout << “Nilai : ” << bantu->nilai << endl << endl;
no++;
bantu = bantu->next;
}
cout << endl;
} else {
cout << “Data masih kosong ” << endl;
}
cout << “Tekan Enter untuk kembali ke menu!”;
getch();
}
/**
* fungsi Menu, Untuk menentukan linked list mana
* yang dipilih
*/
int menu() {
int pilihan;
cout << “+———————-+\n”;
cout << “| MENU PILIHAN |\n”;
cout << “+———————-+\n”;
cout << “| 1. Tambah Depan |\n”;
cout << “| 2. Tambah Belakang |\n”;
cout << “| 3. Hapus Depan |\n”;
cout << “| 4. Hapus Belakang |\n”;
cout << “| 5. Tambah Tengah |\n”;
cout << “| 6. Hapus Tengah |\n”;
cout << “| 7. TampilData |\n”;
cout << “| 8. Keluar |\n”;
cout << “+———————-+\n”;
cout << “| PILIHAN ANDA ? [ ] |\n”;
cout << “+———————-+\n”;
cin >> pilihan;
return pilihan;
}
/**
* fungsi operasi data
*/
void operasiData() {
int pilih;
do {
pilih = menu();
switch (pilih) {
case 1 :
tambahDepan();
break;
case 2 :
tambahBelakang();
break;
case 3 :
hapusDepan();
break;
case 4 :
hapusBelakang();
break;
case 5 :
tampilData();
break;
case 6:
cout << “Terima kasih coy!!!”;
break;
}
} while (pilih != 6);
}
/**
* PROGRAM UTAMA
*/
void main() {
init();
operasiData();
}

Program Single Linked List non Circular
#include <iostream.h> //File Header Iostream
#include <conio.h> //File Header Conio 
typedef struct TNode { //Deklarasi Linked List
int data;   //data bertipe integer
TNode *next; //pointer Next
};  //penutup deklarasi
TNode *head;  //disini menggunakan head sebagai pointer utama dari linked list
void init(){  //Fungsi untuk inisialisasi awal linked list
head=NULL;  //Untuk pertama kali, head bernilai NULL
}
int IsEmpty(){  //Fungsi untuk mengetahui apakah Linked list kosong atau ada isinya
if(head==NULL)  // apabila head==NULL, maka return 1
return 1;
else
return 0;  // Selain itu maka Return 0
}
void insertdepan(int n){ //Fungsi untuk menambahkan data baru (n didapat dari input di program utama (main))
TNode *baru;  //Disini menggunakan baru sebagai pointer TNode nya
baru=new TNode; 
baru->data=n;  //pointer baru->data berisi nilai variabel n
baru->next=NULL;  // pointer baru->next berisi NULL
if(IsEmpty()==1){ //periksa apakah linked list bernilai, jika return 1(tidak bernilai), maka akan mengeksekusi perintah hingga ‘}’
head=baru; //Nilai head= Nilai baru
head->next=NULL; 
}
else {   // Jika return 0(linked list bernilai), maka akan mengeksekusi perintah berikut hingga ‘}’
baru->next=head;
head=baru;
}
cout<<”Data Terisi”;
}
void insertbelakang(int n){    //Fungsi untuk insert Belakang(Menambahkan data di belakang data lama)
TNode *baru,*bantu;  //Pointer yang digunakan yaitu baru dan bantu
baru=new TNode; 
baru->data=n;
baru->next=NULL;
if(IsEmpty()==1){
head=baru;
head->next=NULL;
}
else {
bantu=head;
while(bantu->next!=NULL){
bantu=bantu->next;
}
bantu->next=baru;
}
cout<<”Data Terisi”;
}
void tampil(){   //Fungsi untuk menampilkan linked list yang telah di input / di delete
TNode *bantu;  //pointer yang digunakan yaitu bantu
bantu=head;  // Nilai bantu= Nilai yang ada di head
if(IsEmpty()==0){  // periksa apakah return 0(bernilai)
while(bantu!=NULL){ //Selama bantu tidak sama dengan NULL, maka di eksekusi
cout<<bantu->data<<endl;  // tampilkan di monitor nilai bantu->data
bantu=bantu->next;  //Nilai bantu= nilai bantu selanjutnya
}
}
else
cout<<”Masih Kosong”<<endl;
}
void hapusdepan(){ //Fungsi untuk menghapus Nilai paling depan
TNode *hapus;
int d;
if(IsEmpty()==0){  //periksa apakah return 0(ada nilai)
if(head!=NULL){ // jika head tidak sama dengan Null maka :
hapus=head;  // pointer hapus= head
d=hapus->data;  //nilai dari d = nilai dari hapus->data
head=hapus->next;  // Nilai head sekarang berisi nilai hapus->next
delete hapus;  //fungsi untuk menghapus nilai yang ada  di pointer hapus
}
cout<<d<<” Terhapus”<<endl;
}
else
cout<<”Masih Kosong”<<endl;
}
main(){  // Fungsi Utama dari program
int pil;
do{
clrscr();
int n;
cout<<”1.Insert Depan”<<endl;
cout<<”2.Insert Belakang”<<endl;
cout<<”3.Display”<<endl;
cout<<”4.Delete”<<endl;
cout<<”5.Exit”<<endl;
cout<<”Masukan Pilihan Anda :”;pil=getche();
switch(pil){
case’1′: clrscr();
cout<<”Masukan data :”;cin>>n;
IsEmpty();
insertdepan(n);
break;
case’2′: clrscr();
cout<<”Masukan data :”;cin>>n;
IsEmpty();
insertbelakang(n);
break;
case’3′: clrscr();
IsEmpty();
tampil();
break;
case’4′: clrscr();
IsEmpty();
hapusdepan();
break;
}
getch();
}while(pil!=’5′);
return 0;
}



contoh yang ke 2 :

/* membuat linked list */
typedef struct myLinkedList {
char nim[10];
char nama[35];
int nilai;
myLinkedList *next;
};
myLinkedList *head;
/* keadaan awal */
void init() {
head = NULL;
}
/* fungsi untuk mengecek linked list
* apakah kosong atau tidak
* jika kosong maka bernilai 1
* jika tidak kosong maka bernilai 0
*/
int paKosong() {
if (head == NULL) return 1;
else return 0;
}
/**
* fungsi untuk menambahkan data dari depan node
*/
void tambahDepan() {
myLinkedList *baru;
baru = new myLinkedList;
cout << “Masukkan Data lengkap di bawah ini : ” <<>> baru->nim;
cout << “Nama : “; cin >> baru->nama;
cout << “Nilai : “; cin >> baru->nilai;
baru->next = NULL;
if (paKosong() == 1) {
head = baru;
head->next = NULL;
} else {
baru->next = head;
head = baru;
}
}
/**
* fungsu untuk menambahkan data dari depan node
*/
void tambahBelakang() {
myLinkedList *baru, *bantu;
baru = new myLinkedList;
cout << “Masukkan Data lengkap di bawah ini : ” <<>> baru->nim;
cout << “Nama : “; cin >> baru->nama;
cout << “Nilai : “; cin >> baru->nilai;
baru->next = NULL;
if (paKosong() == 1) {
head = baru;
head->next = NULL;
} else {
bantu = head;
while (bantu->next != NULL) {
bantu = bantu->next;
}
bantu->next = baru;
}
}
/**
* fungsi untuk menghapus dari depan node
*/
void hapusDepan() {
myLinkedList *hapus;
char *data;
if (paKosong() == 0) {
if (head->next != NULL) {
hapus = head;
data = hapus->nim;
head = head->next;
delete hapus;
} else {
data = head->nim;
head = NULL;
}
cout <<>
/**
* fungsi untuk menghapus dari belakang node
*/
void hapusBelakang() {
myLinkedList *hapus, *bantu;
char *data;
if (paKosong() == 0) {
if (head->next != NULL) {
bantu = head;
while(bantu->next->next != NULL) {
bantu = bantu->next;
}
hapus = bantu->next;
data = hapus->nim;
bantu->next = NULL;
delete hapus;
} else {
data = head->nim;
head = NULL;
}
cout <<>
cout << “Tekan Enter untuk kembali ke Menu!”; getch(); }
/**
* fungsi untuk menampilkan data linked list
*/
void tampilData() {
int no = 1;
myLinkedList *bantu;
bantu = head;
if (paKosong() == 0) {
while (bantu != NULL) {
cout << “No. : ” <<>nim <<>nama <<>nilai <<>
no++;
bantu = bantu->next;
}
cout <<>
} else {
cout << “Data masih kosong ” <<>
/**
* fungsi Menu, Untuk menentukan linked list mana
* yang dipilih
*/
int menu() {
int pilihan;
cout << “+———————-+\n”; cout << “| MENU PILIHAN |\n”; cout << “+———————-+\n”; cout << “| 1. Tambah Depan |\n”; cout << “| 2. Tambah Belakang |\n”; cout << “| 3. Hapus Depan |\n”; cout << “| 4. Hapus Belakang |\n”; cout << “| 5. Tambah Tengah |\n”; cout << “| 6. Hapus Tengah |\n”; cout << “| 7. TampilData |\n”; cout << “| 8. Keluar |\n”; cout << “+———————-+\n”; cout << “| PILIHAN ANDA ? [ ] |\n”; cout << “+———————-+\n”;
cin >> pilihan;
return pilihan;
}
/**
* fungsi operasi data
*/
void operasiData() {
int pilih;
do {
pilih = menu();
switch (pilih) {
case 1 :
tambahDepan();
break;
case 2 :
tambahBelakang();
break;
case 3 :
hapusDepan();
break;
case 4 :
hapusBelakang();
break;
case 5 :
tampilData();
break;
case 6:
cout << “Terima kasih coy!!!”; break; } } while (pilih != 6); }
/**
* PROGRAM UTAMA
*/
void main() {
init();
operasiData();
}



Array

Array merupakan sekumpulan data yang mempunyai nama dan tipe yang sama, array disebut juga variable berindeks. Nilai suatu data dala array ditentukan oleh nama dan indeksnya. Tipe data array dapat berupa array satu dimensi atau  array berdemensi banyak

/*Program :array2.cpp*/
#include
int main()
{
int square[100];
int i; /*loop index*/;
int k; /*the integer*/
/*calculate the squares */
for (i=0; i<10; i++)
{
k= i+1;
square[i]=k*k;
printf(“nPangkat dari %d adalah %d “, k, square[i]);
}
return 0;
}
Bila program dijalankan akan muncul hasil :
Pangkat dari 1 adalah 1
Pangkat dari 2 adalah 4
Pangkat dari 3 adalah 9
Pangkat dari 4 adalah 16
Pangkat dari 5 adalah 25
Pangkat dari 6 adalah 36
Pangkat dari 7 adalah 49
Pangkat dari 8 adalah 64
Pangkat dari 9 adalah 81
Pangkat dari 10 adalah 100

ARRAY DUA DIMENSI
Singkatnya, Array dua dimensi merupakan array yang terdiri dari m buah baris dan n buah kolom. Bentuknya dapat berupa matriks atau tabel.

Bentuk umum pendeklarasian variabel array dua dimensi di Java adalah:
tipeData[][]nama_variabel[=new tipeData[jumlah_baris][jumlah_kolom]];


Untuk memudahkan pemahaman, bentuk array dua dimensi bisa dihambarkan dalam bentuk petak-petak sebagai berikut:

N adalah nilai yang menyatakan jumlah baris dari array, sedangkan M menyatakan jumlah kolom dari array. Sama seperti array satu dimensi, penomoran indeks untuk array dua dimensi juga dimulai dari 0 untuk baris maupun kolomnya. Tidak ada aturan yang mengatakan bahwa urutan untuk nomor indeks adalah baris dulu baru kolom.

Contoh array 2 dimensi:
int x[3][4];
 contoh program :
//contoh program array dua dimensi
#include<iostream.h>
#include<conio.h>
void main()
{
int a[2][3], i, j;

for(i=0;i<=1;i++)
{
for(j=0;j<=2;j++)
{
cout<<"Masukan angka pada baris ke "<<i<<" kolom ke "<<j<<" : ";
cin>>a[i][j];
}
cout<<endl;
}
for(i=0;i<=1;i++)
{
for(j=0;j<=2;j++)
{
cout<<a[i][j]<<" ";
}
cout<<endl;
}
getch();
}

array 3 dimensi merupakan array yang memiliki tiga sumbu sudut x,y,z ..
contoh program array 3 dimensi :
#include<constream.h>
void main()
{
 int kelas[3][4][4];
 int x,y,total[4][4],final[4];

for(int z=1;z<=3;z++)
{
 clrscr();
 cout<<"Pemilihan Presma LPKIA di kelas matkul ke-"<<z<<"\n\n";
 cout<<"No. Nama    KELAS PEMILIH        TOTAL\n";
 cout<<"           1TI5       1TI6\n";
 cout<<"1   Andi\n";
 cout<<"2   Budi\n";
 cout<<"3   Cepi\n";
 cout<<"             TOTAL PEMILIH=";

 final[z]=0;
 for (y=1; y<=3; y++)
 {
  total[y][z]=0;
  for (x=1; x<=2; x++)
  {
   gotoxy(x*11+2,y+4);
   cin>>kelas[x][y][z];
   total[y][z]=total[y][z]+kelas[x][y][z];
  }
  gotoxy(35,y+4);
  cout<<total[y][z];
  final[z]=final[z]+total[y][z];
 }
 gotoxy(35,8);
 cout<<final[z];
 getch();
}

//laporan akhir total masing2
int fixtotal[4];
cout<<"\nlaporan akhir"<<endl;
cout<<"Nama    Kelas Matkul       TOTAL "<<endl;
cout<<"      ke-1   ke-2   ke-3"<<endl;
cout<<"Andi\n";
cout<<"Budi\n";
cout<<"Cepi\n";

for(z=1;z<=3;z++)
{
 fixtotal[z]=0;
 for(y=1;y<=3;y++)
 {
 gotoxy(z*7+1,y+11);
 cout<<total[y][z];
 fixtotal[z]=fixtotal[z]+total[z][y];
 }
 gotoxy(29,z+11);
 cout<<fixtotal[z];
}


//search max
int index=1;
int max=fixtotal[1];
//cout<<max;
//getch();
for(x=1;x<=3;x++)
{
 if(fixtotal[x]>max)
  {
  index=x;
  max=fixtotal[x];
  }
}
cout<<"\nmaksimal:"<<fixtotal[index];
cout<<"\nada di nomor "<<index;
getch();
}


Pointer (variabel penunjuk) adalah suatu variabel yang berisi alamat memori dari suatu variabel lain. Alamat ini merupakan lokasi dari obyek lain (biasanya variabel lain) di dalam memori. Contoh, jika sebuah variabel berisi alamat dari variabel lain, variabel pertama dikatakan menunjuk ke variabel kedua Operator Pointer ada dua, yaitu :
  • Operator &
Operator & bersifat unary (hanya memerlukan satu operand saja).
Operator & menghasilkan alamat dari operandnya.
  • Operator *
Operator * bersifat unary (hanya memerlukan satu operand saja).
Operator * menghasilkan nilai yang berada pada sebuah alamat.

DEKLARASI POINTER

Seperti halnya variabel yang lain, variabel pointer juga harus dideklarasikan terlebih dahulu sebelum digunakan.  Bentuk Umum :
Tipe_data *nama_pointer;
//Contoh
int *px;
char *sh;
Contoh Program :
#include “IOSTREAM.h”
#include “conio.h”
void main()
{ int x, y; /* x dan y bertipe int */
int *px; /* px pointer yang menunjuk objek */
clrscr();
x = 87;
px = &x; /* px berisi alamat dari x */
y = *px; /* y berisi nilai yang ditunjuk px */
cout<<“Alamat x =”<<&x <<\n”;
cout<<“Isi px = \n”, px);
cout<<“Isi x = \n”, x);
cout<<“Nilai yang ditunjuk oleh px = \n”, *px);
cout<<“Nilai y = \n”, y);
getch();
}
OPERASI POINTER
Operasi Penugasan
Suatu variable pointer seperti halnya variable yang lain, juga bisa mengalami operasi
penugasan. Nilai dari suatu variable pointer dapat disalin ke variable pointer yang lain.




//Contoh
#include "iostream.h"
#include "conio.h"
void main()
{ float *x1,y, *x2;
clrscr();
y = 13.45;
x1 = &y;            /* Alamat dari y disalin ke variabel x1 */
x2 = x1;            /* Isi variabel x1 disalin ke variabel x2 */
cout<<"Nilai variabel y =  "<<y<< " ada di alamat "<< x1<<"\n";
cout<<"Nilai variabel y =  "<<y<< " ada di alamat "<< x2<<"\n";
 getch();
}
Operasi Aritmatika
Suatu variabel pointer hanya dapat dilakukan operasi aritmatika dengan nilai integer saja. Operasi yang biasa dilakukan adalah operasi penambahan dan pengurangan. Operasi penambahan dengan suatu nilai menunjukkan lokasi data berikutnya (index selanjutnya) dalam memori. Begitu juga operasi pengurangan.
//Contoh9_3
#include <iostream.h>
#include <conio.h>
void main()
{ int nilai[3], *penunjuk;
clrscr();
nilai[0] = 125;
nilai[1] = 345;
nilai[2] = 750;
penunjuk = &nilai[0];
cout<<"Nilai "<<*penunjuk <<" ada di alamat memori " <<penunjuk<<"\n";
cout<<"Nilai "<<*(penunjuk+1) <<" ada di alamat memori " <<penunjuk+1<<"\n";
cout<<"Nilai "<<*(penunjuk+2) <<" ada di alamat memori " <<penunjuk+2<<"\n";
getch();
}
Operasi Logika
Suatu pointer juga dapat dikenai operasi logika.
//Contoh
#include<iostream.h>
#include "conio.h"
void main()
{ int a = 100, b = 200, *pa, *pb;
clrscr();
pa = &a;
pb = &b;
cout<<"nilai pa= "<<pa<< " nilai pb= "<<pb<<"\n";
if(pa < pb)
cout<<"pa menunjuk ke memori lebih rendah dari pb\n";
if(pa == pb)
cout<<"pa menunjuk ke memori yang sama dengan pb\n";
if(pa > pb)
cout<<"pa menunjuk ke memori lebih tinggi dari pb\n";
getch();}
POINTER DAN STRING
//Contoh
#include <iostream.h>
#include <conio.h>
void misteri1(char *);
void main() {
char string[] = "amikom";
cout<< "String sebelum proses adalah " << string <<"\n" ;
misteri1(string);
cout<<"String setelah proses adalah "<<string;
getch();
}
void misteri1(char *s) {
while ( *s != '\0' ) {
if ( *s >= 'a' && *s <= 'z' )
*s -= 32;
++s;
}
}
 POINTER MENUNJUK SUATU ARRAY
//Contoh
#include "iostream.h"
#include "conio.h"
void main()
{ static int tgl_lahir[] = { 13,9,1982 };
int *ptgl;
ptgl = tgl_lahir; /* ptgl berisi alamat array */
cout<<"Diakses dengan pointer\n";
cout<<"Tanggal = "<< *ptgl<<"\n";
cout<<"Bulan = "<< *(ptgl + 1) <<"\n";
cout<<"Tahun = "<<*(ptgl + 2) <<"\n";
cout<<"\nDiakses dengan array biasa\n";
cout<<"Tanggal = "<< tgl_lahir[0] <<"\n";
cout<<"Bulan = "<< tgl_lahir[1] <<"\n";
cout<<"Tahun = "<< tgl_lahir[2] <<"\n";
getch();
}
MEMBERI NILAI ARRAY DENGAN POINTER
//contoh
#include "iostream.h"
#include "conio.h"
void main()
{ int x[5], *p, k;
clrscr();
p = x;
x[0] = 5;
x[1] = x[0];
x[2] = *p + 2;
x[3] = *(p+1) - 3;
x[4] = *(x + 2);
for(k=0; k<5; k++)
cout<<"x["<<k<<"] = "<< x[k]<<"\n";
getch();
}

 

MEMORI DINAMIS

Pada contoh program di samping kiri sejumlah memori secara ekplisit disisihkan untuk menampung array titik yang mempunyai 10 elemen. Sebenamya alokasi memori ini, hanya yang dibutuhkan saja, dapat dilakukan secara dinamis yaitu dilakukan pada saat run-time, Untuk melakukan hal ini kita perlu array yang elemen elemennya adalah pointer ke suatu struktur seperti dijelaskan pada program di samping kanan.
             Alokasi memori secara dinamis dilakukan dengan operator new dan dealokasi dilakukan dengan operator delete. Keduanya merupakan operator baru pada C++