Cài đặt Queue bằng danh sách liên kết đơn trong C++


| Cài đặt Queue bằng danh sách liên kết đơn trong C++



Khai báo struct NODE và LIST

typedef struct node
{
      int data;
      node* next;
}NODE;

typedef struct list
{
      NODE* head;
      NODE* tail;
}LIST;

Prototype

void Init(LIST&);
NODE* CreateNode(int);
bool IsEmpty(LIST);
void EnQueue(LIST&, NODE*);
int DeQueue(LIST&, int&);
void Input(LIST&);
void Output(LIST);

Khởi tạo danh sách liên kết

void Init(LIST& Q)
{
      Q.head = Q.tail = NULL;
}

Tạo node mới trong danh sách liên kết đơn

NODE* CreateNode(int x)
{
      NODE* p = new NODE;
      if (p == NULL) return NULL;
      p->data = x;
      p->next = NULL;
      return p;
}

Kiểm tra Stack có rỗng không

bool IsEmpty(LIST Q)
{
      if (Q.head == NULL) return true;
      else return false;
}
Lưu ý: cài Queue từ Danh sách liên kết đơn không cần Hàm kiểm tra Queue có đầy không (IsFull)

EnQueue: Thêm phần tử vào Queue


void EnQueue(LIST& Q, NODE* p)
{
      if (Q.head == NULL)
            Q.head = Q.tail = p;
      else
      {
            Q.tail->next = p;
            Q.tail = p;
      }
}

DeQueue: Xoá và lấy phần tử từ Queue

int DeQueue(LIST& Q, int& saved)
{
      if (!IsEmpty(Q))
      {
            NODE* p = Q.head;
            saved = p->data;
            Q.head = Q.head->next;
            return 1;
            delete p;
      }
      return 0;
}

Hàm nhập

void Input(LIST& Q)
{
      int n;
      cout << "Nhap so luong phan tu Queue: ";
      cin >> n;
      for (int i = 0; i < n; i++)
      {
            int x;
            cout << "Nhap phan tu thu " << i << ": ";
            cin >> x;
            NODE* p = CreateNode(x);
            EnQueue(Q, p);
      }
}

Hàm xuất

void Output(LIST Q)
{
      if (IsEmpty(Q))
            cout << "Queue rong.\n";
      else
      {
            cout << "Xuat Queue: ";
            for (NODE* p = Q.head; p != NULL; p = p->next)
            {
                  cout << p->data << " ";
            }
            cout << endl;
      }
}

Main.cpp

int main()
{
      LIST Q;
      Init(Q);
      Input(Q);
      Output(Q);
      cout << "\n1. Kiem tra Queue co rong khong.";
      cout << "\n2. Push phan tu vao cuoi Queue.";
      cout << "\n3. Pop phan tu dau Queue.";
      cout << "\n4. Xuat Queue.";
      cout << "\n5. Thoat.";
      cout << endl;

      while (true)
      {
            int luachon;
            do
            {
                  cout << "\nNhap lua chon: ";
                  cin >> luachon;
                  switch (luachon)
                  {
                  case 1:
                  {
                        if (IsEmpty(Q))
                              cout << "Queue rong.\n";
                        else cout << "Queue khong rong.\n";
                        break;
                  }
                  case 2:
                  {
                        int x;
                        cout << "Nhap phan tu can push: ";
                        cin >> x;
                        NODE* p = CreateNode(x);
                        EnQueue(Q, p);
                        Output(Q);
                        break;
                  }
                  case 3:
                  {
                        int saved; 
                        if (DeQueue(Q, saved))
                        {
                              cout << "Phan tu da pop: " << saved << endl;
                              Output(Q);
                        }
                        else
                        {
                              cout << "Queue rong.\n";
                        }
                        break;
                  }
                  case 4:
                  {
                        Output(Q);
                        break;
                  }
                  case 5:
                  {
                        exit(1);
                        break;
                  }
                  }

            } while (luachon < 1 || luachon > 5);
      }
      system("pause");
      return 0;
}

Nhận xét