链接列出C ++中的多个节点

时间:2018-05-13 06:33:29

标签: c++ linked-list nodes

编码时遇到多个问题,我想建立一个带链表的房间预订系统,

我希望用户可以在菜单中看到房间号码,当房间号码拍摄时,房间号码将从菜单中删除。

无论如何简化代码,我的代码非常混乱,请帮助谢谢

  

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],但当前 - &gt; 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;

}

1 个答案:

答案 0 :(得分: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个房间是总统套房,其中只设置了president_suite属性 接下来的3个房间是delux,其中只设置了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 << "|" << "|";
}

我希望这会有所帮助。

有更好的方法来实现这一点,但我相信这对你来说是最好的方式。