簡體   English   中英

C ++中的鏈表多個節點

[英]Linked List multiple nodes in C++

編碼時遇到多個問題,我想建立一個帶有鏈接列表的房間預訂系統,

我希望用戶可以在菜單中看到房間號,並且在獲取房間號時,將從菜單中刪除房間號。

無論如何,有沒有簡化代碼,我的代碼很亂,請幫忙謝謝

1.首先我用

struct nodes{
     int single_room[5] = {101,102,103,104,105};
     int double_room[4] = {201,202,203,204,205};
  };

但是,當我想將鏈接列表與用戶輸入進行比較時,就會出現錯誤

  void reservation::UpdateReservation(){
        int x;
        node *current;
        current = head;
        bool found;
        found = false;
        cout << "Please enter your room number to update your reservation: 
 ";
        cin >> x;

        while ((current != NULL) && (!found))
     {
        if (current -> single_room == x)
            found = true;

            else
                current = current -> link;
      }
    while(found)
   {
        cout <<"The number is exist";
        cout << endl;
        return found;
       cout << value;
    }

     cout << "The number is not found";
     cout << endl;  
    }
}

ISO C ++出現錯誤,禁止在指針和整數之間進行比較。 在我放置一個for循環之后,對於single_room [i],但是當前的-> single_room [i]為空。

我已經堆滿了很多問題,發現無法初始化鏈表,所以我在注釋中一一使用了初始化值

#include <iostream>
#include <fstream>
#include <windows.h>
#include <string>
using namespace std;

class reservation{

private:
    struct node
    {
        int single_room;
        int double_room;
        int deluxe_suite;
        int president_suite;
        int room_number;
        string name;
        int phone_number;
        int date;
        int number_of_nights;
        int number_of_pax;
        int time;
        node *link;
    }*head;

    public:
        reservation();
        void InitializeValue_single_room(int a);
        void InitializeValue_double_room(int b);
        void InitializeValue_deluxe_suite(int c);
        void InitializeValue_president_suite(int d);
        void menu();
        void Room_size();
        void InsertReservation();
        void UpdateReservation();
//      void DeleteReservation();
        void DisplayReservation();
        ~reservation();
 };

 reservation::reservation()
 {
     head = NULL;
 }

 reservation::~reservation()
 {
     node *q;
     if (head == NULL)
     {
        return;
     }
     while (head != NULL)
     {
         q = head->link;
         delete head;
    head = q;
    }
 }

 void reservation::InitializeValue_single_room(int a)
 {
node *newNode;

newNode = new node;
newNode -> single_room = a;
newNode -> link = head;
head = newNode;
 }

 void reservation::InitializeValue_double_room(int b)
 {
     node *newNode;

     newNode = new node;
     newNode -> double_room = b;
     newNode -> link = head;
     head = newNode;
 }

 void reservation::InitializeValue_deluxe_suite(int c)
 {
node *newNode;

newNode = new node;
newNode -> deluxe_suite= c;
newNode -> link = head;
head = newNode;
 }

 void reservation::InitializeValue_president_suite(int d)
 {
node *newNode;

newNode = new node;
newNode -> president_suite = d;
newNode -> link = head;
head = newNode;
 }

 void reservation::menu()
  {
  cout <<"  1. Book a reservation" << endl;
  cout <<"  2. Update a reservation" << endl;
  cout <<"  3. Delete a resevation" << endl;
  cout <<"  4. Display the reservation" << endl;
  cout <<"  5. Help" << endl;
  cout <<"  6. Exit" << endl << endl;

    cout << "Please enter here: ";
 }

但是我想打印出Room_size()中的值,這會打印出此抱歉,沒有足夠的信譽來上傳圖像,我僅在這里描述,它就會出來| 01704272 || 1704272 || 1704272 || 1704272 || 1704272 || 1704272 || 1704272 || 1704272 || 1728736 || 101 || 102 || 103 || 104 || 105 | 它會打印出我不需要的數字,我只想查看101,102,103,104,105

  void reservation::Room_size()
{
 node guest;
 node *current, *current1;
 current = head;
 current1 = head;
 cout << "  Single Room: " << endl;
 cout << "  ";
 while (current != NULL)
 {
        cout << current -> single_room;
       current = current -> link;

      if(current != NULL)
        cout << "|" << "|";
}
cout << "|" << endl;

cout << "   Double Room: " << endl;
cout << "   ";
while (current1 != NULL)
{
    cout << current1 -> double_room;
    current1 = current1 -> link;

    if(current1 != NULL)
        cout << "|" << "|";
}
cout << "|" << endl;
 }

  void reservation::InsertReservation()
 {
   node guest;
   node *current;
   current = head;
   bool found;
   found = false;
   char b;
   int c;
   bool d = true;
   bool f = false;

  do{
        ofstream file;
        file.open("Guest info.txt", ios::out|ios::app);

        if(!file)
       {
          cout << "ERROR: File can't open";
          system("pause");
      }
        cout<<"Please enter your Name: ";
        getline(cin,guest.name);
        cout << endl;

        while(!f){
        cout << "Please enter your phone number: +";
        cin >> guest.phone_number;
        if(guest.phone_number < 10)//|| (cin >> guest.phone_number) < 11)
        {
            cout << "Wrong input! ";
            f = false;
        }
         else{

           f = true;
           cin.ignore();
        }
        cout << endl;       
 }
    cout << "Please enter the date you want to book: (20/04): ";
    cin >> guest.date;
    cout << endl;

    cout << "Please enter the number of nights you want to stay: ";
    cin >> guest.number_of_nights ;
    cout << endl;

    cout << "Please enter the time you want to check in (24:00 format): ";
    cin >> guest.time;
    cout << endl;

    cout << "Please enter the number of people you have: ";
    cin >> guest.number_of_pax;



while(d){
    cout << "1.Single Room\n2.Double Room \n3.Luxury Suite \n4.President Suite\n\n";
    cout << "Please select the room you want: ";
    cin >> c;
    if(c==1)
    {
        cout << "   Rooms that are available: " << endl;
        cout << "   Single rooms: " << endl;

                cout << "   |" << guest.single_room << "|";

        cout << endl << endl;
        cout << "Please enter the room number you want to book: ";
        cin >> guest.room_number;
        d = false;
    }else if(c==2)
    {
            cout << "   Rooms that are available: " << endl;
            cout << "   Double rooms: " << endl;

                cout << "   |" << guest.double_room << "|";

        cout << endl << endl;
        cout << "Please enter the room number you want to book: ";
        cin >> guest.room_number;
        d = false;
    }else if(c==3)
    {
        cout << "   Rooms that are available: " << endl;
        cout << "   Luxury Suite: " << endl;
                cout << "   |" << guest.deluxe_suite << "|";

        cout << endl << endl;
        cout << "Please enter the room number you want to book: ";
        cin >> guest.room_number;
        d = false;
    }else if (c==4)
    {
            cout << "   Rooms that are available: " << endl;
            cout << "   President Suite" << endl;
                cout << "   |" << guest.president_suite << "|";

        cout << endl << endl;
        cout << "Please enter the room number you want to book: ";
        cin >> guest.room_number;
        d = false;

    }else
    {
        cout << "Wrong input. Please try again";
        d = true;
    }
}

int e;
cout << "Press 1 to Save or 2 to cancel:";
    cout << endl;
    cin >> e;

    if(e==1)
    {
        cout << endl;
        file << "Guests info" << endl;
        cout << endl;
        file << "=================================================="<< endl;

            file << endl;
            file << "Room Number: " << guest.room_number;
            file << endl;
            file << "Name: " << guest.name << endl;
            file << endl;
            file << "Phone Number: " << guest.phone_number << endl;
            file << endl;
            file << "Date: " << guest.date << endl;
            file << endl;
            file << "Number of nights: " << guest.number_of_nights << endl;
            file << endl;
            file << "Time: " << guest.time << endl;
            file << endl;
            file << "Number of pax: " << guest.number_of_pax << endl;
            file << endl;
        file << endl;
        file << "====================================================" << endl;
        file.close();
        cout << "Record Saved " << endl;
        cout << "======================================================" << endl;
    }else
    {
        cout << "Record was not saved " << endl;
        cout << "====================================================" << endl;
        cout << endl;
    }

  /*        while ((current != NULL) && (!found))
        {
            if (current -> single_room == (guest.room_number))
                found = true;
            else
                current = current -> link;
            while(found)
            {
                cout << "ROOM NUMBER FOUND";
                cout << endl;
            }   

            cout << "NO";
            cout << endl;
        }*/


        cout << "Enter (Y/y) to input another data or enter (N/n) to Exit";
            cin >> b;
        cout << "======================================================" << 
    endl; 
          cout << endl;
      }while(b == 'y' || b == 'Y');
       if(b =='y'|| b=='Y')
      {
            cin.ignore();
       }
 }
  void reservation::DisplayReservation()
{
  node *current;
   current = head;
   cout << " |";
 while (current != NULL)//) && current-> deluxe_suite <400))
  {

    cout << current -> deluxe_suite;
    current = current -> link;

    if(current != NULL)
        cout << "| "<< "|";
  }
   cout << "|" << endl;
}

 int main()
 {
   reservation r;
   r.InitializeValue_single_room(105);
   r.InitializeValue_single_room(104);
   r.InitializeValue_single_room(103);
   r.InitializeValue_single_room(102);
   r.InitializeValue_single_room(101);

  r.InitializeValue_double_room(204);
  r.InitializeValue_double_room(203);
  r.InitializeValue_double_room(202);
  r.InitializeValue_double_room(201);

r.InitializeValue_deluxe_suite(303);
r.InitializeValue_deluxe_suite(302);
r.InitializeValue_deluxe_suite(301);

r.InitializeValue_president_suite(888);
r.InitializeValue_president_suite(666);

cout <<"================================================" << endl << endl;
cout <<" Welcome to the Hotel Reservation Application" << endl << endl;
cout <<"================================================" << endl;

int a;
cout << "Please wait while the system is analyzing hte data\n";

cout << endl;
cout<<"===================================" << endl;
cout <<"            Main Menu   " << endl << endl;
cout << "   Rooms that are available: " << endl;

r.Room_size();
cout << endl << endl;
cout << "===================================" << endl;
r.menu();
cin >> a;
if(a == 1)
{
    system("CLS");
    cout << "===================================" << endl;
    cout << "   BOOK A RESERVATION" << endl;
    cout << "===================================" << endl;
    cin.ignore();
    r.InsertReservation();
}else if(a == 2)
 {
        system("CLS");
        cout << "===================================" << endl;
        cout << "   UPDATE YOUR RESERVATION" << endl;
        cout << "===================================" << endl;
        cin.ignore();
  //        r.UpdateReservation();
        }else if(a == 4)
       {
        system("CLS");
        cout <<"===================================" << endl;
        cout << "   VIEW ALL RESERVATION" << endl;
        cout << "===================================" << endl;
        cin.ignore();
        r.DisplayReservation();
  }

    return 0;

}

我只是運行您的代碼。 發生的情況是,您在同一個班級的單人間,雙人間,豪華間和總統套房均具有相同的列表。 這不是最好的方法,但它是一種方法。

這是我得到的結果

Rooms that are available:
  Single Room:
  0||0||0||0||0||0||0||0||0||101||102||103||104||105|
   Double Room:
   0||0||0||0||0||201||202||203||204||0||0||-805306368||-805306368||-805306368|

您將清單初始化為

r.InitializeValue_single_room(105);
r.InitializeValue_single_room(104);
r.InitializeValue_single_room(103);
r.InitializeValue_single_room(102);
r.InitializeValue_single_room(101); 
r.InitializeValue_double_room(204);
r.InitializeValue_double_room(203);
r.InitializeValue_double_room(202);
r.InitializeValue_double_room(201);
r.InitializeValue_deluxe_suite(303);
r.InitializeValue_deluxe_suite(302);
r.InitializeValue_deluxe_suite(301);
r.InitializeValue_president_suite(888);
r.InitializeValue_president_suite(666);

由於列表是后進先出類型,因此當您在Room_size()函數中的列表中進行迭代時,您的函數將在列表中看到以下內容:前2個房間為總統套房,其中僅總統套房屬性被設置。接下來的3個房間為豪華房,其中僅設置了deluxe_suite屬性,接下來的4個房間是雙人間,其中僅設置了double_room屬性,而最后5個房間,僅設置了單人房間屬性

因此,當打印單個房間時,前9個節點沒有設置單個房間屬性,因此它將打印一些垃圾值5次,然后打印正確的單個房間號,並且

同樣,對於雙人間,它會打印5個垃圾值,然后打印正確的數字,然后再打印5個垃圾值。

若要更正此問題,您需要進行以下更改。

1)在類定義中,將單個變量用於房間號,並將另一個變量用於房間類型。 2)使用枚舉設置房間類型常量

enum room_types={single,double,delux,president_suite}

3)當通過InitializeValue _ **初始化房間時,該函數應將參數中的房間號設置為節點中的房間號,但應根據枚舉設置房間類型屬性。 例如在InitializeValue_single_room函數中

void reservation::InitializeValue_single_room(int a)
 {
node *newNode;
newNode = new node;
newNode -> room_number = a;
newNode -> room_type = single;
newNode -> link = head;
head = newNode;
 }

4)調用room_size()函數時,在打印房間類型時檢查房間類型。 范例:

cout << "  Single Room: " << endl;
cout << "  ";
while (current != NULL)
{
    if(current -> room_type !=single){
        current = current -> link;
        continue;
    }
    cout << current -> room_number;
   current = current -> link;

  if(current != NULL)
    cout << "|" << "|";
}

我希望這有幫助。

有很多更好的方法可以實現此目的,但是我相信這是目前為止您最好的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM