小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

第二十九講 正確的List(數(shù)組)

 昵稱29398856 2016-01-21

 

       原本打算說點新內(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ū)分大小寫)直接查看目錄 

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多