2021.9.15數據結構實驗課作業

存包櫃的模擬實現,包括存包和取包功能(必做),系統管理功能(選做)
利用單鏈表模擬超市存包櫃的實現。
假設存包櫃有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;
}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章