240 likes | 491 Views
TINDANAN. PART 2. TINDANAN SECARA SENARAI BERPAUT. Bilangan data yang boleh disimpan tidak terhad. Ruangan ingatan yang diperuntukkan secara dinamik Apabila data baru ingin ditambah, ruang ingatan akan diperuntukkan oleh sistem
E N D
TINDANAN PART 2
TINDANAN SECARA SENARAI BERPAUT • Bilangan data yang boleh disimpan tidak terhad. • Ruangan ingatan yang diperuntukkan secara dinamik • Apabila data baru ingin ditambah, ruang ingatan akan diperuntukkan oleh sistem • Apabila data dibuang, ruang ingatan dipulangkan semula kepada sistem • Operasi asas bagi tindanan yang dilaksanakan secara senarai berpaut adalah sama dengan operasi asas bagi tindanan yang dilaksanakan secara tatasusunan. • Operasi semak_penuh () tidak diperlukan kerana bilangan data yang boleh disimpan tidak terhad. • Tindanan menggunakan senarai berpaut menggunakan nod untuk menyimpan item dalam tindanan dan pembolehubah penuding atas digunakan untuk merujuk nid dibahagian atas tindanan.
TINDANAN SECARA SENARAI BERPAUT • Setiap nod data di dalam tindanan mempunyai sekurang-kurangnya 2 medan iaitu medan data dan medan penuding. • Rajah 1 di bawah menunjukkan gambaran tindanan secara senarai berpaut. Dalam rajah ini, penuding atas menuding kepada bahagian atas tindanan, manakala setiap nod mempunyai medan data dan medan paut. paut paut data data atas Rajah 1 : Gambaran tindanan secara senarai berpaut
MENGISYTIHARKAN TINDANAN • Pengisytiharan tindanan men ggunakan senarai berpaut meliputi pengisytiharan bagi struktur nod dan kelas tindanan. • Aturcara 1 menunjukkan pengisytiharan bagi struktur yang mewakili nod dalam tindanan. • Pengisytiharan kelas tindanan adalah terdiri drp data ahli penuding atas yang berjenis penuding kepada struktur nod. • Pembolehubah penuding atas adalah penuding yang digunakan bagi menunjuk kepada nod yang pertama dalam senarai. typedef struct Nod { char data; struct Nod *paut; }nodTindan; Aturcara 1 : Pengisytiharan struktur nod dalam tindanan
MENGISYTIHARKAN TINDANAN • Bahagian public mengisytiharkan fungsi-fungsi asas tindanan seperti mencipta tindanan, menambah data, menghapus data, menyemak sama ada tindanan masih kosong atau tidak dan mengambil item pada bahagian atas tindanan. • Contoh pengisytiharan kelas tindanan ditunjukkan pada Aturcara 2. class Tindanan { private :// pengisytiharan ahli data nodTindan *atas; public : //pengisytiharan ahli fungsi Tindanan(); void tambah(char); void hapus(char &); char itemAtas(); bool semakKosong(); }; Aturcara 2 : Pengisytiharan kelas Tindanan
MENCIPTA TINDANAN • Mencipta tindanan adalah satu operasi untuk mengumpuknilai NULL kepada pembolehubah penuding yang menunjuk kpd nod pertama dalam senarai tindanan iaitu penuding atas. • Operasi ini boleh dilaksanakan melalui konstruktor • Konstruktor kelas Tindanan ditunjukkan pada Aturcara 3 Tindanan :: Tindanan () { atas = NULL; } atas Aturcara 3: Konstruktor tindanan Rajah 2 : Gambaran tindanan Selepas dicipta
MENCIPTA TINDANAN • Dengan perlaksanaan konstruktor ini, penuding atas akan menyimpan nilai NULL supaya penuding ini tidak menuding ke mana-mana lokasi ingatan yang lain. • Rajah 2 menunjukkan gambaran penuding atas yang telah diumpuk dengan nilai NULL selepas sesuatu objek dicipta.
MEMUSNAHKAN TINDANAN • Distruktor digunakan untuk memastikan tindanan yang dicipta semasa pengisytiharan objek akan dihapuskan secara automatik apabila sesuatu objek keluar daripada skopnya. • Ini akan memastikan ingatan yang tidak digunakan akan dipulangkan semula kepada sistem komputer. • Penghapusan bermula dari penuding sementara yang menuding kepada atas. • Nod yang dituding kepada sementara akan dihapuskan satu persatu sehingga tiada lagi nod di dalam tindanan tersebut iaitu apabila penuding sementara bernilai NULL. • Operasi penghapusan tindanan secara senarai berpaut ini ditunjukkan di Aturcara 4.
MEMUSNAHKAN TINDANAN Tindanan ::~ Tindanan (){ nodTindan *sementara = atas; // nod dihapuskan satu persatu while (sementara) { atas = sementara { atas = sementara->paut; delete sementara; sementara=atas; } } Aturcara 4 : Menghapuskan tindanan
MENYEMAK TINDANAN KOSONG • Fungsi menyemak tindanan kosong adalah untuk memastikan sama ada tindanan masih kosong ataupun sebaliknya • Fungsi ini diperlukan sebelum melaksanakan operasi menambah data dan menghapuskan data dari sesuatu senarai tindanan. • Ia boleh dilakukan dengan memeriksa sama ada penunjuk atas bernilai NULL ataupun tidak. • Sekiranya penuding atas benilai NULL, ini bermakna senarai tindanan masih belum mempunyai apa-apa nod data. • Aturcara 5 merupakan fungsi untuk menyemak tindanan kosong yang memulangkan nilai true sekiranya penuding atas bernilai NULL • Memulangkan nilai false sekiranya penuding atas bukan NULL.
MENYEMAK TINDANAN KOSONG bool Tindanan :: semakKosong () { return bool (atas == NULL) } Aturcara 5 : Fungsi menyemak tindanan kosong
MENAMBAH ITEM • Operasi menambah data dilaksanakan pada bahagian hadapan senarai tindanan • Operasi ini adalah sama seperti menambah data di hadapan senarai berpaut. • Sebelum melakukan operasi menambah data ini, sesuatu tindanan perlu diuji untuk mengetahui sama ada tindanan itu masih kosong atau telah mempunyai nod data di dalam senarainya • Sekiranya tindanan masih kosong, nod yang akan ditambah ini merupakan nod yang pertama dalam tindanan tersebut • Sebaliknya jika tindanan bukan kosong, nod yang akan ditambah ini akan ditambah di hadapan nod-nod yang lain • Oleh itu dua situasi menambah nod ialah tambah nod di dalam senarai yang masih kosong dan tambah nod di dalam senarai yang telah ada nod.
MENAMBAH ITEM • Aturcara 6 menunjukkan penakrifan fungsi tambah nod pada tindanan secara senarai berpaut. • Maklumat item yang akan ditambah ke dalam tindanan dihantar melalui parameter fungsi tambah (). • Arahan new () digunakan untuk mencipta nod baru. • Maklumat item yang dihantar melalui parameter diumpuk kepada medan data bagi nodBaru tersebut. • Bagi menambah nod baru di hadapan senarai, medan paut bagi nodBaru kemudiannya akan diumpuk dengan alamat nod yang dituding atas. • Penuding atas akan diubah kedudukannya dengan menuding kepada nod yang ditunjuk oleh penuding nodBaru ini.
MENAMBAH ITEM void Tindanan :: tambah (char item) { nodTindan *nodBaru; nodBaru = new (nodTindan); if (nodBaru == NULL) cout << "Ingatan tidak dapat disediakan"<< endl; else // tambah pada tindanan { nodBaru -> data = item; nodBaru -> paut = atas; atas = nodBaru; } } Aturcara 6 : Fungsi menambah data
MENAMBAH ITEM • Gambaran dua situasi menambah nod pada tindanan secara senarai berpaut seperti Rajah 3 dan Rajah 4. • Rajah 3 merupakan operasi tambah nod baru ke atas tindanan kosong. • Rajah 4 merupakan operasi menambah nod baru ke atas tindanan yang telah ada nod. • Dalam kedua-dua rajah tersebut Langkah 1 merupakan langkah bagi mengumpuk medan paut bagi nodBaru dengan alamat nod yang dituding oleh atas. • Langkah 2 pula mengubah kedudukan penuding atas supaya menuding kepada nod yang ditunjuk oleh penuding nodBaru.
MENAMBAH ITEM tindan.tambah(‘Y’); NULL 1 atas 2 data paut nodBaru Rajah 3: Gambaran tambah nod pada tindanan kosong
MENAMBAH ITEM tindan.tambah (‘Y’); data paut data paut 1 data paut atas 2 nodBaru Rajah 4 : Gambaran tambah nod pada tindanan tidak kosong
MEMBUANG ITEM • Operasi hapus hanya boleh dilakukan terhadap tindanan yang telah mempunyai nod di dalamnya. • Sebelum melakukan operasi menghapus nod, tindanan itu mesti diuji terlebih dahulu bagi semakKosong(). • Operasi menghapus nod pada tindanan juga dilakukan pada awal senarai. • Operasi ini adalah sama seperti operasi membuang nod pada awal senarai berpaut. • Satu penuding tambahan diperlukan bagi menunjuk kpd nod yg ingin dibuang. • Ia boleh mengelakkan tindanan ini terputus drp penuding atas, apabila nod pertama dibuang dari senarai tindanan tersebut.
MEMBUANG ITEM • Aturcara 7 merupakan penakrifan fungsi hapus() pada tindanan secara senarai berpaut. • Dalam aturcara ini, penuding tambahan iaitu nodHapus diumpukkan dengan alamat nod yang dituding oleh penuding atas. • Penuding atas kemudiannya diubah kpd nod kedua dalam tindanan. • Selepas itu, nodHapus dihapuskan dengan menggunakan arahan delete(). • Maklumat item yang berjaya dihapus dihantar melalui parameter item pada fungsi hapus(). • Jika operasi hapus tidak berjaya dilakukan, parameter item tidak berubah dan masih mempunyai nilai yang sama sebelum operasi ini dipanggil.
MEMBUANG ITEM void Tindanan :: hapus (char & item) { nodTindan *nodHapus; if (semakKosong()) cout<<"Maaf! Tindanan masih kosong."<<endl; else { //operasi penghapusan dilakukan item = atas -> data; nodHapus = atas; atas = nodHapus -> paut; delete (nodHapus); } } Aturcara 7 : Fungsi menghapus item daripada tindanan
MEMBUANG ITEM • Operasi penghapusan nod pada tindanan secara senarai berpaut seperti Rajah 5. • Terdapat 3 langkah yang terlibat dalam melaksanakan operasi menghapus nod daripada tindanan. • Langkah-langkah tersebut adalah seperti berikut : Langkah 1 : nodHapus = atas; Langkah 2 : atas = nodHapus -> paut; Langkah 3 : delete (nodHapus); - setiap langkah ditunjukkan satu persatu dalam Rajah 5.
MEMBUANG ITEM 2 atas 1 nodHapus 3 atas Rajah 5 : Gambaran menghapus nod pada tindanan
MELAKSANAKAN KESEMUA OPERASI TINDANAN SECARA SENARAI BERPAUT • Fungsi main() pada Aturcara 8 menunjukkan fungsi yang memanggil fungsi-fungsi tindanan. • Operasi tambah dan hapus di dalam tindanan secara senarai berpaut pada Aturcara 8 digambarkan pada Rajah 5. int main() { char x; Tindanan tindan; // 1. penciptaan objek bagi kelas Tindanan tindan.tambah ('S'); //2. menambah 'S' ke dalam tindanan tindan.tambah ('A'); // 3. menambah 'A' ke dalam tindanan tindan.tambah ('H'); // 4. menambah 'H' ke dalam tindanan tindan.hapus (x); // 5. menghapus item daripada tindanan tindan.hapus (x); // 6. menghapus item daripada tindanan return 0; } Aturcara 8 : Fungsi mengambil item di atas tindanan
MELAKSANAKAN KESEMUA OPERASI TINDANAN SECARA SENARAI BERPAUT NULL Rajah 5 : Operasi tindanan berdasarkan Aturcara 8