C 語言初學教材 - 第六章 查詢好友

現在我們要在鏈結串列中實作出線性搜尋,以便運用在查詢好友上面。類似新增好友找到 nextPtr 成員為 NULL 的方法,鏈結串列中的線性搜尋就是逐一比對每個節點,若是找到與 data.name 相同的節點,就傳回指向該節點的指標,如果都沒有找到,就回傳 NULL 。



這樣的線性搜尋如下的函數 lsearch()
LinkedListNode *lsearch(char *target, LinkedListNode *startPtr)
{
    LinkedListNode *currentPtr = startPtr;
    
    while (currentPtr != NULL) {
        if (!strcmp(currentPtr->data.name, target)) {
            return currentPtr;
        }
        
        currentPtr = currentPtr->nextPtr;
    }
    
    return NULL;
}


我們另外需要一個與使用者互動的函數 li() ,好接收使用者所要查詢的好友暱稱,以及顯示搜尋結果
void li(LinkedListNode *startPtr)
{
    LinkedListNode *targetPtr;
    char iname[NAME_SIZE];
    
    printf("\n請輸入要查詢資料的好友暱稱: ");
    scanf("%s", iname);
    
    targetPtr = lsearch(iname, startPtr);
    if (targetPtr != NULL) {
        printf("\n您所查詢的好友資料如下\n");
        printf("暱稱: %s\n", targetPtr->data.name);
        printf("年紀: %d\n", targetPtr->data.age);
        printf("暱稱: %s\n", targetPtr->data.sex ? "男" : "女");
        printf("暱稱: %s\n", targetPtr->data.relation ? "同學或朋友" : "家人");
    }
    else {
        printf("\n搜尋失敗,沒有這名好友的資料唷!\n");
    }
}


這樣在 itm.h 就需要增加以下兩個函數原型的宣告
LinkedListNode *lsearch(char *target, LinkedListNode *startPtr);
void li(LinkedListNode *startPtr);


然後把以上兩個函數定義放到實作檔 itmf.c ,來編譯執行測試看看吧!假設已加入 laura 為好友



輸入 3 進行查詢 laura 是否在好友名單中



查詢結果如下



再輸入 3 查詢 tom 是否在好友名單中



不意外的,沒有建立屬於 tom 的資料,自然搜尋不到囉!



問題與討論
  1. 說明 lsearch() 的運作方式。
  2. 為什麼搜尋不需要用到雙重指標?




沒有留言: