List Linier (Linked list) Dan Variasinya_Struktur Data

Struktur Data List 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.
List linier adalah sekumpulan elemen bertipe sama yang mempunyai keturutan tertentu, dan setiap elemen nya terdiri dari dua bagian, yaitu informasi mengenai elemen nya dan informasi mengenai alamat elemen suksesornya. Penggunaan List dalam Kehidupan Sehari - hari Misalnya:
• Urutan angka pada keyboard komputer
• Urutan lagu pada playlist Mp3 player
• Dll

Linked List ( LL ) Adalah koleksi data item yang tersusun dalam sebuah barisan  secara linear, dengan penyisipan dan pemindahan dapat dilakukan dalam semua tempat di LL tersebut. Single Linked List Adalah sebuah LL yang menggunakan sebuah variabel pointer saja untuk menyimpan banyak data dengan metode LL, suatu daftar isi yang saling berhubungan. Double Linked List, Dalam double LL ( Linked List berpointer ganda ) dapat mengatasi kelemahan-kelemahan single LL tersebut. Circular Linked List Adalah double / single LL yang simpul terakhirnya menunjuk ke simpul awal, dan simpul awalnya menunjuk ke simpul akhir, atau dapat disebut LL yang dibuat seakan-akan merupakan sebuah lingkaran dengan titik awal dan titik akhir saling bersebelahan jika LL tersebut masih kosong.
List linier memiliki 2 jenis, yaitu:
Stack (Tumpukan): Struktur data linear dimana penambahan atau pengurangan komponen dilakukan di satu ujung saja dan merupaan suatu bentuk khusus dari linear list di mana operasi penyisipan dan penghapusan atas elemen-elemennya hanya dapat dilakukan pada satu sisi saja.
Operasi pada stack:
1). Push : Operator ini berfungsi untuk menambahkan satu elemen ke dalam stack.
2). Pop : Operator ini berfungsi untuk mengeluarkan satu elemen dari dalam stack.
Queue (Antrian): Struktur data linear dimana penambahan komponen dilakukan di satu ujung, sementara pengurangan dilakukan di ujung lain.
Struktur Data, meliputi:
  • Struktur data sederhana, misalnya array dan record.
  • Struktur data majemuk, yang terdiri dari:
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 )


Linked-list yang kerap kali disebut pula one-way List, adalah koleksi linear dari elemen data yang disebut simpul atau node.
Cara melinearkan urutan, adalah dengan menggunakan penuding atau pointer.
  Struktur Data linier • Array : matrik dimensi satu dan dua bersifat statis. • Stack (tumpukan) , termasuk array dimensi satu. • Queue (antrian),ada yg linier dan circular termasuk array dimensi satu. • Dequeue (doble ended queue), termasuk array dimensi satu. • Matrix, array dimensi dua. • Linked List ( lis berkait) bersifat dinamis, terdiri dari : • Linier Single Linked List dan Doble Linked List. • Circular Single Linked List (multi Linked List) dan Doble Linked List(operasinya Insert dan Delete)
Jika L adalah list , dan P adalah address :
Alamat elemen pertama list L dapat diacu
dengan notasi :
First (L)
Elemen yang diacu oleh P dapat dikonsultasi
informasinya dengan notasi :
Info(P)
  Next(P)
Beberapa definisi :
1. List L adalah List kosong , jika First (L) = Nil
2. Elemen terakhir dikenali, dengan salah satu cara adalah karena Next(Last) =Nil
Nil adalah pengganti Null, dalam bahasa C perubahan ini dituliskan dengan
#define Nil  Null


Procedure
SKEMAListTraversal1 (Input L : List)
{ I.S. List L terdefinisi , mungkin kosong }
{F.S.semua elemen list L "dikunjungi" dan telah diproses }
{ Traversal sebuah list linier . Dengan MARK, tanpa pemrosesan khusus pada list kosong }
Kamus
:
P : address {address untuk traversal, type terdefinisi}
procedure Proses (Input P : address){pemrosesan elemen beraddress P }
procedure Inisialisasi { aksi sebelum proses dilakukan }
procedure Terminasi { aksi sesudah semua pemrosesan elemen selesai }
Algoritma
:
Inisialisasi
P First(L)
while (P Nil) do
Proses (P)
P Next(P)
Terminasi

Procedure
SKEMAListTraversal2 (Input L: List)
{ I.S. List L terdefinisi , mungkin kosong }
{F.S. semua elemen list L "dikunjungi" dan telah diproses }
{ Traversal sebuah list linier yang diidentifikasi oleh elemen pertamanya L}
{Sekam sekuensial dengan MARK dan pemrosesan khusus pada list kosong}
Kamus:
P : address {address untuk traversal}
procedure Proses (InputP : address){pemrosesan elemen ber-address P }
procedure Inisialisasi { aksi sebelum proses dilakukan }
procedure Terminasi { aksi sesudah semua pemrosesan elemen selesai }
Algoritma :
if First(L) = Nil then
output ('List kosong')
else
Inisialisasi
P First(L)
repeat
Proses (P)
P Next(P)
until (P = Nil)
Terminasi

Procedure SKEMAListTraversal3(Input L : List)
{ I.S. List L terdefinisi , tidak kosong: minimal mengandung satu elemen}
{F.S.semua elemen list L "dikunjungi" dan telah diproses }
{ Skema sekuensial tanpa MARK, tidak ada list kosong karena tanpa mark}
Kamus:
P : address {address untuk traversal, type terdefinisi}
procedure Proses (Input P : address){pemrosesas elemen ber-address P}
procedure Inisialisasi { aksi sebelum proses dilakukan }
procedure Terminasi { aksi sesudah semua pemrosesan elemen selesai }
Algoritma :
Inisialisasi
P First(L)
iterate
Proses (P)
stop Next(P) = Nil
P Next(P)
Terminasi

Daftar link adalah cara untuk menyimpan data dengan struktur sehingga programmer dapat secara otomatis membuat tempat baru untuk menyimpan data kapan pun diperlukan. Secara khusus, programmer menulis sebuah struct atau kelas definisi yang berisi variabel yang memegang informasi tentang sesuatu, dan kemudian memiliki pointer ke struct dari jenis. Masing-masing individu atau struct kelas dalam daftar umumnya dikenal sebagai node.

Linked List (contoh Penambahan, Pencarian, dan Penghapusan Data)

* Linked List
 * - Penambahan data di awal, tengah, dan akhir
 * - Penghapusan data di awal, tengah, dan akhir
 * - Menampilkan Data
 * 
 * by Alan (alan.benito@widyatama.ac.id)
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define CLS system("cls");
#define PAUSE {printf("\n"); system("pause");}
 
// membandingkan dua buah string (ignore case)
int compare(char *str1, char *str2) {
    int len = strlen(str1);
    int beda = 0;
    
    for (int i=0; i<len; i++) {
        if (str1[i] >= 'A' && str1[i] <= 'Z') str1[i] += 32;
        if (str2[i] >= 'A' && str2[i] <= 'Z') str2[i] += 32;
        
        if (str1[i] != str2[i]) beda++;
        if (str2[i] == '') {
            beda++;
                return beda;
        }
    }
        
    if (strlen(str2) > len) {
        beda += strlen(str2) - len;
    }
        
    return beda;
}
 
int main()
{
    struct list {
        char npm[16];
        char nama[64];
        float nilai;
        struct list *next;
    };
    
    struct list *awal, *akhir, *p, *Psbl, *baru;
    
    awal = akhir = NULL;
    
    int pilihan = 1, posisi, posisi_sekarang,posisi_data;
    char cari[64], konfirmasi;
    do {
        switch (pilihan) {
            case 1: // tambah data kedalam list
                CLS;
                baru = (struct list *) malloc(sizeof(struct list)); // alokasikan list baru di memori
                if (baru == NULL) {
                    CLS;
                    printf("\nMemori tidak cukup.");
                    PAUSE;
                    break;
                }
                printf("\nNPM   : "); scanf("%s", baru->npm); getchar();
                printf("Nama  : "); scanf("%[^\n]", baru->nama);
                printf("Nilai : "); scanf("%f", &baru->nilai);
                
                if (awal == NULL) {
                    baru->next = NULL;
                    awal = baru;
                    akhir = baru;
                } else { 
                    printf("\nTambahkan Data di (Default = akhir) : \n");
                    printf("1. Awal\n2. Tengah\n3. Akhir\n\nPilihan Anda : ");
                    scanf("%d", &posisi);                   
                    switch(posisi) {
                        case 1:
                            // tambah data di awal list
                            baru->next = awal;
                            awal = baru;
                            PAUSE;                          
                            break;
                        
                        case 2:
                            printf("Masukan posisi data : "); scanf("%d", &posisi_data);
                            p = awal;
                            Psbl = NULL;
                            posisi_sekarang = 1;
                            while (p != NULL && posisi_sekarang < posisi_data) {
                                //Psbl = p;
                                p = p->next;
                                posisi_sekarang++;
                            }
                            if (p != NULL) {
                                // tambahkan data di tengah (posisi_data)
                                Psbl = p;
                                baru->next = p->next;
                                Psbl->next = baru;
                            }
                            break;
                            
                        case 3:
                        default:
                            // tambah data di akhir list
                            akhir->next = baru; 
                            akhir = baru;
                            baru->next = NULL;
                            PAUSE;              
                            break;
                    }
                }
 
                break;
            
            case 2:
                CLS;
                p = awal;
                printf("\n------------------------------------------\n");
                if (p == NULL) {
                    printf("\n List Kosong\n");
                    printf("\n------------------------------------------\n");
                    break;
                } else {
                    while (p != NULL) {
                        printf("\nNPM   : %s", p->npm);
                        printf("\nNama  : %s", p->nama);
                        printf("\nNilai : %.2f", p->nilai);
                        printf("\n------------------------------------------\n");
                        p = p->next;
                    }
                }
                
                printf("\n");               
                printf("Masukan NPM/Nama dari data yang ingin dihapus : ");
                scanf("%s", cari);
                CLS;
                Psbl = NULL;
                p = awal;
                while (p != NULL) {
                    if (compare(p->npm, cari) == 0 || compare(p->nama, cari) == 0) {
                        printf("\n\n------------------------------------------\n");
        
                        printf("\nNPM   : %s", p->npm);
                        printf("\nNama  : %s", p->nama);
                        printf("\nNilai : %.2f", p->nilai);
                        printf("\n------------------------------------------\n");
                        
                        printf("\nIngin menghapus data di atas (y/n) : ");
                        scanf("%s", &konfirmasi);
                        if (konfirmasi == 'y' || konfirmasi == 'Y') {
                            if (awal->next == NULL) {
                                awal = NULL;
                                akhir = awal;
                            } else if (p == awal) {
                                // hapus di awal
                                Psbl = awal;
                                awal = Psbl->next;
                            } else if (p == akhir) {
                                // hapus di akhir
                                Psbl->next = NULL;
                                akhir = Psbl;
                            }
                            else {
                                // hapus di tengah
                                Psbl->next = p->next;
                            }
                            
                            printf("\nData berhasil dihapus.\n\n");
                        } else {
                            printf("\nData tidak jadi dihapus.\n\n");
                        }
                        
                        break;
                    }
                    Psbl = p;
                    
                    p = p->next;
                }
                
                if (p == NULL) {
                    printf("\n\nNPM/Nama tidak ditemukan !\n\n");
                }
                PAUSE;
                break;
            
            case 3:
                CLS; 
                printf("\nMasukan NPM/Nama yang di cari : "); 
                scanf("%s", cari);
                
                p = awal;
                while (p != NULL) {
                    if (compare(p->npm, cari) == 0 || compare(p->nama, cari) == 0) {
                        printf("\n\n------------------------------------------\n");
        
                        printf("\nNPM   : %s", p->npm);
                        printf("\nNama  : %s", p->nama);
                        printf("\nNilai : %.2f", p->nilai);
                        printf("\n------------------------------------------\n");
                        
                        PAUSE;
                        break;
                    }
                    p = p->next;
                }
                if (p == NULL) {
                    printf("\nData tidak ditemukan ! \n\n");
                    PAUSE;
                }
                break;
            
            case 4: // tampilkan list
                CLS;
            
                p = awal;
                printf("\n------------------------------------------\n");
                if (p == NULL) {
                    printf("\n List Kosong\n");
                    printf("\n------------------------------------------\n");
                } else {
                    while (p != NULL) {
                        printf("\nNPM   : %s", p->npm);
                        printf("\nNama  : %s", p->nama);
                        printf("\nNilai : %.2f", p->nilai);
                        printf("\n------------------------------------------\n");
                        p = p->next;
                    }
                }
                printf("\n");
                PAUSE;
                break;
                
            case 0: break;
            
            default:
                printf("\nPilihan salah !\n");
                break;
        }
    
        CLS;
        printf("\n1. Tambahkan data kedalam list\n"
                 "2. Hapus data\n"
                 "3. Pencarian data\n"
                 "4. Tampilkan list\n"
                 "0. Keluar\n\n");
        printf("Pilihan Anda : ");
        scanf("%d", &pilihan);
    } while (pilihan > 0);
 
    
 
    return 0;
}
 
/**
 * Linked List
 * - Penambahan data di awal, tengah, dan akhir
 * - Penghapusan data di awal, tengah, dan akhir
 * - Menampilkan Data
 * 
 * by Alan (alan.benito@widyatama.ac.id)
 */
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define CLS system("cls");
#define PAUSE {printf("\n"); system("pause");}

// membandingkan dua buah string (ignore case)
int compare(char *str1, char *str2) {
 int len = strlen(str1);
 int beda = 0;
 
 for (int i=0; i<len; i++) {
  if (str1[i] >= 'A' && str1[i] <= 'Z') str1[i] += 32;
  if (str2[i] >= 'A' && str2[i] <= 'Z') str2[i] += 32;
  
  if (str1[i] != str2[i]) beda++;
  if (str2[i] == '') {
   beda++;
    return beda;
  }
 }
  
 if (strlen(str2) > len) {
  beda += strlen(str2) - len;
 }
  
 return beda;
}

int main()
{
 struct list {
  char npm[16];
  char nama[64];
  float nilai;
  struct list *next;
 };
 
 struct list *awal, *akhir, *p, *Psbl, *baru;
 
 awal = akhir = NULL;
 
 int pilihan = 1, posisi, posisi_sekarang,posisi_data;
 char cari[64], konfirmasi;
 do {
  switch (pilihan) {
   case 1: // tambah data kedalam list
    CLS;
    baru = (struct list *) malloc(sizeof(struct list)); // alokasikan list baru di memori
    if (baru == NULL) {
     CLS;
     printf("\nMemori tidak cukup.");
     PAUSE;
     break;
    }
    printf("\nNPM   : "); scanf("%s", baru->npm); getchar();
    printf("Nama  : "); scanf("%[^\n]", baru->nama);
    printf("Nilai : "); scanf("%f", &baru->nilai);
    
    if (awal == NULL) {
     baru->next = NULL;
     awal = baru;
     akhir = baru;
    } else { 
     printf("\nTambahkan Data di (Default = akhir) : \n");
     printf("1. Awal\n2. Tengah\n3. Akhir\n\nPilihan Anda : ");
     scanf("%d", &posisi);     
     switch(posisi) {
      case 1:
       // tambah data di awal list
       baru->next = awal;
       awal = baru;
       PAUSE;       
       break;
      
      case 2:
       printf("Masukan posisi data : "); scanf("%d", &posisi_data);
       p = awal;
       Psbl = NULL;
       posisi_sekarang = 1;
       while (p != NULL && posisi_sekarang < posisi_data) {
        //Psbl = p;
        p = p->next;
        posisi_sekarang++;
       }
       if (p != NULL) {
        // tambahkan data di tengah (posisi_data)
        Psbl = p;
        baru->next = p->next;
        Psbl->next = baru;
       }
       break;
       
      case 3:
      default:
       // tambah data di akhir list
       akhir->next = baru; 
       akhir = baru;
       baru->next = NULL;
       PAUSE;    
       break;
     }
    }

    break;
   
   case 2:
    CLS;
    p = awal;
    printf("\n------------------------------------------\n");
    if (p == NULL) {
     printf("\n List Kosong\n");
     printf("\n------------------------------------------\n");
     break;
    } else {
     while (p != NULL) {
      printf("\nNPM   : %s", p->npm);
      printf("\nNama  : %s", p->nama);
      printf("\nNilai : %.2f", p->nilai);
      printf("\n------------------------------------------\n");
      p = p->next;
     }
    }
    
    printf("\n");    
    printf("Masukan NPM/Nama dari data yang ingin dihapus : ");
    scanf("%s", cari);
    CLS;
    Psbl = NULL;
    p = awal;
    while (p != NULL) {
     if (compare(p->npm, cari) == 0 || compare(p->nama, cari) == 0) {
      printf("\n\n------------------------------------------\n");
  
      printf("\nNPM   : %s", p->npm);
      printf("\nNama  : %s", p->nama);
      printf("\nNilai : %.2f", p->nilai);
      printf("\n------------------------------------------\n");
      
      printf("\nIngin menghapus data di atas (y/n) : ");
      scanf("%s", &konfirmasi);
      if (konfirmasi == 'y' || konfirmasi == 'Y') {
       if (awal->next == NULL) {
        awal = NULL;
        akhir = awal;
       } else if (p == awal) {
        // hapus di awal
        Psbl = awal;
        awal = Psbl->next;
       } else if (p == akhir) {
        // hapus di akhir
        Psbl->next = NULL;
        akhir = Psbl;
       }
       else {
        // hapus di tengah
        Psbl->next = p->next;
       }
       
       printf("\nData berhasil dihapus.\n\n");
      } else {
       printf("\nData tidak jadi dihapus.\n\n");
      }
      
      break;
     }
     Psbl = p;
     
     p = p->next;
    }
    
    if (p == NULL) {
     printf("\n\nNPM/Nama tidak ditemukan !\n\n");
    }
    PAUSE;
    break;
   
   case 3:
    CLS; 
    printf("\nMasukan NPM/Nama yang di cari : "); 
    scanf("%s", cari);
    
    p = awal;
    while (p != NULL) {
     if (compare(p->npm, cari) == 0 || compare(p->nama, cari) == 0) {
      printf("\n\n------------------------------------------\n");
  
      printf("\nNPM   : %s", p->npm);
      printf("\nNama  : %s", p->nama);
      printf("\nNilai : %.2f", p->nilai);
      printf("\n------------------------------------------\n");
      
      PAUSE;
      break;
     }
     p = p->next;
    }
    if (p == NULL) {
     printf("\nData tidak ditemukan ! \n\n");
     PAUSE;
    }
    break;
   
   case 4: // tampilkan list
    CLS;
   
    p = awal;
    printf("\n------------------------------------------\n");
    if (p == NULL) {
     printf("\n List Kosong\n");
     printf("\n------------------------------------------\n");
    } else {
     while (p != NULL) {
      printf("\nNPM   : %s", p->npm);
      printf("\nNama  : %s", p->nama);
      printf("\nNilai : %.2f", p->nilai);
      printf("\n------------------------------------------\n");
      p = p->next;
     }
    }
    printf("\n");
    PAUSE;
    break;
    
   case 0: break;
   
   default:
    printf("\nPilihan salah !\n");
    break;
  }
 
  CLS;
  printf("\n1. Tambahkan data kedalam list\n"
     "2. Hapus data\n"
     "3. Pencarian data\n"
     "4. Tampilkan list\n"
     "0. Keluar\n\n");
  printf("Pilihan Anda : ");
  scanf("%d", &pilihan);
 } while (pilihan > 0);

 

 return 0; 
       } 

List Berkait/Linked List Sederhana (Tambah & Tampilkan Data)

 

#include <stdio.h>
#include <stdlib.h>
 
#define CLS system("cls");
#define PAUSE {printf("\n"); system("pause");}
 
int main()
{
    struct list {
        char npm[16];
        char nama[64];
        float nilai;
        struct list *next;
    };
    
    struct list *awal, *akhir, *p, *baru;
    
    awal = akhir = NULL;
    
    int pilihan = 1;
    do {
        switch (pilihan) {
            case 1: // tambah data kedalam list
                CLS;
                baru = (struct list *) malloc(sizeof(struct list)); // alokasikan list baru
                if (baru == NULL) {
                    CLS;
                    printf("\nMemori tidak cukup.");
                    PAUSE;
                    break;
                }
                printf("\nNPM   : "); scanf("%s", baru->npm); getchar();
                printf("Nama  : "); scanf("%[^\n]", baru->nama);
                printf("Nilai : "); scanf("%f", &baru->nilai);
                if (awal == NULL) {
                    awal = baru;
                    akhir = baru;
                } else { 
                    // tambah di akhir list
                    akhir->next = baru; 
                    akhir = baru;
                }
                baru->next = NULL;
                PAUSE;
                break;
            
            case 2: // tampilkan list
                CLS;
            
                p = awal;
                printf("\n------------------------------------------\n");
                while (p != NULL) {
                    printf("\nNPM   : %s", p->npm);
                    printf("\nNama  : %s", p->nama);
                    printf("\nNilai : %.2f", p->nilai);
                    printf("\n------------------------------------------\n");
                    p = p->next;
                }
                printf("\n");
                PAUSE;
                break;
                
            case 0: break;
            
            default:
                printf("\nPilihan salah !\n");
                break;
        }
    
        CLS;
        printf("\n1. Tambahkan data kedalam list\n2. Tampilkan list\n0. Keluar\n\n");
        printf("Pilihan Anda : ");
        scanf("%d", &pilihan);
    } while (pilihan > 0);
 
    
 
    return 0;
}

#include <stdio.h>
#include <stdlib.h>

#define CLS system("cls");
#define PAUSE {printf("\n"); system("pause");}

int main()
{
 struct list {
  char npm[16];
  char nama[64];
  float nilai;
  struct list *next;
 };
 
 struct list *awal, *akhir, *p, *baru;
 
 awal = akhir = NULL;
 
 int pilihan = 1;
 do {
  switch (pilihan) {
   case 1: // tambah data kedalam list
    CLS;
    baru = (struct list *) malloc(sizeof(struct list)); // alokasikan list baru
    if (baru == NULL) {
     CLS;
     printf("\nMemori tidak cukup.");
     PAUSE;
     break;
    }
    printf("\nNPM   : "); scanf("%s", baru->npm); getchar();
    printf("Nama  : "); scanf("%[^\n]", baru->nama);
    printf("Nilai : "); scanf("%f", &baru->nilai);
    if (awal == NULL) {
     awal = baru;
     akhir = baru;
    } else { 
     // tambah di akhir list
     akhir->next = baru; 
     akhir = baru;
    }
    baru->next = NULL;
    PAUSE;
    break;
   
   case 2: // tampilkan list
    CLS;
   
    p = awal;
    printf("\n------------------------------------------\n");
    while (p != NULL) {
     printf("\nNPM   : %s", p->npm);
     printf("\nNama  : %s", p->nama);
     printf("\nNilai : %.2f", p->nilai);
     printf("\n------------------------------------------\n");
     p = p->next;
    }
    printf("\n");
    PAUSE;
    break;
    
   case 0: break;
   
   default:
    printf("\nPilihan salah !\n");
    break;
  }
 
  CLS;
  printf("\n1. Tambahkan data kedalam list\n2. Tampilkan list\n0. Keluar\n\n");
  printf("Pilihan Anda : ");
  scanf("%d", &pilihan);
 } while (pilihan > 0);

 

 return 0;

Komentar

Posting Komentar

Postingan populer dari blog ini

Interrupt driven I/O

Menghitung Jarak Jatuh Peluru (C++)