久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久


嵌入式linux內核數據結構之單向鏈表

分享(xiang)到:
           

    在(zai)嵌(qian)入式linux內核中(zhong),鏈(lian)表是一種(zhong)常見的(de)重要(yao)數(shu)(shu)據結(jie)構,它(ta)可以(yi)動態地(di)進行存儲(chu)分配,根(gen)據需(xu)要(yao)開辟內存單元,還可以(yi)方(fang)便地(di)實現數(shu)(shu)據的(de)增(zeng)加和刪除。鏈(lian)表中(zhong)的(de)每個元素都由兩部分組成:數(shu)(shu)據域(yu)和指針域(yu)。

    其(qi)中,數據域(yu)用(yong)(yong)于存儲數據元素(su)的(de)信息,指針域(yu)用(yong)(yong)于存儲該(gai)元素(su)的(de)直接后(hou)繼元素(su)的(de)位(wei)置。其(qi)整體結構就是用(yong)(yong)指針相鏈接起來的(de)線性(xing)表,如圖1.1所示(shi)。


圖1.1 鏈(lian)表結構(gou)

    由(you)圖中,大(da)家可以清楚(chu)地(di)看(kan)到,每(mei)個(ge)鏈(lian)表都有(you)一(yi)個(ge)頭(tou)指(zhi)針(zhen)Head,其(qi)用于指(zhi)示鏈(lian)表中第一(yi)個(ge)節點(dian)的存儲位置。之后(hou),鏈(lian)表由(you)第一(yi)個(ge)節點(dian)指(zhi)向(xiang)第二個(ge)節點(dian),依此類(lei)推。鏈(lian)表的后(hou)一(yi)個(ge)數據元素由(you)于沒有(you)直接后(hou)繼節點(dian),因此其(qi)節點(dian)的指(zhi)針(zhen)為空(kong)(NULL)。本文主要介紹的是單(dan)項鏈(lian)表!

    1、 單鏈表的組織與存儲

    單向鏈表的每(mei)個節點中除(chu)信息(xi)域(yu)(yu)以外還有一(yi)(yi)個指(zhi)針域(yu)(yu),用來(lai)指(zhi)向其后續節點,其后一(yi)(yi)個節點的指(zhi)針域(yu)(yu)為空(kong)(NULL)。

    單向(xiang)(xiang)鏈(lian)表(biao)(biao)由頭指(zhi)針(zhen)惟(wei)一(yi)確定,因此單向(xiang)(xiang)鏈(lian)表(biao)(biao)可(ke)以用頭指(zhi)針(zhen)的名字來命名,頭指(zhi)針(zhen)指(zhi)向(xiang)(xiang)單向(xiang)(xiang)鏈(lian)表(biao)(biao)的第一(yi)個節點。

    在用C語言實(shi)現時,首先說明一個結構類型,在這(zhe)個結構類型中包含一個(或多個)信(xin)息成(cheng)(cheng)員(yuan)以(yi)及一個指針成(cheng)(cheng)員(yuan)如下所示:

    typedef struct _link_node
    {
      element_type data; /* element_type為有效數據類型*/
      struct _link_node *next;
    } link_node;
    typedef link_node *link_list; 

    鏈表結構(gou)(gou)中(zhong)包含指(zhi)(zhi)針(zhen)(zhen)型(xing)(xing)的結構(gou)(gou)成(cheng)員(yuan),類(lei)(lei)型(xing)(xing)為指(zhi)(zhi)向(xiang)相(xiang)同結構(gou)(gou)類(lei)(lei)型(xing)(xing)的指(zhi)(zhi)針(zhen)(zhen)。根據C語(yu)言(yan)的語(yu)法要求,結構(gou)(gou)的成(cheng)員(yuan)不能(neng)(neng)是結構(gou)(gou)自(zi)身類(lei)(lei)型(xing)(xing),即結構(gou)(gou)不能(neng)(neng)自(zi)己定義(yi)(yi)自(zi)己,因為這樣將導致一個(ge)無(wu)窮(qiong)的遞歸定義(yi)(yi),但結構(gou)(gou)的成(cheng)員(yuan)可以是結構(gou)(gou)自(zi)身的指(zhi)(zhi)針(zhen)(zhen)類(lei)(lei)型(xing)(xing),通過指(zhi)(zhi)針(zhen)(zhen)引(yin)用自(zi)身這種(zhong)類(lei)(lei)型(xing)(xing)的結構(gou)(gou)。

    2、 單鏈表常見操作

    (1)節點初始化

    由于鏈(lian)表是一種動(dong)態分配(pei)數(shu)(shu)據的(de)(de)數(shu)(shu)據結構,因此單鏈(lian)表中各個節(jie)點(dian)的(de)(de)初始化(hua)通(tong)(tong)常使(shi)(shi)用malloc()函數(shu)(shu),把(ba)節(jie)點(dian)中的(de)(de)next指針賦為NULL,同(tong)時(shi)再把(ba)數(shu)(shu)據域的(de)(de)部分初始化(hua)為需要的(de)(de)數(shu)(shu)值,通(tong)(tong)常使(shi)(shi)用memset()函數(shu)(shu)。

    int init_link(link_list *list)
    {
      /*用malloc分配函數分配節點*/
      *list = (link_list)malloc(sizeof(link_node));
      /*若分配失敗,返回*/
      if (!list)
      {
        return -1;
      }
      /*初始化鏈表節點的數據域*/
      memset(&((*list)->data), 0, sizeof(element_type));
      /*初始化鏈表節點的指針域*/
      (*list)->next = NULL;
      return 0;
    }

    (2)數據查詢

    在(zai)(zai)操作鏈表(biao)時,通(tong)常需(xu)要(yao)(yao)檢(jian)查在(zai)(zai)鏈表(biao)中(zhong)是(shi)否存在(zai)(zai)某種數據(ju),這(zhe)時,可以通(tong)過順序遍歷鏈表(biao)來(lai)取得(de)所需(xu)要(yao)(yao)的(de)元素(su)。

    int get_element(link_list list, int i, element_type *elem)
    {
      /* list為帶頭節點的單鏈表的頭指針 */
      /*當第i個元素存在時,其值賦給elem并返回*/
      link_list p = NULL;
      int j = 0;

      /*初始化,指向鏈表的第一個節點,j為計數器*/
      p = list->next;
      /* 為防止i過大,通過判斷p是否為空來確定是否到達鏈表的尾部 */
      while ((j++ < i) && (p = p->next));
      /* 若第i個元素不存在,返回 */
      if (!p || (j <= i))
      {
        return -1;
      }
      /*取得第i個元素*/
      *elem = p->data;
      return 0;
    }

  

    (3)鏈表的插入與刪除

   &nbsp;鏈表的插入與刪除是鏈表中常見的操(cao)作(zuo)(zuo),也是能(neng)體現(xian)鏈表靈活性的操(cao)作(zuo)(zuo)。

   &nbsp;在單向鏈表中(zhong)插(cha)入一個節點(dian)要引起插(cha)入位置(zhi)前面(mian)節點(dian)的(de)指(zhi)針的(de)變(bian)化,如圖1.2所示。


圖1.2 鏈表的節點插入(ru)過程(cheng)

    由圖中可以看出,在鏈表中增加一個節點會依次完成如下操作。
    ●創建新節點C
    ●使C指向B:C→next = A→next。
     ●使A指(zhi)向C:A→next = C。

    int link_insert(link_list list, int i, element_type elem)
    {
      /* list為帶頭節點的單鏈表的頭指針 */
      /* i為要插入的元素位置,elem為要插入的元素*/
      link_list p = list, new_node;
      int j = 0;

      /* 找到第i位 */
      while ((j++ < i) && (p = p->next));
      if (!p || (j <= i))
      {
        return 0;
      }
      /* 初始化鏈表節點 */
      new_node = (link_list)malloc(sizeof(link_node));
      new_node->data = elem;
      /* 將s插入鏈表,并修改原先的指針 */
      new_node->next = p->next;
      p->next = new_node;
      return 1;
    }

    刪除(chu)的(de)過(guo)程也類似,如圖1.3所(suo)示。


圖1.3 鏈(lian)表的節點刪除過(guo)程

    同樣,鏈表中元素的指針會依次有以下變化。
    ●使(shi)A指向C:A→next = B->next。

    ●使B指向NULL:B->next = NULL 或(huo)(若(ruo)不再(zai)需(xu)要(yao)該(gai)節點(dian))釋(shi)放(fang)節點(dian)B。

    (4)其他操作

    將(jiang)幾個單鏈表(biao)合并也是(shi)鏈表(biao)操作(zuo)中的(de)一(yi)個常(chang)見的(de)操作(zuo)之一(yi)。

    下(xia)面將(jiang)兩個(ge)(ge)單(dan)鏈(lian)表(biao)根據標識符(fu)ID順(shun)序合并成一(yi)(yi)個(ge)(ge)單(dan)鏈(lian)表(biao)。在合并的(de)過程(cheng)中(zhong),實(shi)際上新(xin)(xin)建了一(yi)(yi)個(ge)(ge)鏈(lian)表(biao),然后將(jiang)兩個(ge)(ge)鏈(lian)表(biao)的(de)元(yuan)(yuan)素依次進行比較,并且(qie)將(jiang)ID較小的(de)節點(dian)插入到新(xin)(xin)的(de)鏈(lian)表(biao)中(zhong)。如果其中(zhong)一(yi)(yi)個(ge)(ge)鏈(lian)表(biao)的(de)元(yuan)(yuan)素已(yi)經(jing)全部(bu)插入,則另一(yi)(yi)個(ge)(ge)鏈(lian)表(biao)的(de)剩余(yu)操(cao)作只需順(shun)序將(jiang)剩余(yu)元(yuan)(yuan)素插入即可。

    該過程如圖1.4所示:


圖1.4 鏈表的合并過程

    void merge_list(link_list list_a, link_list list_b, link_list *list_c)
    {
      /* 合并單鏈表list_a和list_b到list_c中 */
      link_list pa, pb, pc;

      /* 初始化pa、pb,指向鏈表的第一個元素 */
      pa = list_a->next;
      pb = list_b->next;
      *list_c = pc = list_a;
      /* 判斷兩個鏈表是否到達末尾 */
      while (pa && pb)
      {
        /*若鏈表list_a的元素小于鏈表list_b的元素,
        則把鏈表list_a的元素插入到list_c中*/
        if (less_equal_list(&pa->data, &pb->data))
        {
          pc->next = pa;
          pc = pa;
          pa = pa->next;
        }
        /* 若鏈表list_a的元素大于鏈表list_b的元素,
        則把鏈表list_b的元素插入到list_c中*/
        else
        {
          pc->next = pb;
          pc = pb;
          pb = pb->next;
        }
      }
      /* 將還未到達末尾的鏈表連入list_c中,若兩個鏈表都到達末尾,pc->next為NULL*/
      pc->next = pa?pa:pb;
    }

   熱(re)點(dian)鏈接(jie):

   1、Linux內核模塊程序結構
   2、嵌入式Linux內核如何編譯
   3、典型嵌入式Linux系統設置

更多新聞>>