Alan、long 2020-07-03 13:49 采纳率: 100%
浏览 247
已采纳

请大佬讲解一下这段代码的大概思路。。。课程设计想要参考一下

#include //指示编译器将文件iostream中的代码嵌入到该程序中该指令所在的地方

using namespace std;

#include //包含文件流头文件
#define BUFSIZE 50 //定义BUFSIZE 的值为50
class mGuestroom;

template

class cNode //节点
{
public:
T data;
cNode *next; //到下一个节点
};

template //创建模板
class tList
{
public: //定义成员函数
tList();
void Create(); //创建链表
bool Empty() const; //判断链表是否为空
void Insert(const T e); //从尾部插入一个元素
cNode* GetcNode(int i); //返回第i个节点
bool Find(const T e); //在链表中查找某个值
~tList(); //销毁链表,析构
cNode *head; //头节点
};

template
tList::tList() //类的成员函数的实现
{
head = new cNode; //头节点
head->next = NULL; //以null为尾节点
}

template
void tList::Create()
{
cNode *p;
p = head;
p->next = NULL;
}

template
bool tList::Empty() const
{
return (head->next == NULL);
}

template
void tList::Insert(const T e) //插入
{
cNode *p, *q;
p = head;
q = new cNode;
q->data = e;
while (p->next)
{
p = p->next;
}
p->next = q;
q->next = NULL;
}

template
cNode* tList::GetcNode(int i) //返回第i个节点
{
int k = 0;
cNode *p;
p = head;
while (p && k < i)
{
p = p->next;
++k;
}
return p;
}

template
bool tList::Find(const T e) //在链表中查找某个值
{
bool flag = false;
cNode *p;
p = head->next;
while (p)
{
if (p->data == e)
{
flag = true;
break;
}
p = p->next;
}
return flag;
}

template
tList::~tList()
{
cNode *p;
while (head)
{
p = head->next;
delete head;
head = p;
}
}

class mGuestroom
{
public:
char ID[BUFSIZE]; //客房编号
char Type[BUFSIZE]; //客房类型
char Book[BUFSIZE]; //提前定房日期
char Price[BUFSIZE]; //客房价格
char Function[BUFSIZE]; //客房主要内容
int StayTime; //入住天数有效期
bool flag;//标志
mGuestroom()//构造函数初始化
{
memset(ID, 0, BUFSIZE); memset(Type, 0, BUFSIZE); memset(Book, 0, BUFSIZE); memset(Function, 0, BUFSIZE);
memset(Price, 0, BUFSIZE); StayTime = 0; flag = false;
} //memset:把char类型转换成ASCII值
};

void ReadData(tList *tListGue)//读取数据库
{
char buf[BUFSIZE];
ifstream ifile("Guestroom.txt", ios_base::in); //创建一个输出文件流对象
if (!ifile)
{
cerr << "读取时打开文件出错!" << endl;
}
mGuestroom Guestroom;
while (ifile.getline(buf, BUFSIZE)) //遍历文本,读取数据
{
ifile.getline(buf, BUFSIZE);
strcpy(Guestroom.ID, buf);//读取客房编号
memset(buf, 0, BUFSIZE);

    ifile.getline(buf, BUFSIZE);//读取客房类型
    strcpy(Guestroom.Type, buf);
    memset(buf, 0, BUFSIZE);

    ifile.getline(buf, BUFSIZE);//读取提前定房日期
    strcpy(Guestroom.Book, buf);
    memset(buf, 0, BUFSIZE);

    ifile.getline(buf, BUFSIZE);//读取价格
    strcpy(Guestroom.Price, buf);
    memset(buf, 0, BUFSIZE);

    ifile.getline(buf, BUFSIZE);//读取客房主要内容
    strcpy(Guestroom.Function, buf);
    memset(buf, 0, BUFSIZE);

    ifile.getline(buf, BUFSIZE);//读取入住有效期
    Guestroom.StayTime = atoi(buf);
    memset(buf, 0, BUFSIZE);

    Guestroom.flag = true;
    tListGue->Insert(Guestroom);
}
cout << "读取数据成功!\n\n";
ifile.close();//关闭文件
return;

}

void AddtheGuestroom(tList *tListGue)// 输入客房函数
{
mGuestroom tempGuestroom; //定义临时客房
cout << "下面开始添加客房信息\n";
cout << "请输入入住的客房编号:";
cin >> tempGuestroom.ID; //读入客房编号
cout << "请输入客房类型:";
cin >> tempGuestroom.Type; //读入客房类型
cout << "请输入客人定房日期:";
cin >> tempGuestroom.Book; //读入定房日期
cout << "请输入客房价格:";
cin >> tempGuestroom.Price; //读入价格
cout << "请输入客房的主要内容:";
cin >> tempGuestroom.Function; //读入主要内容
cout << "请输入客房入住有效期:";
cin >> tempGuestroom.StayTime; //读入入住有效期
tempGuestroom.flag = true;
tListGue->Insert(tempGuestroom);
cout << "添加成功!\n";
system("pause"); //pause:停顿,终止
system("cls");
}

void SaveData(tList *tListGue) //保存数据
{
int i = 0;
ofstream ofile("Guestroom.txt", ios_base::out); //创建一个输入文件流对象
if (!ofile)
{
cerr << "保存时打开文件出错!" << endl;
}
cNode *p;
p = tListGue->head->next;
while (p)
{
//从内存中读取数据,存到外盘
if (p->data.flag)
{
ofile << "\n";
ofile << (p->data).ID << "\n";
ofile << (p->data).Type << "\n";
ofile << (p->data).Book << "\n";
ofile << (p->data).Price << "\n";
ofile << (p->data).Function << "\n";
ofile << (p->data).StayTime << "\n";
}
p = p->next;
}
cout << "保存数据成功!\n";
ofile.close();
system("pause");
system("cls");
return;
}

void ModifytheGuestroom(tList *tListGue) //修改客房信息
{
char id[BUFSIZE];
cout << "\n请输入你要查找的客房编号:";
cin >> id; //读取客房编号
bool flag = false;
cNode *p;
p = tListGue->head->next;
while (p)
{
if (strcmp(p->data.ID, id) == 0 && p->data.flag)
{
flag = true;
break;
}
p = p->next;
}
if (flag == true)
{//显示屏幕
cout << "找到了,该客房的原始信息是:\n";
cout << "\n\n客房编号:" << (p->data).ID << "\t客房类型:" << (p->data).Type << "\n\t\t定房日期:" << (p->data).Book << "\n\t\t价格:" << (p->data).Price;
cout << "\n\t\t客房的主要内容:" << (p->data).Function << "\n\t\t入住有效期:" << (p->data).StayTime;

    cout << "\n下面开始修改该客房的信息:\n";
    mGuestroom tempGuestroom;            //定义临时客房
    cout << "请输入客房的客房编号:";
    cin >> tempGuestroom.ID;               //读入客房编号
    cout << "请输入客房的客房类型:";
    cin >> tempGuestroom.Type;             //读入客房类型
    cout << "请输入客人的定房日期:";
    cin >> tempGuestroom.Book;             //读入定房日期
    cout << "请输入客房的客房价格:";
    cin >> tempGuestroom.Price;            //读入价格
    cout << "请输入客房的客房主要内容:";
    cin >> tempGuestroom.Function;         //读入客房的主要内容
    cout << "请输入客人入住客房有效期:";
    cin >> tempGuestroom.StayTime;         //读入入住有效期
    tempGuestroom.flag = true;
    p->data = tempGuestroom;
    cout << "修改成功!";
}
cout << endl;
system("pause");
system("cls");
return;

}

void DeletetheGuestroom(tList *tListGue) //删除客房信息
{
char id[BUFSIZE];
cout << "\n请输入你要查找的客房编号:";
cin >> id; //读取客房编号
bool flag = false;
int count = 0;
cNode *p;
p = tListGue->head->next;
while (p)
{
if (strcmp(p->data.ID, id) == 0 && p->data.flag)
{
count++;
flag = true;
break;
}
p = p->next;
}
if (flag == false) cout << "对不起,你所查找的客房延长了住房日期!\n";
else

{
count--;
cout << "找到了,该客房的原始信息是:\n";
cout << "\n\n客房编号:" << (p->data).ID << "\t客房类型:" << (p->data).Type << "\n\t\t定房日期:" << (p->data).Book << "\n\t\t价格:" << (p->data).Price;
cout << "\n\t\t客房的主要内容:" << (p->data).Function << "\n\t\t入住有效期:" << (p->data).StayTime;
cout << endl;
(p->data).flag = false;
cout << "该客房的信息删除成功!\n";
}
cout << endl;
system("pause");
system("cls");
return;
}

void FindtheremainGuestroomById(tList *tListGue)//根据客房编号查找
{
char id[BUFSIZE];
cout << "\n请输入你要查找的客房编号:";
cin >> id; //读取客房编号
bool flag = false;
cNode *p;
p = tListGue->head->next;
while (p)
{
if (strcmp(p->data.ID, id) == 0 && p->data.flag)
{
flag = true;
break;
}
p = p->next;
}

if (flag == false)     cout << "对不起,没有该标号的客房!\n";   //如果找不到
else                                                                 //如果找到了
{
    cout << "\n找到了,该客房的信息是:\n";
    cout << "\n\n客房编号:" << (p->data).ID << "\t客房类型:" << (p->data).Type << "\n\t\t定房日期:" << (p->data).Book << "\n\t\t价格:" << (p->data).Price;
    cout << "\n\t\t主要内容:" << (p->data).Function << "\n\t\t入住有效期:" << (p->data).StayTime;
}
cout << endl;
system("pause");
system("cls");                       //清屏
return;

}

void FindtheremainGuestroomByType(tList *tListGue)//根据客房类型查找客房
{
char type[BUFSIZE];
cout << "\n请输入你要查找的客房类型:";
cin >> type; //读取客房类型
bool flag = false;
cNode *p;
p = tListGue->head->next;
while (p)
{
if (strcmp(p->data.Type, type) == 0 && p->data.flag)
{
flag = true;
break;
}
p = p->next;
}

if (flag == false)     cout << "对不起,没有该类型的客房!\n";     //如果满了
else                                                      //如果找到了
{
    cout << "\n找到了,该客房信息是:\n";
    cout << "\n\n客房编号:" << (p->data).ID << "\t客房类型:" << (p->data).Type << "\n\t\t定房日期:" << (p->data).Book << "\n\t\t价格:" << (p->data).Price;
    cout << "\n\t\t客房的主要内容:" << (p->data).Function << "\n\t\t入住有效期:" << (p->data).StayTime;
}
cout << endl;
system("pause");
system("cls");
return;

}

void FindtheremainGuestroomByPrice(tList *tListGue)//根据价格查找客房
{
char price[BUFSIZE];
cout << "\n请输入你要查找的剩余客房的价格:";
cin >> price; //读取价格
bool flag = false;
cNode *p;
p = tListGue->head->next;
while (p)
{
if (strcmp(p->data.Price, price) == 0 && p->data.flag)
{
flag = true;
cout << "\n\n客房编号:" << (p->data).ID << "\t客房类型:" << (p->data).Type << "\n\t\t定房日期:" << (p->data).Book << "\n\t\t价格:" << (p->data).Price;
cout << "\n\t\t客房的主要内容:" << (p->data).Function << "\n\t\t入住有效期:" << (p->data).StayTime;
}
p = p->next;
}
if (flag == false) cout << "对不起,没有你所要求价格的客房!\n"; //如果找不到
cout << endl;
system("pause");
system("cls");
return;
}

void FindtheremainGuestroom(tList *tListGue)//查找客房
{
system("cls");
while (1)
{
cout << "\n\n\n\n";
cout << " 1:按客房编号查询\n\n";
cout << " 2:按客房类型查询\n\n";
cout << " 3:按价格查询\n\n";
cout << " 4:退出查询\n\n";
cout << "你选择:";
int choose = 0;
cin >> choose;
switch (choose) //根据用户选择
{
case 1:FindtheremainGuestroomById(tListGue); //按客房编号查询
break;
case 2:FindtheremainGuestroomByType(tListGue); //按客房类型查询
break;
case 3:FindtheremainGuestroomByPrice(tListGue); //按价格查询
break;
case 4:
system("cls");
return; //退出查询
default:break;
}
}

return;

}

void RanktheremainGuestroom(tList *tListGue) //排序剩余客房
{
cNode *p, *q;
mGuestroom remainGuestroom;
for (p = tListGue->head->next; p != NULL; p = p->next)
{
for (q = p; q != NULL; q = q->next)
{
if (p->data.StayTime > q->data.StayTime)
{
remainGuestroom.flag = p->data.flag;
strcpy(remainGuestroom.ID, p->data.ID); //复制
strcpy(remainGuestroom.Type, p->data.Type);
strcpy(remainGuestroom.Book, p->data.Book);
strcpy(remainGuestroom.Price, p->data.Price);
strcpy(remainGuestroom.Function, p->data.Function);
remainGuestroom.StayTime = p->data.StayTime;

            p->data.flag = q->data.flag;
            strcpy(p->data.Function, q->data.Function);
            strcpy(p->data.ID, q->data.ID);
            strcpy(p->data.Type, q->data.Type);
            strcpy(p->data.Book, q->data.Book);
            p->data.StayTime = q->data.StayTime;

            q->data.flag = remainGuestroom.flag;
            strcpy(q->data.Function, remainGuestroom.Function);
            strcpy(q->data.ID, remainGuestroom.ID);
            strcpy(q->data.Type, remainGuestroom.Type);
            strcpy(q->data.Book, remainGuestroom.Book);
            q->data.StayTime = remainGuestroom.StayTime;
        }
    }
}

}

void OutputtheremainGuestroom(tList *tListGue) //输出剩余房间函数
{
cNode *p;
p = tListGue->head->next;
while (p)
{
if (p->data.flag)
{
cout << "\n\n客房编号:" << (p->data).ID << "\t客房类型:" << (p->data).Type << "\n\t\t提前定房日期:" << (p->data).Book << "\n\t\t价格:" << (p->data).Price;
cout << "\n\t\t主要内容:" << (p->data).Function << "\n\t\t入住有效期:" << (p->data).StayTime;
}
p = p->next;
}
cout << endl;
system("pause"); //停止
system("cls"); //清屏
return;
}

int main()
{
tList tListGue;
tListGue.Create(); //创建链表
ReadData(&tListGue);
while (1)
{
cout << "\n\n 客房管理系统 \n\n";
cout << " ---------------------------------- \n\n";
cout << " 1.客房信息的录入 \n\n";
cout << " 2:客房信息保存\n\n";
cout << " 3.客房信息的修改 \n\n";
cout << " 4.客房信息的删除 \n\n";
cout << " 5.剩余客房信息的查询 \n\n";
cout << " 6.剩余客房信息的排序 \n\n";
cout << " 7.剩余客房信息的输出 \n\n";
cout << " 8.退 出 系 统 \n\n";
cout << " 请选择:";
int choose = 0;
cin >> choose;
switch (choose) //用户的选择
{
case 1:AddtheGuestroom(&tListGue); break; //输入客房信息

case 2:SaveData(&tListGue); break; //客房信息信息保存
case 3:ModifytheGuestroom(&tListGue); break; //修改客房信息
case 4:DeletetheGuestroom(&tListGue); break; //删除客房信息
case 5:FindtheremainGuestroom(&tListGue); break; //查询剩余客房信息
case 6:RanktheremainGuestroom(&tListGue); break; //排序剩余客房信息
case 7:OutputtheremainGuestroom(&tListGue); break; //输出剩余客房信息
case 8:exit(0); //退出
default: break;
}
}
return 0;
}

  • 写回答

2条回答 默认 最新

  • 九头蛇daze 2020-07-03 15:06
    关注

    一下为一个节点模板类表示链表节点:
    template
    class cNode //节点
    {
    public:
    T data;
    cNode *next; //到下一个节点
    };

    以下为链表类,包含链表头结点和一组维护链表的函数接口:
    template //创建模板
    class tList
    {
    public: //定义成员函数
    tList();
    void Create(); //创建链表
    bool Empty() const; //判断链表是否为空
    void Insert(const T e); //从尾部插入一个元素
    cNode* GetcNode(int i); //返回第i个节点
    bool Find(const T e); //在链表中查找某个值
    ~tList(); //销毁链表,析构
    cNode *head; //头节点
    };

    之后是客房类:
    class mGuestroom
    {
    public:
    char ID[BUFSIZE]; //客房编号
    char Type[BUFSIZE]; //客房类型
    char Book[BUFSIZE]; //提前定房日期
    char Price[BUFSIZE]; //客房价格
    char Function[BUFSIZE]; //客房主要内容
    int StayTime; //入住天数有效期
    bool flag;//标志
    mGuestroom()//构造函数初始化
    {
    memset(ID, 0, BUFSIZE); memset(Type, 0, BUFSIZE); memset(Book, 0, BUFSIZE); memset(Function, 0, BUFSIZE);
    memset(Price, 0, BUFSIZE); StayTime = 0; flag = false;
    } //memset:把char类型转换成ASCII值
    };

    main函数中使用链表tListGue保存了一组客房,进行增删查改等操作,细节可以留言或者私信。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥30 vb net 使用 sendMessage 如何输入鼠标坐标
  • ¥200 求能开发抖音自动回复卡片的软件
  • ¥15 关于freesurfer使用freeview可视化的问题
  • ¥100 谁能在荣耀自带系统MagicOS版本下,隐藏手机桌面图标?
  • ¥15 求SC-LIWC词典!
  • ¥20 有关esp8266连接阿里云
  • ¥15 C# 调用Bartender打印机打印
  • ¥15 我这个代码哪里有问题 acm 平台上显示错误 90%,我自己运行好像没什么问题
  • ¥50 C#编程中使用printDocument类实现文字排版打印问题
  • ¥15 找会编程的帅哥美女 可以用MATLAB里面的simulink编程,用Keil5编也可以。