Thursday, June 21, 2012

Linked List


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.
Ilustrasi single LL:

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 LL.
Bila dalam single LL pointer hanya dapat bergerak ke satu arah saja, maju / mundur, kanan / kiri, sehingga pencarian datanya juga hanya satu arah saja.
Double Linked List
Dalam double LL ( Linked List berpointer ganda ) dapat mengatasi kelemahan kelemahan single LL tersebut.
Ilustrasi double LL:


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, ilustrasi Circular LL :


Senarai berantai dapat diilustrasikan seperti satu kesatuan rangkaian kereta api. Kereta api terdiri dari beberapa gerbong, masingmasing dari gerbong itulah yang disebut record / tipe data bentukan.
Agar gerbong-gerbong tersebut dapat saling bertaut dibutuhkan minimal sebuah kait yang dinamakan sebagai pointer. Setelah mendeklarasikan tipe data dan pointer pada list, selanjutnya kita akan mencoba membuat senarai / linked list tunggal tidak berputar atau sebuah gerbong. Ada beberapa operasi yang dapat kita buat pada senarai tersebut, diantaranya: tambah, hapus dan edit dari gerbong tersebut.
Inti dari linked list adalah proses (tambah, edit, hapus) dari gerbong / node dan bagaimana menyambungkan antar gerbong / node tersebut.


Gambar diatas dilustrasikan sebuah rangkaian kereta api dengan 4 buah gerbong. Gerbong A akan disebut sebagai Depan / head (walaupun penamaan ini bebas) dan gerbong D adalah Akhir / tail.
Tanda panah merupakan kait atau pointer yang menghubungkan satu gerbong dengan yang lainnya. Pointer yang dimiliki D menuju ke Nil, inilah yang membedakan antara senarai berputar dengan yang tidak berputar. Kalau senarai berputar maka pointer dari D akan menuju ke A lagi.

PEMBENTUKAN NODE (GERBONG)
Digunakan keyword new yang berarti mempersiapkan sebuah node baru berserta alokasi memorinya, kemudian node tersebut diisi data dan pointer berikutnya ditunjuk ke Nil. Pembentukan node tidak dapat dilakukan sekaligus namun harus satu persatu, hal ini berkaitan dengan bagaimana cara menyambungkan antar node tersebut.





Code Program :
// Create the link list.

        string[] words =

            { "the", "fox", "jumped", "over", "the", "dog" };

        LinkedList<string> sentence = new LinkedList<string>(words);

        Display(sentence, "The linked list values:");

        Console.WriteLine("sentence.Contains(\"jumped\") = {0}",

            sentence.Contains("jumped"));



        // Add the word 'today' to the beginning of the linked list.

        sentence.AddFirst("today");

        Display(sentence, "Test 1: Add 'today' to beginning of the list:");



        // Move the first node to be the last node.

        LinkedListNode<string> mark1 = sentence.First;

        sentence.RemoveFirst();

        sentence.AddLast(mark1);

        Display(sentence, "Test 2: Move first node to be last node:");



        // Change the last node be 'yesterday'.

        sentence.RemoveLast();

        sentence.AddLast("yesterday");

        Display(sentence, "Test 3: Change the last node to 'yesterday':");



        // Move the last node to be the first node.

        mark1 = sentence.Last;

        sentence.RemoveLast();

        sentence.AddFirst(mark1);

        Display(sentence, "Test 4: Move last node to be first node:");





        // Indicate, by using parentheisis, the last occurence of 'the'.

        sentence.RemoveFirst();

        LinkedListNode<string> current = sentence.FindLast("the");

        IndicateNode(current, "Test 5: Indicate last occurence of 'the':");



        // Add 'lazy' and 'old' after 'the' (the LinkedListNode named current).

        sentence.AddAfter(current, "old");

        sentence.AddAfter(current, "lazy");

        IndicateNode(current, "Test 6: Add 'lazy' and 'old' after 'the':");



        // Indicate 'fox' node.

        current = sentence.Find("fox");

        IndicateNode(current, "Test 7: Indicate the 'fox' node:");



        // Add 'quick' and 'brown' before 'fox':

        sentence.AddBefore(current, "quick");

        sentence.AddBefore(current, "brown");

        IndicateNode(current, "Test 8: Add 'quick' and 'brown' before 'fox':");



        // Keep a reference to the current node, 'fox',

        // and to the previous node in the list. Indicate the 'dog' node.

        mark1 = current;

        LinkedListNode<string> mark2 = current.Previous;

        current = sentence.Find("dog");

        IndicateNode(current, "Test 9: Indicate the 'dog' node:");



        // The AddBefore method throws an InvalidOperationException

        // if you try to add a node that already belongs to a list.

        Console.WriteLine("Test 10: Throw exception by adding node (fox) already in the list:");

        try

        {

            sentence.AddBefore(current, mark1);

        }

        catch (InvalidOperationException ex)

        {

            Console.WriteLine("Exception message: {0}", ex.Message);

        }

        Console.WriteLine();



        // Remove the node referred to by mark1, and then add it

        // before the node referred to by current.

        // Indicate the node referred to by current.

        sentence.Remove(mark1);

        sentence.AddBefore(current, mark1);

        IndicateNode(current, "Test 11: Move a referenced node (fox) before the current node (dog):");



        // Remove the node referred to by current.

        sentence.Remove(current);

        IndicateNode(current, "Test 12: Remove current node (dog) and attempt to indicate it:");



        // Add the node after the node referred to by mark2.

        sentence.AddAfter(mark2, current);

        IndicateNode(current, "Test 13: Add node removed in test 11 after a referenced node (brown):");



        // The Remove method finds and removes the

        // first node that that has the specified value.

        sentence.Remove("old");

        Display(sentence, "Test 14: Remove node that has the value 'old':");



        // When the linked list is cast to ICollection(Of String),

        // the Add method adds a node to the end of the list.

        sentence.RemoveLast();

        ICollection<string> icoll = sentence;

        icoll.Add("rhinoceros");

        Display(sentence, "Test 15: Remove last node, cast to ICollection, and add 'rhinoceros':");



        Console.WriteLine("Test 16: Copy the list to an array:");

        // Create an array with the same number of

        // elements as the inked list.

        string[] sArray = new string[sentence.Count];

        sentence.CopyTo(sArray, 0);



        foreach (string s in sArray)

        {

            Console.WriteLine(s);

        }



        // Release all the nodes.

        sentence.Clear();



        Console.WriteLine();

        Console.WriteLine("Test 17: Clear linked list. Contains 'jumped' = {0}",

            sentence.Contains("jumped"));



        Console.ReadLine();

    }



    private static void Display(LinkedList<string> words, string test)

    {

        Console.WriteLine(test);

        foreach (string word in words)

        {

            Console.Write(word + " ");

        }

        Console.WriteLine();

        Console.WriteLine();

    }



    private static void IndicateNode(LinkedListNode<string> node, string test)

    {

        Console.WriteLine(test);

        if (node.List == null)

        {

            Console.WriteLine("Node '{0}' is not in the list.\n",

                node.Value);

            return;

        }



        StringBuilder result = new StringBuilder("(" + node.Value + ")");

        LinkedListNode<string> nodeP = node.Previous;



        while (nodeP != null)

        {

            result.Insert(0, nodeP.Value + " ");

            nodeP = nodeP.Previous;

        }



        node = node.Next;

        while (node != null)

        {

            result.Append(" " + node.Value);

            node = node.Next;

        }



        Console.WriteLine(result);

        Console.WriteLine();