前言
第4次:改写第3次实验内容
文件 <-> 链表<-> 系统的操作
第5-7次:在第4次实验基础上,完成全部功能,是基于链表的
系统需求分析和注意事项
详情可参考前一篇文章:
传送门:武汉理工大学计算机基础与编程综合实验——网吧计费管理系统第一个版本
以下是本篇文章正文内容,下面案例可供参考
具体实现(链表基本操作)
model.h
定义卡信息链表结点类型。
struct CardNode
{
Card data;//结点数据
struct CardNode* next;//指向下个结点的指针
}
AMS.cpp
定义链表表头指针。
CardNode* pCardNodeHead=NULL;
pCardNodeHead=CardListInit(CARDPATH);
cardList.cpp
CardListInit()
为了对比容器 vector 和链表 list 的操作,我们使用 cardList.cpp 和 cardList.h 文件来存放对卡 card 的基本操作。
CardNode* CardListInit(const string cardFilename)
{
ifstream cardfile(cardFilename);
CardNode *pCardNode, *pCardNodeHead, *pCardNodeTail;
Card card;
if(!cardfile.is_open())
{
return NULL;
}
pCardNodeHead = NULL;
pCardNodeTail = NULL;
while(1)
{
cardfile.read((char*)&card, sizeof(Card));
if(cardfile.eof())
{
break;
}
pCardNode = new CardNode;
pCardNode->data = card;
if(pCardNodeHead == NULL)
{
pCardNodeHead = pCardNode;
pCardNodeTail = pCardNode;
}
else
{
pCardNodeTail->next = pCardNode;
pCardNodeTail = pCardNode;
}
}
pCardNodeTail->next = NULL;
cardfile.close();
return pCardNodeHead;
}
addNewCard()
int addNewCard(string strNo, string strPwd, float fBalance, CardNode**
ppCardNodeHead)
{
int nCardIndex=0;
if(cardIsExist(strNo, nCardIndex, *ppCardNodeHead) != NULL)
{
return FINDCARD;
}
Card card;
strcpy(card.aName, strNo.c_str());
strcpy(card.aPwd, strPwd.c_str());
card.fBalance = fBalance;
// 添加新卡时,累计金额等于开卡金额
card.fTotalUse = card.fBalance;
card.nStatus = UNUSE; // 卡状态
card.nUseCount = 0; // 使用次数
// 开卡时间,最后使用时间都默认为当前时间
card.tStart = card.tLast = time(NULL);
CardNode* pCardNode = new CardNode;
pCardNode->data = card;
CardNode *pCardNodeHead=*ppCardNodeHead;
CardNode *pCardNodeTail=*ppCardNodeHead;
if(pCardNodeHead == NULL)
{
// 第一张卡,通过ppCardNodeHead将表态指针返回
pCardNodeHead = pCardNode;
pCardNodeTail = pCardNode;
*ppCardNodeHead = pCardNode;
}
else
{
pCardNodeTail = pCardNodeHead;
while(pCardNodeTail->next != NULL)
pCardNodeTail = pCardNodeTail->next;
pCardNodeTail->next = pCardNode;
pCardNodeTail = pCardNode;
}
pCardNodeTail->next = NULL;
saveCard(&card, CARDPATH);
return SUCCESS;
}
displayCard()
void displayCard(CardNode* pCardNodeHead)
{
if(pCardNodeHead == NULL)
{
cout << endl << endl <<"一张上机卡都没有!" << endl << endl;
return;
}
cout << "卡号\t状态\t余额\t累计使用\t使用次数\t上次使用时间" << endl;
CardNode* pCur = pCardNodeHead;
while(pCur != NULL)
{
char aLastTime[TIMELENGTH] = {
0};
//char* aLastTime=NULL;
timeToString((pCur->data).tLast, aLastTime);
cout << pCur->data.aName << "\t" ;
if(pCur->data.nStatus == USING)
cout << "上机\t";
else if(pCur->data.nStat