溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

linux單向循環(huán)鏈表源碼分析

發(fā)布時間:2021-09-10 16:48:41 來源:億速云 閱讀:158 作者:chen 欄目:大數(shù)據(jù)

本篇內(nèi)容介紹了“l(fā)inux單向循環(huán)鏈表源碼分析”的有關(guān)知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

extern inline void add_wait_queue(struct wait_queue ** p, struct wait_queue * wait){  unsigned long flags;
#ifdef DEBUG  if (wait->next) {    unsigned long pc;    __asm__ __volatile__("call 1f\n"      "1:\tpopl %0":"=r" (pc));    printk("add_wait_queue (%08x): wait->next = %08x\n",pc,(unsigned long) wait->next);  }#endif  save_flags(flags);  cli();  // 隊列為空,頭指針指向待插入的節(jié)點wait,末節(jié)點的next指針指向自己  if (!*p) {    wait->next = wait;    *p = wait;  } else {    /*      在第一個節(jié)點后面插入節(jié)點,形成單向循環(huán)鏈表 thanks to zym.      插入第二個節(jié)點的時候,是在第一個節(jié)點后面插入,后面在插入的時候,      是在第一個第二個節(jié)點中間插入,然后是從第一第三個直接插入,如此類推      *p指向第一個節(jié)點,(*p)->next指向第一個節(jié)點的下一個,插入第二個節(jié)點的時候,      第一個節(jié)點的下一個節(jié)點是自己。wait->next即新節(jié)點的next指向第一個節(jié)點的下一個節(jié)點,      (*p)->next = wait;即第一個節(jié)點的next指針指向新加入的節(jié)點。      傳統(tǒng)的頭插法只能形成單鏈表,不能循環(huán),因為循環(huán)需要拿尾指針的next指向第一個      節(jié)點,但是隨著鏈表的變成,無法找到尾節(jié)點。      p -> head -> null      p -> head -> node1                 next              |------->      p -> head -> node1     node2              <-------                next                  next    next              |------->   |------->      p -> head -> node1     node3    node2              <------------------                next      測試代碼      #include <stdio.h>      struct wait_queue {        int task;        struct wait_queue * next;      };      void add_wait_queue(struct wait_queue ** p, struct wait_queue * wait)      {
       if (!*p) {          //printf("%d", 1);          wait->next = wait;          *p = wait;        } else {                    // 頭插法,形成單向鏈表          wait->next = (*p)->next;          (*p)->next = wait;          //printf("%d", wait->next == *p);        }      }      int main()      {        struct wait_queue wait = { 1, NULL };        struct wait_queue wait1 = { 2, NULL };        struct wait_queue wait2 = { 3, NULL };        struct wait_queue * head = NULL;        add_wait_queue(&head, &wait);        add_wait_queue(&head, &wait1);        add_wait_queue(&head, &wait2);        int c = 5;        while(c--) {          printf("%d", head->task);          head = head->next;        }      }    */    wait->next = (*p)->next;    (*p)->next = wait;  }  restore_flags(flags);}
extern inline void remove_wait_queue(struct wait_queue ** p, struct wait_queue * wait){  unsigned long flags;  struct wait_queue * tmp;#ifdef DEBUG  unsigned long ok = 0;#endif
 save_flags(flags);  cli();  // 刪除的是第一個節(jié)點并且只有一個節(jié)點了則頭指針指向NULL  if ((*p == wait) &&#ifdef DEBUG      (ok = 1) &&#endif      ((*p = wait->next) == wait)) {    *p = NULL;  } else {    // 從自己開始遍歷單向循環(huán)鏈表,找到next指向自己的,然后更新指針    tmp = wait;    while (tmp->next != wait) {      tmp = tmp->next;#ifdef DEBUG      if (tmp == *p)        ok = 1;#endif    }    tmp->next = wait->next;  }  wait->next = NULL;  restore_flags(flags);#ifdef DEBUG  if (!ok) {    printk("removed wait_queue not on list.\n");    printk("list = %08x, queue = %08x\n",(unsigned long) p, (unsigned long) wait);    __asm__("call 1f\n1:\tpopl %0":"=r" (ok));    printk("eip = %08x\n",ok);  }#endif}

“l(fā)inux單向循環(huán)鏈表源碼分析”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識可以關(guān)注億速云網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實用文章!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI