• Double linked list structure


     1 // Double linked list structure. Can be used as either a list head, or as link words.
     2 
     3 // @struct USBH_DLIST |
     4 //   The USBH_DLIST structure is the link element of the double linked list. It is used as either a list head, or as link entry.
     5 // @field  struct tDLIST * | Flink |
     6 //   Pointer to the successor (forward link).
     7 // @field  struct tDLIST * | pPrev |
     8 //   Pointer to the predecessor (backward link).
     9 // @comm By means of such elements any structures may be handled as a double linked list. The USBH_DLIST structure is to be inserted
    10 //   into the structure which is to be handled. A pointer to the original structure can be obtained by means of the macro <f STRUCT_BASE_POINTER>.
    11 typedef struct USBH_DLIST USBH_DLIST;
    12 struct USBH_DLIST {
    13   USBH_DLIST * pNext;
    14   USBH_DLIST * pPrev;
    15 };
    16 
    17 void         USBH_DLIST_Append     (USBH_DLIST * ListHead, USBH_DLIST * List);
    18 void         USBH_DLIST_InsertTail (USBH_DLIST * ListHead, USBH_DLIST * Entry);
    19 void         USBH_DLIST_InsertHead (USBH_DLIST * ListHead, USBH_DLIST * Entry);
    20 void         USBH_DLIST_InsertEntry(USBH_DLIST * Entry,    USBH_DLIST * NewEntry);
    21 void         USBH_DLIST_RemoveTail (USBH_DLIST * ListHead, USBH_DLIST ** Entry);
    22 void         USBH_DLIST_RemoveHead (USBH_DLIST * ListHead, USBH_DLIST ** Entry);
    23 void         USBH_DLIST_RemoveEntry(USBH_DLIST * Entry);
    24 USBH_DLIST * USBH_DLIST_GetPrev    (USBH_DLIST * Entry);
    25 USBH_DLIST * USBH_DLIST_GetNext    (USBH_DLIST * Entry);
    26 int          USBH_DLIST_IsEmpty    (USBH_DLIST * ListHead);
    27 void         USBH_DLIST_Init       (USBH_DLIST * ListHead);
    28 
    29 
    30 /*********************************************************************
    31 *
    32 *       USBH_DLIST
    33 */
    34 typedef struct USBH_DLIST_ITEM {
    35   struct USBH_DLIST_ITEM * pNext;
    36   struct USBH_DLIST_ITEM * pPrev;
    37 } USBH_DLIST_ITEM;
    38 
    39 typedef struct {
    40   struct USBH_DLIST_ITEM * pFirst;
    41   int NumItems;
    42 } USBH_DLIST_HEAD;
    43 
    44 void USBH_DLIST_Remove(USBH_DLIST_HEAD * pHead, USBH_DLIST_ITEM * pItem);
    45 void USBH_DLIST_Add   (USBH_DLIST_HEAD * pHead, USBH_DLIST_ITEM * pNew);
      1 typedef struct USBH_DLIST USBH_DLIST;
      2 struct USBH_DLIST
      3 {
      4   USBH_DLIST * pNext;
      5   USBH_DLIST * pPrev;
      6 };
      7 
      8 // USBH_DLIST_Init
      9 //     STR     R0, [R0,#4]
     10 //     STR     R0, [R0]
     11 //     BX      LR
     12 void USBH_DLIST_Init(USBH_DLIST * ListHead)
     13 {
     14   ListHead->pPrev = ListHead;
     15   ListHead->pNext = ListHead;
     16 }
     17 
     18 // USBH_DLIST_Append
     19 //     LDR     R2, [R0,#4]
     20 //     STR     R1, [R2]
     21 //     LDR     R3, [R1,#4]
     22 //     STR     R0, [R3]
     23 //     LDR     R3, [R1,#4]
     24 //     STR     R3, [R0,#4]
     25 //     STR     R2, [R1,#4]
     26 //     BX      LR
     27 
     28 //  /---<<<<<<<<<<<<<<<<<<<<<<pNext---\         /---<<<<<<<<<<<<<<<<<<pNext---\
     29 //  ListHead <----> 0 <----> 1 <----> N         List <----> 0 <----> 1 <----> N
     30 //  pPrev >>>>>>>>>>>>>>>>>>>>>>>>>---/         pPrev >>>>>>>>>>>>>>>>>>>>>---/
     31 //
     32 //  /---<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<pNext---\
     33 //  ListHead <----> 0 <----> 1 <----> N <---->  List <----> 0 <----> 1 <----> N
     34 //  pPrev >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>---/
     35 void USBH_DLIST_Append(USBH_DLIST * ListHead, USBH_DLIST * List)
     36 {
     37   ListHead->pPrev->pNext = List;
     38   List->pPrev->pNext = ListHead;
     39   ListHead->pPrev = List->pPrev;
     40   List->pPrev = ListHead->pPrev;
     41 }
     42 
     43 // USBH_DLIST_IsEmpty
     44 //     LDR     R1, [R0]
     45 //     CMP     R1, R0
     46 //     ITE EQ
     47 //     MOVEQ   R0, #1
     48 //     MOVNE   R0, #0
     49 //     BX      LR
     50 int USBH_DLIST_IsEmpty(USBH_DLIST * ListHead)
     51 {
     52   return ListHead == ListHead->pNext;
     53 }
     54 
     55 // USBH_DLIST_GetNext          USBH_DLIST_GetPrev
     56 //     LDR     R0, [R0]            LDR     R0, [R0,#4]
     57 //     BX      LR                  BX      LR
     58 USBH_DLIST * USBH_DLIST_GetNext(USBH_DLIST * Entry)
     59 {
     60   return Entry->pNext;
     61 }
     62 USBH_DLIST * USBH_DLIST_GetPrev(USBH_DLIST * Entry)
     63 {
     64   return Entry->pPrev;
     65 }
     66 
     67 //                             USBH_DLIST_RemoveHead     USBH_DLIST_RemoveTail
     68 //                                LDR     R0, [R0]          LDR     R0, [R0,#4]
     69 // USBH_DLIST_RemoveEntry         STR     R0, [R1]          STR     R0, [R1]
     70 //
     71 //    LDRD.W  R1, R2, [R0]        LDRD.W  R1, R2, [R0]      LDRD.W  R1, R2, [R0]
     72 //    STR     R1, [R2]            STR     R1, [R2]          STR     R1, [R2]
     73 //
     74 //    LDRD.W  R1, R2, [R0]        LDRD.W  R1, R2, [R0]      LDRD.W  R1, R2, [R0]
     75 //    STR     R2, [R1,#4]         STR     R2, [R1,#4]       STR     R2, [R1,#4]
     76 //
     77 //    STR     R0, [R0,#4]         STR     R0, [R0,#4]       STR     R0, [R0,#4]
     78 //    STR     R0, [R0]            STR     R0, [R0]          STR     R0, [R0]
     79 //    BX      LR                  BX      LR                BX      LR
     80 
     81 // pPrev [ Entry ] pNext ---> pPrev pNext
     82 void USBH_DLIST_RemoveEntry(USBH_DLIST * Entry)
     83 {
     84   Entry->pPrev->pNext = Entry->pNext;
     85   Entry->pNext->pPrev = Entry->pPrev;
     86   //USBH_DLIST_Init( Entry );
     87   Entry->pPrev = Entry;
     88   Entry->pNext = Entry;
     89 }
     90 
     91 
     92 void USBH_DLIST_RemoveHead(USBH_DLIST * ListHead, USBH_DLIST ** Entry)
     93 {
     94   (*Entry)->pNext = ListHead->pNext;
     95   USBH_DLIST_RemoveEntry( ListHead->pNext );
     96 }
     97 
     98 
     99 void USBH_DLIST_RemoveTail(USBH_DLIST * ListHead, USBH_DLIST ** Entry)
    100 {
    101   (*Entry)->pNext = ListHead->pPrev;
    102   USBH_DLIST_RemoveEntry( ListHead->pPrev );
    103 }
    104 
    105 //                                                       USBH_DLIST_InsertTail
    106 // USBH_DLIST_InsertEntry      USBH_DLIST_InsertHead         LDR     R0, [R0,#4]
    107 //     LDR     R2, [R0]            LDR     R2, [R0]          LDR     R2, [R0]
    108 //     STRD.W  R2, R0, [R1]        STRD.W  R2, R0, [R1]      STRD.W  R2, R0, [R1]
    109 //     LDR     R2, [R0]            LDR     R2, [R0]          LDR     R2, [R0]
    110 //     STR     R1, [R2,#4]         STR     R1, [R2,#4]       STR     R1, [R2,#4]
    111 //     STR     R1, [R0]            STR     R1, [R0]          STR     R1, [R0]
    112 //     BX      LR                  BX      LR                BX      LR
    113 
    114 void USBH_DLIST_InsertEntry(USBH_DLIST * Entry, USBH_DLIST * NewEntry)
    115 {
    116   NewEntry->pNext = Entry->pNext;
    117   NewEntry->pPrev = Entry;
    118 
    119   Entry->pNext->pPrev = NewEntry;
    120   Entry->pNext = NewEntry;
    121 }
    122 
    123 void USBH_DLIST_InsertHead(USBH_DLIST * ListHead, USBH_DLIST * Entry)
    124 {
    125   USBH_DLIST_InsertEntry( ListHead, Entry );
    126 }
    127 
    128 void USBH_DLIST_InsertTail(USBH_DLIST * ListHead, USBH_DLIST * Entry)
    129 {
    130   USBH_DLIST_InsertEntry( ListHead->pPrev, Entry );
    131 }
    132 
    133 // -------------------------------------------------------------------------------
    134  typedef struct USBH_DLIST_ITEM {
    135    struct USBH_DLIST_ITEM * pNext;
    136    struct USBH_DLIST_ITEM * pPrev;
    137  } USBH_DLIST_ITEM;
    138 
    139  typedef struct {
    140    struct USBH_DLIST_ITEM * pFirst;
    141    int NumItems;
    142  } USBH_DLIST_HEAD;
    143 
    144 
    145 void USBH_DLIST_InitHead(USBH_DLIST_HEAD * pHead)
    146 {
    147   pHead->pFirst = 0;
    148   pHead->NumItems = 0;
    149 }
    150 
    151 // USBH_DLIST_Add
    152 //     MOVS    R2, #0
    153 //     STR     R2, [R1,#4]   ; pNew->pPrev = 0;
    154 //
    155 //     LDR     R2, [R0]
    156 //     STR     R2, [R1]      ; pNew->pNext = pHead->pFirst;
    157 //
    158 //     LDR     R2, [R0]
    159 //     CMP     R2, #0
    160 //     IT NE                 ; pHead->pFirst != 0
    161 //     STRNE   R1, [R2,#4]   ; pHead->pFirst->pPrev = pNew;
    162 //
    163 //     STR     R1, [R0]      ; pHead->pFirst = pNew;
    164 //     BX      LR
    165 //
    166 //  pFirst --> pNew
    167 //  0 <------- pNew ----> 0
    168 //
    169 //  0 <------- pNew ----> pOld
    170 //  pNew <---- pOld ----> 0
    171 //
    172 void USBH_DLIST_Add(USBH_DLIST_HEAD * pHead, USBH_DLIST_ITEM * pNew)
    173 {
    174   pNew->pPrev = 0;
    175   pNew->pNext = 0;
    176   if (pHead->pFirst != 0)
    177   {
    178     pNew->pNext = pHead->pFirst;
    179     pHead->pFirst->pPrev = pNew;
    180   }
    181   pHead->pFirst = pNew;
    182   //pHead->NumItems++;
    183 }
    184 
    185 // USBH_DLIST_Remove
    186 //     LDR     R3, [R0]
    187 //     LDR     R2, [R1]
    188 //
    189 //     CMP     R3, R1
    190 //     IT NE
    191 //     LDRNE   R0, [R1,#4]
    192 //     STR     R2, [R0]
    193 //
    194 //     LDR     R0, [R1]
    195 //     CMP     R0, #0
    196 //     ITT NE
    197 //     LDRNE   R1, [R1,#4]
    198 //     STRNE   R1, [R0,#4]
    199 //
    200 //     BX      LR
    201 
    202 //
    203 void USBH_DLIST_Remove(USBH_DLIST_HEAD * pHead, USBH_DLIST_ITEM * pItem)
    204 {
    205   if (pHead->pFirst == pItem)
    206     pHead->pFirst->pNext = pItem->pNext;
    207   else
    208     pItem->pPrev->pNext = pItem->pNext;
    209 
    210   if (pItem->pNext != 0)
    211   {
    212     pHead->NumItems = (int)pItem->pPrev;
    213   }
    214 }

     


  • 相关阅读:
    easypoi添加下拉预选值
    java启动项目字符编码和配置文件的字符编码问题
    leetcode
    leetcode
    leetcode
    leetcode
    事务的隔离级别- 极客时间()
    数据库的事务
    SQL中的视图(极客时间)
    SQL中的连接(极客时间)
  • 原文地址:https://www.cnblogs.com/shangdawei/p/2678238.html
Copyright © 2020-2023  润新知