Jumat, 07 Maret 2014

Array, Pointer dan Link List

Apakah itu Array?


Array adalah kumpulan data yang memiliki tipe data yang sama (misalkan : int, char float). Karena itu array bersifat homogen. Untuk meinisialisasikan array, kita harus menuliskan jumlah index dari array tersebut.
Contoh: int Array[10]   <~~ Dalam hal ini kita membuat 10 kotak yang dapat diisi dengan tipe data integer.
            char Array2[10]   <~~ Dalam hal ini kita membuat 10 kotak yang dapat diisi dengan tipe data char.

Bagaimana cara mengakses nilai dalam array?


Seperti yang sudah kita tahu bahwa Array memiliki index yang menunjukkan berapa kotak yang tersedia dari array tersebut. Untuk index pertama / data pertama dari suatu array dimulai dengan [0]. Sehingga untuk menggakses nilai pertamanya, perlu dituliskan array[0]. Batas indexnya adalah (n-1) dengan n adalah jumlah kotak yang tersedia.

Contoh: int Array[10] <~~~ Tersedia 10 kotak yang berisi integer
             Untuk mengakses nilai pertama dari Array tersebut dapat kita tuliskan:
             Array[0] <~~~ Untuk mengakses nilai pertama dari array.
             Array[1] <~~~ Untuk mengakses nilai kedua dari array.
             Array[9] <~~~ Untuk mengakses nilai kesepuluh dari array.

Sebuah Array juga dapat memiliki 2 index, atau biasa disebut dengan array 2-D. Dalam ini, kita dapat menganggap array tersebut memiliki kotak kesamping (baris) dan kotak kebawah (kolom).
Untuk dapat menginisialisasikan array tersebut, kita hanya perlu menambahkan indexnya.
Contoh: int Array[10][5] <~~~ Array memiliki 10 kotak kebawah dan 5 kotak kesamping.

Untuk dapat mengakses nilainya pun sama seperti array 1-D, kita hanya perlu menuliskan indexnya. Index pertama juga dimulai dari 0, dan diakhiri dengan (n-1) dari jumlah kotak.
Selain itu array juga dapat memiliki 3 index dan selanjutnya.

Apakah itu Pointer?


Sesuai dengan namanya yang berarti penunjuk, pointer akan menunjuk ke suatu hal. Apakah yang ditunjuk oleh pointer? jawabannya adalah alamat dari suatu variabel / memory pada komputer.
Untuk menuliskan pointer kita akan menggunakan lambang (*) dan untuk menuliskan alamat yang variabel yang ditunjuk kita akan menggunakan lambang (&).

Contoh: void main(){
                   int *penunjuk;  <~~~ inisialisasi pointer
                   int angka = 10; <~~~ kita memiliki variabel "angka" yang mempunyai alamat
                                                    pada memory dan nilai angka adalah 10.
                   penunjuk = &angka; <~~~ penunjuk akan menunjuk / mengambil alamat dari angka
             }
Dari contoh diatas, maka penunjuk akan menunjuk alamat dari angka, sehingga nilai penunjuk akan mengikuti angka. Begitu juga bila penunjuk sudah menunjuk alamat angka, dan kita mengganti nilai angka maupun penunjuk, maka nilainya akan sama-sama berubah.

Apa itu Link List?


Sebelum mengetahui apa itu Link List, saya akan memberitahu sedikit mengenai Struct.
Struct adalah tipe data abstrak yang dapat menyimpan lebih dari satu tipe data (dapat di sebut heterogen).

Setelah mengetahui sedikit mengenai struct, kita akan membahas dasar mengenai Link List.
Link List merupakan beberapa struct yang saling terhubung. Sama seperti array, link list berguna agar kita dapat mengakses data kita yang ada didalam list.
Pada Link List terdapat struct yang menyimpan data berupa int, char, dan lainnya sesuai yang kita butuhkan.
selain itu link list juga terdapat (next) yang menyimpan alamat dari data selanjutnya. Setiap kumpulan data/nilai dan next tersebut (node). Sehingga setiap node akan menyimpan kumpulan nilai maupun character dan alamat node selanjutnya. Nantinya node pertama akan terhubung dengan node kedua dan seterusnya.
Node pertama disebut dengan head. Ketika kita ingin mengakses node-node tersebut, kita akan mulai mengaksesnya dari head dan seterusnya. Node terakhir disebut juga tail.

Keuntungan dan Kerugian Link List vs Array
Namun sedikit perbedaan link list dan array, pada array kita dapat mengakses secara langsung dengan menyebutkan indexnya. Namun pada link list kita harus mengakses secara sequence (satu persatu) dari head ke tail (awal ke akhir). Lalu apa keunggulan link list? Keuntungan dari link list adalah jumlah memory yang terpakai dapat dibuat lebih kecil dari array.

Pada array kita menginisialisasikan index, yang artinya memory pada komputer akan menyediakan memory sebanyak jumlah index tersebut. Walaupun setiap index/kotak pada array tersebut tidak terpakai, komputer akan tetap menyediakan memory tersebut. Sehingga memory yang dibutuhkan tidak efesien.

Sedangkan pada Link List, komputer hanya akan memesan memori pada komputer sejumlah struct / semua isi dari struct tersebut.
Contoh Kode untuk membuat Link List, yang di dalam structnya terdapat (nama barang, harga).
Lalu ada 3 fungsi, yaitu mengisi nama barang & harga, mengambil nama barang & harga, :serta menghapus node berserta isinya.
Inisialisasi node:

struct Toko{
    char nama_barang[25];
    int harga;
    struct Toko *next;
}*head, *tail;

2 Cara memasukkan nilai:

1. void pushDepan(char nama_barang[],int harga){
    struct Toko *curr = (struct Toko*) malloc(sizeof(struct Toko));
    strcpy(curr->nama_barang , nama_barang);
    curr->harga = harga;
    if(head == NULL){
        head = tail = curr;
        tail->next = NULL;
    }else{
        curr->next = head;
        head = curr;
    }
}

2. void pushBelakang(char nama_barang[], int harga){
    struct Toko *curr = (struct Toko*) malloc(sizeof(struct Toko));
    strcpy(curr->nama_barang, nama_barang);
    curr->harga = harga;
    if(head == NULL){
        head = tail = curr;
    }else{
        tail->next = curr;
        tail = curr;       
    }
    tail->next = NULL;
}

2 Cara untuk menghapus node:


1. void popDepan(){
    if(head){
        struct Toko *curr = head;
        if(head == tail){
            //1
            head = tail = NULL;
            free(curr);
        }else{
            //>1
            head = head->next;
            free(curr);
        }
    }else{
        printf("No more data to be deleted..\n\n");
    }
}

2. void popBelakang(){
    if(head){
        struct Toko *curr = head;
        if(head == tail){
            //1
            head = tail = NULL;
            free(curr);
        }else{
            //>1
            while(curr->next != tail){
                curr=curr->next;
            }
            tail = curr;
            free(curr->next);
            tail->next = NULL;
        }
    }else{
        printf("No more data to be deleted..\n\n");
    }
}

Cara untuk mencetak nama barang & harga: 


void print(){
    struct Toko *curr;
    printf("=====================================================\n");
    printf("| %-23s | %-23s |\n","Nama Barang","Harga");
    printf("=====================================================\n");
    for(curr=head;curr!=NULL;curr=curr->next){
        printf("| %-23s | %-23d |\n",curr->nama_barang,curr->harga);
    }

    /*
        curr = head;
        while(curr){
            printf("| %-23s | %-23d |\n",curr->nama_barang,curr->harga);
            curr=curr->next;
        }
    */
    printf("=====================================================\n");
}

Bina Nusantara University                     skyconnectiva
=============================End================================


Tidak ada komentar:

Posting Komentar