存包櫃的模擬實現,包括存包和取包功能(必做),系統管理功能(選做)
利用單鏈表模擬超市存包櫃的實現。
假設存包櫃有N個存包位,主要功能包括:
(1)存包:用戶存包時產生一個4位數字隨機密碼,該密碼與當前已使用的其他存包位的密碼不同,當存包櫃無空閒存包位時,提示用戶存包櫃已滿;
(2)取包:用戶取包時根據用戶輸入的密碼打開相應的存包位,若輸入密碼錯誤提示用戶輸入錯誤;
(3)系統管理:管理員查看存包櫃的使用情況,可以清空所有存包櫃。
套用了書上的模板所以略顯臃腫
。。。
好吧是非常臃腫
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
const int MaxSize = 100;
class BagBox {
static int length;//目前存包數量
private:
int pw, id;//密碼,編號
BagBox *next;
public:
BagBox() {
pw = id = 0;
next = NULL;
}
BagBox(int x, int paw, BagBox *ne) {
id = x;
pw = paw;
next = ne;
}
void Print();//查看所有存包櫃狀態
//判斷存包櫃是否已滿,返回真爲已滿
bool Full() {
return length == MaxSize;
}
BagBox* Last();//找到列表最後一個
BagBox* SearchPW(int paw);//根據密碼找元素,返回該元素的前一個元素的地址
BagBox* SearchID(int x);//根據id找元素,返回該元素的前一個元素的地址
bool Add();//存包,返回真表示存包成功
void Insert(int x, BagBox *s);//在編號爲x的元素後插入s元素
bool Get(int x, int paw);//取包,傳遞密碼和編號,返回假爲取包失敗
bool Empty();//判空,返回真則存包櫃爲空
void Del(BagBox *p);//清空存包櫃
};
int BagBox::length = 0;
BagBox::BagBox *first = new BagBox(0, 0, NULL);
bool vis[MaxSize] = {false};
void BagBox::Print() {
cout << "Total: " << length << endl;
BagBox *p = first->next;
while(p != NULL) {
cout << "ID: " << p->id << " Password: " << pw << endl;
p = p->next;
}
return ;
}
BagBox* BagBox::Last() {
BagBox *p = first;
while(p->next != NULL)
p = p->next;
return p;
}
BagBox* BagBox::SearchPW(int paw) {
BagBox *p = first;
while(p->next != NULL) {
if(paw == p->next->pw)
return p;
p = p->next;
}
return NULL;
}
BagBox* BagBox::SearchID(int x) {
BagBox *p = first;
while(p->next != NULL) {
if(x == p->next->id)
return p;
p = p->next;
}
return NULL;
}
bool BagBox::Add() {
if(Full()) {
cout << "There's no place!" << endl;
return false;
}
int paw;
do {
paw = rand()%1000 + 1000;
}while(SearchPW(paw) != NULL);
int i=0;
while(i<MaxSize && vis[i]) ++i;
BagBox *p = Last();
BagBox *s = new BagBox(i+1, paw, NULL);
p->next = s;
vis[i] = true;
++length;
cout << "Success! ID:" << i+1 << " Password:" << paw << endl;
return true;
}
void BagBox::Insert(int x, BagBox *s) {
BagBox *p = SearchID(x)->next;
s->next = p->next->next;
p->next = s;
return ;
}
bool BagBox::Get(int x, int paw) {
if(Empty()) {
cout << "Empty Box!" << endl;
return false;
}
if(x > MaxSize) {
cout << "Wrong ID!" << endl;
return false;
}
BagBox *p = SearchID(x);
if(p == NULL || p->next->pw != paw) {
cout << "Wrong Password Or ID" << endl;
return false;
}
vis[p->next->id-1] = false;
delete p->next;
p->next = p->next->next;
--length;
cout << "Success!" << endl;
return true;
}
bool BagBox::Empty() {
return first->next == NULL;
}
void BagBox::Del(BagBox *p) {
if(p->next != NULL)
Del(p->next);
delete p;
}
int main(void) {
srand(time(0));
ios::sync_with_stdio(false);
int n, x, paw;//操作數
cin >> n;
for(int i=0; i<n; ++i) {
cout << "Please choose the operator: ";
cin >> x;
if(x == 1)
first->Add();
else {
cout << "Please input ID and password:" << endl;
cin >> x >> paw;
first->Get(x, paw);
}
}
return 0;
}