Untitled

 avatar
unknown
c_cpp
a year ago
7.9 kB
5
Indexable
#include <iostream>
using namespace std;

class Node
{
public:
    string nama;
    long double Nim;
    Node *prev;
    Node *next;
};

class DoublyLinkedList
{
public:
    Node *head;
    Node *tail;

    DoublyLinkedList()
    {
        head = nullptr;
        tail = nullptr;
    }

    int countList()
    {
        Node *hitung;
        hitung = head;
        int jumlah = 0;
        while (hitung != NULL)
        {
            jumlah++;
            hitung = hitung->next;
        }
        return jumlah;
    }

    void push(string nama, long double Nim)
    {
        Node *newNode = new Node;
        newNode->nama = nama;
        newNode->Nim = Nim;
        newNode->prev = nullptr;
        newNode->next = head;
        if (head != nullptr)
        {
            head->prev = newNode;
        }
        else
        {
            tail = newNode;
        }
        head = newNode;
    }

    bool isEmpty() {
    return (head == NULL);
    }


    void insertAt(string nama, long double Nim, int posisi)
    {
        if (posisi < 1 || posisi > countList())
        {
            cout << "Posisi diluar jangkauan" << endl;
            return;
        }

        if (posisi == 1)
        {
            cout << "Posisi bukan posisi tengah" << endl;
            return;
        }

        Node *baru, *bantu;
        baru = new Node();
        baru->nama = nama;
        baru->Nim = Nim;

        if (posisi > countList())
            posisi = countList();

        int nomor = 1;
        bantu = head;
        while (nomor < posisi - 1)
        {
            bantu = bantu->next;
            nomor++;
        }

        baru->next = bantu->next;
        bantu->next = baru;
    }

    void insertBelakang(string nama, long double Nim) {
        Node *baru = new Node;
        baru->nama = nama;
        baru->Nim = Nim;
        baru->next = NULL;
        if (isEmpty()) {
            head = tail = baru;
        } else {
            tail->next = baru;
            tail = baru;
        }
}


    void removeAt(int position)
    {
        if (position <= 0)
        {
            cout << "Invalid position" << endl;
            return;
        }

        if (head == nullptr)
        {
            cout << "List is empty" << endl;
            return;
        }

        if (position == 1)
        {
            pop();
            return;
        }

        Node *current = head;
        int i = 1;
        while (current != nullptr && i < position)
        {
            current = current->next;
            i++;
        }

        if (current == nullptr)
        {
            cout << "Position out of range" << endl;
            return;
        }

        if (current->prev != nullptr)
        {
            current->prev->next = current->next;
        }
        else
        {
            head = current->next;
        }

        if (current->next != nullptr)
        {
            current->next->prev = current->prev;
        }
        else
        {
            tail = current->prev;
        }

        delete current;
    }

    void pop()
    {
        if (head == nullptr)
        {
            return;
        }
        Node *temp = head;
        head = head->next;
        if (head != nullptr)
        {
            head->prev = nullptr;
        }
        else
        {
            tail = nullptr;
        }
        delete temp;
    }

    bool ubahBelakang(string oldnama, string newnama, long double newNim)
    {
        Node *current = head;
        while (current != nullptr)
        {
            if (current->nama == oldnama)
            {
                current->nama = newnama;
                current->Nim = newNim;
                return true;
            }
            current = current->next;
        }
        return false;
    }

    void ubahDepan(string nama, long double Nim) {
        if (!isEmpty()) {
            head->nama = nama;
            head->Nim = Nim;
        } else {
            cout << "List masih kosong!" << endl;
        }
    }

    void deleteAll()
    {
        Node *current = head;
        while (current != nullptr)
        {
            Node *temp = current;
            current = current->next;
            delete temp;
        }
        head = nullptr;
        tail = nullptr;
    }

    void display()
    {
        Node *current = head;
        while (current != nullptr)
        {
            cout << current->nama << "\t";
            cout << current->Nim << endl;
            current = current->next;
        }
        cout << endl;
    }
};

int main()
{
    DoublyLinkedList list;

     int arr_size = 5;

    string namas[10] = {"Jawad", "Amir", "Farel", "Denis", "Anis", "Bowo", "Gahar", "Udin", "Ucok", "Budi"};
    long double Nims[10] = {23300001, 2311102233, 23300003, 23300005, 23300008, 23300015, 23300040, 23300048, 23300050, 23300099};

    for (int i = 0; i < arr_size; i++)
        list.push(namas[i],Nims[i]);

    while (true)
    {
        cout << "PROGRAM SINGLE LINKED LIST NON-CIRCULAR" << endl;
        cout << "1. Tambah Depan" << endl;
        cout << "2. Tambah Belakang" << endl;
        cout << "3. Tambah Tengah" << endl;
        cout << "4. Ubah Depan" << endl;
        cout << "5. Ubah Belakang" << endl;
        cout << "6. Ubah Tengah" << endl;
        cout << "7. Hapus Depan" << endl;
        cout << "8. Hapus Belakang" << endl;
        cout << "9. Hapus Tengah" << endl;
        cout << "10. Hapus List" << endl;
        cout << "11. TAMPILKAN" << endl;
        cout << "12. KELUAR" << endl;
        int choice;
        cout << "Masukkan Pilihan : ";
        cin >> choice;

        switch (choice)
        {
        case 1:
        {
            string nama;
            long double Nim;

            cout << "Masukkan NAMA : ";
            cin >> nama;
            cout << "Masukkan NIM  : ";
            cin >> Nim;
            list.push(nama, Nim);
            break;
        }
        case 2:
        {
            string nama;
            long double Nim;

        cout << "Masukan NAMA :";
        cin >> nama;
        cout << "Masukan NIM : ";
        cin >> Nim;

        list.insertBelakang(nama, Nim);
        break;
        }

        case 3:
        {
            string nama;
            long double Nim;
            int position;

            cout << "Data ingin dimasukkan pada urutan ke        : ";
            cin >> position;
            cout << "Masukkan nama produk       : ";
            cin >> nama;
            cout << "Masukkan harga produk       : ";
            cin >> Nim;

            list.insertAt(nama, Nim, position);
            break;
        }
        case 4:
        {
            string nama;
            long double Nim;

             cout << "Masukan NAMA :";
            cin >> nama;
            cout << "Masukan NIM : ";
            cin >> Nim;

            list.ubahDepan(nama, Nim);
            break;
        }
        case 5:
        {
            string oldnama, newnama;
            long double newNim;

            cout << "Masukkan produk lama       : ";
            cin >> oldnama;
            cout << "Masukkan produk baru       : ";
            cin >> newnama;
            cout << "Masukkan harga produk baru : ";
            cin >> newNim;

            bool ubahBelakangd = list.ubahBelakang(oldnama, newnama, newNim);
            if (!ubahBelakangd)
            {
                cout << "Data tidak ditemukan" << endl;
            }
            break;
        }
         case 11:
        {
            list.display();
            break;
        }
        }
    }
    return 0;
}
Editor is loading...
Leave a Comment