原本打算說點新內(nèi)容的,但想想我們挖了一個坑,卻沒有來填,而有些朋友又沒能看出其中端倪,這著實可恨,所以為了讓大家都明白我們這個List為什么是錯的,所以我想了下,還是決定把正確的實現(xiàn)方法放出來,也好讓還沒弄明白是怎么回事的朋友不必云里霧里。 為什么會有我們這個錯誤的實現(xiàn)方法呢?起源于開始我著手實現(xiàn)接口時候猶豫的那一瞬間,原本我是照著常規(guī)的方法寫道: -------------------------------------------- typedef struct TelPhone{ char Name[20]; char TelNumber[20]; }iTem; typedef struct node{ iTem item; node* next; }Node; ----------------------------------------- 寫到這里的時候,突然想到C++里面的class的派生和繼承,于是就想不如弄個陷進在這里,看是否有人會跳,于是我又在下面加了這樣的代碼: -------------------------------------- typedef struct list{ Node* head; list *next; int size; }List; ------------------------------------- 當我敲下這段代碼的時候,我就開始想,這種實現(xiàn)方師傅放在C里面有些麻煩了,他不同于C++的代碼重用,所以想要實現(xiàn)接口確實不是那么一回事,當時我猶豫了下,要不要這樣拿出來呢?如果大家C語言功底夠厚,可能會容易看出來這是無法實現(xiàn)的,因為如果想要通過這種方式去實現(xiàn)List接口相當于實現(xiàn)了兩個list,這是C里面及不容許,因為大家都知道資源的可貴。 既然這是一個陷阱,那么要怎么瞞天過海呢?這就是一個難題了。相信大家都被我貼的圖給弄暈了,這好像看起來沒問題,是啊,確實沒問題,我們輸入的兩個聯(lián)系人都能夠正常顯示,但是為什么我要告訴大家這是一個有問題的實現(xiàn)呢?問題到底出在哪里?實踐才能檢驗真?zhèn)危嘈诺浆F(xiàn)在還沒人反饋出來,多半是大家都只看卻沒真正的把代碼敲在編譯器里面運行看看。不管大家有沒有驗證,我覺得我還是有義務(wù)把正確的實現(xiàn)給放出來,否則不但不能授人以漁,反而還誤人子弟。 其實這個實現(xiàn)主要考察的還是指針和數(shù)組的使用,很多人都說,C/C++的語法不多,但是確實最難學(xué)好的一門編程語言,通過這個綜合實例,也可見一斑。 下面我們先看第一種實現(xiàn),我們用數(shù)組的形式來實現(xiàn),這是最簡單的,但是功能不如用指針的方式。 --------------------------------------------- //my_list.h #ifndef _MY_LIST_H_ #define _MY_LIST_H_ typedef struct TelPhone{ char Name[20]; char TelNumber[20]; }iTem; typedef struct node{ iTem item; node* next; }Node; #define MAXSIZE 100 typedef struct list{ iTem BookPhone[MAXSIZE]; int size; }List; void InitializeList (List *plist); bool ListIsEmpty (const List * plist); bool ListisFull (const List * plist); unsigned int ListItemCount (const List * plist); bool AddItem (iTem item, List * plist); void ShowListItem(const List* plist); void FreetheList (List * plist); #endif --------------------------------------------- 接口沒有變化,不同的是在我們聲明新類型的時作了稍微的修改,所以實現(xiàn)起來變得很簡單。如果大家沒有看出差別,可以回頭去看看我們那個有問題的聲明方式。 ------------------------------------------- #include #include #include 'my_list.h' //全局函數(shù),把元素添加進列表 static void CopyToNode(Node * pNode,iTem item) { pNode->item = item; } //初始化 void InitializeList(List *plist) { plist->size = 0; } //確認列表是否為空 bool ListIsEmpty(const List* plist) { if(plist->size == 0) return true; return false; } //確認列表是否已滿 bool ListisFull(const List* plist) { if(plist->size == MAXSIZE) return true; else return false; } //返回元素個數(shù) unsigned int ListItemCount(const List * plist) { return plist->size; } //添加元素,由于我們實現(xiàn)的是單向鏈表,所以使用從尾部添加 bool AddItem (iTem item, List * plist) { if(plist->size == MAXSIZE) return false; else { plist->BookPhone[plist->size++] = item; return true; } } //顯示列表中的元素 void ShowListItem(const List* plist) { if(plist->size == 0) printf('Not any data!!!'); else { for(int i=0;isize;i++) printf('%-20s : %s\n',plist->BookPhone[i].Name, plist->BookPhone[i].TelNumber); } } //釋放 void FreetheList (List * plist) { plist->size = 0; } ----------------------------------------------------- 因為接口沒有變化,所以我們的驅(qū)動函數(shù)不需要更改就可以直接運行,是不是覺得很方便呢?不過這個List的缺陷卻因為他是數(shù)組的原因,所以使得他不能夠收放自如,當然,要想讓他能夠收放自如我們可以使用指針的方式。接口還是這個接口,不過實現(xiàn)方式卻大不一樣,這個數(shù)組的方式比起來,難了不少,我們明天再說。
============= 回復(fù)D(不區(qū)分大小寫)直接查看目錄
|