使用链表的C ++代码出错

时间:2015-12-27 20:47:13

标签: c++ data-structures

我在第1和第3例中运行代码时遇到问题,案例1和案例3没有做我想要的事情.. 如果输入“1”,则应输入新客户,如果输入“3”,程序将显示该列表。程序不会这样做,问题出在哪里?

这是Header.h“头文件”

#include<iostream>
#include<string>
using namespace std;

class customer
{
public:
    string name;
    int gsize;
    int status;
    customer* next;

    customer();
    customer(string,int,int);

};

class waitinglist
{
public:
    int tables; //number of occupied tables
    int chairnum;
    int totalcustomers;
    customer*head,*tail;
    waitinglist();
    waitinglist(int);
    void newcustomer(string,int,int);
    void diplaycustomer(string);
    void displayall();
};

这是带有主

的Source.cpp
            #include"Header.h"

customer::customer()
{
    name="";
    gsize=status=0;
    next=NULL;
}

customer::customer(string name1,int gsize1,int status1)
{
    name=name1;
    gsize=gsize1;
    status=status1;
    next=NULL;
}

waitinglist::waitinglist()
{
    chairnum=totalcustomers=tables=0;
    head=tail=NULL;
}
waitinglist::waitinglist(int val)
{
    chairnum=val;
    totalcustomers=0;
    tables=0;
    head=tail=NULL;
}

void waitinglist::newcustomer(string name1,int gsize1 ,int status1)
{
    customer*tmp= new customer;
    if (head==NULL)            // linkedlist is empty
    {
        head = tail = tmp;
        totalcustomers++;
    }
    else
    {
        tmp->next = head;
        head = tmp;
        totalcustomers++;
    }

}

void waitinglist::displayall()
{
    customer *tmp;
    tmp = head;
    while(tmp != NULL)
    {
        cout<<tmp->name <<" "<<tmp->gsize<<"-->"; 
        tmp = tmp->next;
    }
    cout << endl;
}

void waitinglist::diplaycustomer(string Name)
{
    customer*tmp ;
    tmp=head ;
    cin>>Name ;
    while(tmp!=NULL )
    {
        if (Name==tmp->name)
        {
        cout << "the name : "<< tmp->name << endl ;
        cout << "the group size = "<<tmp->gsize << endl ;
        cout << "the status : " << tmp->status <<endl;
          break ;
        }
        else if (Name!=tmp->name)
        {
        tmp=tmp->next;
        }
    }
    if (tmp==NULL)
    {
        cout<<"can't found! ";
    }

}

int main()
{
    int choice;
    string namevar=" ";
    int gsizevar=0;
    int statusvar=0;
    waitinglist mylist;
    do
    {
        cout<<"Note: 1 in status means{the customer not here and 2 means the customer is here.}\n";
        cout<<"Select your option.\n\n";
        cout<<"(1) Add a new Customer.\n";
        cout<<"(2) Display information based on Name.\n";
        cout<<"(3) List all Names.\n";
        cout<<"(4) Quit.\n\n";
        cout<<"Enter your choice: -->  ";

        cin>>choice;

        if (1 <= choice && choice <= 3)
        {   
            switch (choice)
            {
            case 1:
                mylist.newcustomer(namevar,gsizevar,statusvar);
                break;
            case 2:
                mylist.diplaycustomer(namevar);
                break;
            case 3:
                mylist.displayall();
                break;
            default:
                cout << "Invalid choice.  Enter again.\n\n";
                break;
            }
        }   
    }
    while (choice != 4);
    return 0;
}

2 个答案:

答案 0 :(得分:1)

当用户输入1作为选择时,请致电:

mylist.newcustomer(namevar,gsizevar,statusvar);

但是,您没有任何代码可以从用户那里收集namevargsizevarstatusvar。您只需使用它们初始化的值:

string namevar=" ";
int gsizevar=0;
int statusvar=0;

函数newcustomer添加了一个新客户来使用这些值。

在使用这些值之前,您需要在致电newcustomer之前或在newcustomer内部添加代码以从用户收集这些数据。

如果您决定从newcustomer内的用户收集数据,则无需将其作为变量传递。

清理建议:

您要求用户在diplaycustomer中输入名称。因此,无需通过namevar。你可以使用:

void waitinglist::diplaycustomer()
{
   customer*tmp ;
   tmp=head ;

   // Use a local variable.
   string Name;
   cin>>Name ;

   ...
}

答案 1 :(得分:0)

有几个原因导致程序无法执行您希望的操作。例如,您不使用构建新客户时提供的名称(并且该名称肯定是空的)。 您应该使用调试器并放置断点以了解代码中发生的情况。