Program Linked List C++

Posted by mahfuz On Jumat, 01 April 2011 0 komentar
Salah satu bentuk struktur data yang berisi kumpulan data yang tersusun secara sekuensial, saling bersambungan, dinamis dan terbatas adalah senarai berkait (linked list). Suatu senarai berkait (linked list) adalah suatu simpul (node) yang dikaitkan dengan simpul yang lain dalam suatu urutan tertentu. Suatu simpul dapat berbentuk suatu struktur atau class. Simpul harus mempunyai satu atau lebih elemen struktur atau class yang berisi data.
Secara teori, linked list adalah sejumlah node yang dihubungkan secara linier dengan bantuan pointer. Dikatakan single (singly) linked apabila hanya ada satu pointer yang menghubungkan setiap node. single artinya field pointer-nya hanya satu buah saja dan satu arah.

Contoh program Linked List:

#include <iostream>
#include <stdlib.h>

using namespace std;

// Node Class
class Node
{
private:
    int data;
    Node *pNext;
    Node *pPrevious;
public:
    Node(int d):data(d),pNext(NULL),pPrevious(NULL){}
    int getData()const{return data;}
    void setData(int d){data=d;}
    Node * getNext()const{return pNext;}
    void setNext(Node *p){pNext=p;}
    Node * getPrevious()const {return pPrevious;}
    void setPrevious(Node *p){pPrevious=p;}
};

// LinkedList class
class LinkedList
{
protected:
    Node *pHead; //penunjuk (pointer) untuk node awal
    Node *pTail; //penunjuk (pointer) untuk node terakhir
    int nodeCounter; //menghitung jumlah angka pada node
    Node * makeNode(int data);  // membuat dan menukar node baru.
    void remove(Node *tmp);  // menghilangkan node dari data yang dihubungkan (linked list).
public:
    LinkedList();
    ~LinkedList();

// pengoperasian
    void addFirst(int data);
    void addLast(int data);
    void addBefore(int index,int data);
    void removeFirst();
    void removeLast();
    void displayInOrder()const;
    void displayInReverseOrder()const;
    void destroyList();
    int getSize()const{return nodeCounter;}
};
LinkedList::LinkedList():
pHead(NULL),pTail(NULL),nodeCounter(0)
{}
LinkedList::~LinkedList()
{
    destroyList();
}
void LinkedList::displayInOrder()const
{
    if( !pHead )
    {
        cout<<"\nNULL";
        return ;
    }
    for(Node *cur=pHead;cur!=NULL;cur=cur->getNext())
        cout<<cur->getData()<<" -> ";
    cout<<"NULL"<<endl;
}
void LinkedList::displayInReverseOrder()const
{
    if( !pHead )
    {
        cout<<"\nNULL";
        return ;
    }
    for(Node *cur=pTail;cur!=NULL;cur=cur->getPrevious())
        cout<<cur->getData()<<" -> ";
    cout<<"NULL"<<endl;
}
Node * LinkedList::makeNode(int data)
{
    nodeCounter++;
    return new Node(data);
}
void LinkedList::addFirst(int data)
{
    // membuat node baru
    Node *pNew=makeNode(data); //membuat node baru sebagai node partama atau awal pada data yang dihubungkan (linked list).
    if( !pHead )  // jika data yang dihubungkan atau yang dimasukkan tersebut kosong.
        pHead=pTail=pNew;
    else // jika terdapat beberapa node.
    {
        pNew->setNext(pHead);
        pHead->setPrevious(pNew);

        pHead=pNew;
    }
}
void LinkedList::addLast(int data)
{
    // membuat node baru
    Node *pNew=makeNode(data);
    // membuat node baru sebagai node terakhir pada data yang dihubungkan (linked list).
    //jika pada kondisi tidak terdapat node pada data yang dihubungkan (linked list), maka ditambah node lagi.
    //cara lain untuk memindahkan sebuah node baru ke tempat node yang terakhir.

    if( !pHead )
        pHead=pTail=pNew;
    else
    {
        pTail->setNext(pNew);
        pNew->setPrevious(pTail);
        pTail=pNew;
    }
}
void LinkedList::addBefore(int index,int data)
{
    // mengecek atau memeriksa index untuk mengetahui apakah data yang dimasukkan sesuai atau tidak.
    if( index <1 || index > getSize() )
    {
        cerr<<"\nError: index is too hight/low ";
        return;
    }

    if(index == 1)
    {
         addFirst(data);
         return ;
    }

    // Membuat node baru
    Node *pNew=makeNode(data);
    Node *pCur=pHead;
    for(int i=1;i<index -1;i++,pCur=pCur->getNext());
    pNew->setNext(pCur->getNext());
    pCur->setNext(pNew);
}
void LinkedList::removeFirst()
{
    if( !pHead )
    {
        cerr<<"\nTidak ada node yang akan dihilangkan!!";
        return ;
    }
    Node *pTmp=pHead;
    pHead=pHead->getNext();
    if(pHead)
        pHead->setPrevious(NULL);
    else
        pHead=pTail=NULL;

    remove(pTmp);
}
void LinkedList::remove(Node *tmp)
{
    delete tmp;
    nodeCounter--;
};
void LinkedList::removeLast()
{
    if( !pHead )
    {
        cerr<<"\nTidak ada node yang akan dihilangkan!!";
        return ;
    }
    Node *pTmp=pTail;
    pTail=pTail->getPrevious();
    if(pTail)
        pTail->setNext(NULL);
    else
        pTail=pHead=NULL;
    remove(pTmp);
}
void LinkedList::destroyList()
{
    Node *pTmp=pHead;
    Node *pCur;
    while( pTmp != NULL)
    {
        pCur=pTmp;
        pTmp=pTmp->getNext();
        remove(pCur);
    }

}


//fungsi utama
int main()
{
    LinkedList *p=new LinkedList;
   
    for(int i=0;i<5;i++)
        p->addLast(2*i+1);
    cout<<"\nNAMA    :    MAHFUZ\n";
    cout<<"\nNIM    :    100533405403\n";
    cout<<"\nKELAS    :    PTI '10 B\n";

    cout<<"\ndata yang telah dihubungkan atau dimasukkan pada fungsi perintah:\n";
    p->displayInOrder();
    cout<<"\ndata yang telah dibalikkan pada fungsi perintah:\n";
    p->displayInReverseOrder();
    cout<<"\nmenambahkan 2 sebelum node ke dua (3). \n";
    p->addBefore(2,2);
    cout<<"\nmenembahkan 4 sebelum node ke empat (5). \n";
    p->addBefore(4,4);
    cout<<"\nmenambahkan 6 sebelum node ke enam (7). \n";
    p->addBefore(6,6);
    cout<<"\nmenambahkan 8 sebelum node ke delapan (9). \n";
    p->addBefore(8,8);
    cout<<"\ndata yang telah dihubungkan atau dimasukkan pada fungsi perintah: \n";
    p->displayInOrder();
    return 0;
}





Semoga bermanfaat bagi anda.

0 komentar:

Posting Komentar