今天我們來(lái)編寫(xiě)查詢(xún)模塊。這個(gè)模塊分兩個(gè)部分,全部顯示和查找具體某個(gè)記錄。
全部顯示
首先,我們來(lái)看看查詢(xún)功能的主函數(shù)。這個(gè)函數(shù)給出了查詢(xún)模塊兩個(gè)功能的菜單。
// 查詢(xún)記錄
void SearchRecord()
{
int loop = 1;
while (loop)
{
CleanScreen();
// 顯示全部
printf("==== 全部記錄 ====\n\n");
ListTraverShow();
////
int t;
printf("\n\n下一步\n");
printf("1. 顯示全部\n");
printf("2. 查找\n");
printf("0. 返回\n");
printf("----------------\n");
printf("請(qǐng)輸入要使用的功能:");
scanf("%d", &t);
if (t == 1)
{
// Do nothing
}
else if (t == 2)
{
FindRecord();
}
else
{
loop = 0;
}
}
}
這個(gè)函數(shù)的基本流程如下:
1. 清屏
在執(zhí)行查詢(xún)之前,擦掉屏幕上的全部?jī)?nèi)容,從邏輯上告訴用戶(hù)進(jìn)入了一個(gè)新的功能模塊。
2. 顯示全部記錄
這里我們調(diào)用了上一篇中實(shí)現(xiàn)的ListTraverShow()這個(gè)函數(shù),將鏈表中保存的全部記錄打印在屏幕上。
3. 打印菜單
將三個(gè)操作的操作碼打印在屏幕上,方便用戶(hù)參照輸入。輸入1時(shí),函數(shù)執(zhí)行下一個(gè)循環(huán),自動(dòng)重復(fù)打印全部記錄。輸入2時(shí),調(diào)用FindRecord()函數(shù)進(jìn)入具體的檢索方法。
4. 流程控制
這里需要注意的是我們用來(lái)控制函數(shù)流程的方法。我們選擇了一個(gè)while循環(huán)作為函數(shù)的主流程。我們通過(guò)修改循環(huán)控制變量loop的值來(lái)控制是否跳出循環(huán)。
while (loop)
{
}
這種寫(xiě)法是程序設(shè)計(jì)中非常常見(jiàn)的,特別是在多線程編程中會(huì)頻繁用到,希望大家能夠掌握。
當(dāng)然,我們說(shuō)程序員最不缺的就是方法,我們還有很多其他的方法來(lái)實(shí)現(xiàn)同樣的流程控制。最容易想到的就是寫(xiě)一個(gè)死循環(huán),while(true){},之后在while的循環(huán)內(nèi)部通過(guò)條件語(yǔ)句加break實(shí)現(xiàn)跳出動(dòng)作。
while (true)
{
if ( ... )
{
break;
}
}
這個(gè)方法也很基礎(chǔ),你看懂了嗎?

具體查找
下面我們?cè)賮?lái)看根據(jù)姓名查詢(xún)這個(gè)功能。在實(shí)現(xiàn)這個(gè)功能之前,我們首先需要在ListNode.c中實(shí)現(xiàn)這樣一個(gè)函數(shù)。
Record* ListFind(char* pStrName)
{
ListNode* pNode;
for (pNode = g_pL; pNode->_pR != NULL; pNode = pNode->_pNext)
{
if (strcmp(pNode->_pR->_pStrName->pBuf, pStrName) == 0)
{
return pNode->_pR;
}
}
return NULL;
}
這個(gè)函數(shù)的功能是輸入一個(gè)字符串,之后在_pR指向的鏈表中找到匹配的記錄。方法實(shí)現(xiàn)起來(lái)很簡(jiǎn)單,遍歷鏈表中的節(jié)點(diǎn),這個(gè)上一篇中已經(jīng)學(xué)會(huì)了。我們通過(guò)strcmp()這個(gè)庫(kù)函數(shù)來(lái)比較姓名字符串,找到匹配的節(jié)點(diǎn)后將這個(gè)節(jié)點(diǎn)中的Record指針?lè)祷丶纯?。不要忘了在ListNode.h中加入這行代碼:
Record* ListFind(char* pStrName);
有了這個(gè)函數(shù),我們就能輕松地在main.c中寫(xiě)出功能代碼了:
void FindRecord()
{
char str[50];
int loop = 1;
int t;
gets(str); // Remove '\t'
CleanScreen();
printf("==== 查找記錄 ====\n\n");
printf("請(qǐng)輸入需要查找的姓名:\n");
printf("姓名:");
gets(str);
Record* pRecord = ListFind(str);
if (pRecord == NULL)
{
printf("未找到%s的資料。\n", str);
}
else
{
RecordPrint(pRecord);
}
system("pause");
}
是不是全部都能看懂呢?這里拿到Record后,我們只需要調(diào)用之前實(shí)現(xiàn)的RecordPrint()函數(shù)將這個(gè)記錄打印在屏幕上就好了。是不是很簡(jiǎn)單呢?操作如下圖:

好了,今天就到這里。下一篇中我們會(huì)講解如何把錄入的記錄保存在磁盤(pán)中。
我是天花板,讓我們一起在軟件開(kāi)發(fā)中自我迭代。
如有任何問(wèn)題,歡迎與我聯(lián)系。
上一篇:21天C語(yǔ)言代碼訓(xùn)練營(yíng)(第十三天)
下一篇:21天C語(yǔ)言代碼訓(xùn)練營(yíng)(第十五天)