1 /******************************************************************************/
2 /* src/libraries/libMLibBasic/List/ListInsert.c */
4 /* Copyright (C) 2017 Mochi. */
5 /******************************************************************************/
6 /******************************************************************************/
8 /******************************************************************************/
12 #include <MLib/MLib.h>
13 #include <MLib/Basic/MLibBasicList.h>
16 /******************************************************************************/
18 /******************************************************************************/
19 /******************************************************************************/
22 * @details 指定した連結リストの先頭に新しいノードを挿入する。
24 * @param[in] *pList 連結リスト
25 * @param[in] *pNewNode 挿入ノード
27 * @retval MLIB_SUCCESS 正常終了
28 * @retval MLIB_FAILURE 異常終了
30 /******************************************************************************/
31 MLibRet_t MLibBasicListInsertHead( MLibBasicList_t *pList,
32 MLibBasicListNode_t *pNewNode )
34 MLibBasicListNode_t *pOldHead; /* 旧先頭ノード */
40 if ( pList == NULL ) {
47 if ( pNewNode == NULL ) {
54 if ( pList->size == SIZE_MAX ) {
61 pOldHead = pList->pHead;
64 pList->pHead = pNewNode;
67 pNewNode->pNext = pOldHead;
68 pNewNode->pPrev = NULL;
71 if ( pOldHead == NULL ) {
75 pList->pTail = pNewNode;
81 pOldHead->pPrev = pNewNode;
91 /******************************************************************************/
94 * @details 指定したノードの次に新しいノードを挿入する。
96 * @param[in] *pList 連結リスト
97 * @param[in] *pNode 挿入先ノード
98 * @param[in] *pNewNode 挿入ノード
100 * @retval MLIB_SUCCESS 正常終了
101 * @retval MLIB_FAILURE 異常終了
103 /******************************************************************************/
104 MLibRet_t MLibBasicListInsertNext( MLibBasicList_t *pList,
105 MLibBasicListNode_t *pNode,
106 MLibBasicListNode_t *pNewNode )
108 MLibBasicListNode_t *pNextNode; /* 次ノード */
114 if ( pList == NULL ) {
121 if ( pNode == NULL ) {
128 if ( pNewNode == NULL ) {
135 if ( ( pList->size == 0 ) || ( pList->size == SIZE_MAX ) ) {
142 pNextNode = pNode->pNext;
145 pNode->pNext = pNewNode;
148 pNewNode->pPrev = pNode;
149 pNewNode->pNext = pNextNode;
152 if ( pNextNode == NULL ) {
156 pList->pTail = pNewNode;
162 pNextNode->pPrev = pNextNode;
172 /******************************************************************************/
175 * @details 指定したノードの前に新しいノードを挿入する。
177 * @param[in] *pList 連結リスト
178 * @param[in] *pNode 挿入先ノード
179 * @param[in] *pNewNode 挿入ノード
181 * @retval MLIB_SUCCESS 正常終了
182 * @retval MLIB_FAILURE 異常終了
184 /******************************************************************************/
185 MLibRet_t MLibBasicListInsertPrev( MLibBasicList_t *pList,
186 MLibBasicListNode_t *pNode,
187 MLibBasicListNode_t *pNewNode )
189 MLibBasicListNode_t *pPrevNode; /* 前ノード */
195 if ( pList == NULL ) {
202 if ( pNode == NULL ) {
209 if ( pNewNode == NULL ) {
216 if ( ( pList->size == 0 ) || ( pList->size == SIZE_MAX ) ) {
223 pPrevNode = pNode->pPrev;
226 pNode->pPrev = pNewNode;
229 pNewNode->pNext = pNode;
230 pNewNode->pPrev = pPrevNode;
233 if ( pPrevNode == NULL ) {
237 pList->pHead = pNewNode;
243 pPrevNode->pNext = pNewNode;
253 /******************************************************************************/
256 * @details 指定した連結リストの最後尾に新しいノードを挿入する。
258 * @param[in] *pList 連結リスト
259 * @param[in] *pNewNode 挿入ノード
261 * @retval MLIB_SUCCESS 正常終了
262 * @retval MLIB_FAILURE 異常終了
264 /******************************************************************************/
265 MLibRet_t MLibBasicListInsertTail( MLibBasicList_t *pList,
266 MLibBasicListNode_t *pNewNode )
268 MLibBasicListNode_t *pOldTail; /* 最後尾ノード */
274 if ( pList == NULL ) {
281 if ( pNewNode == NULL ) {
288 if ( pList->size == SIZE_MAX ) {
295 pOldTail = pList->pTail;
298 pList->pTail = pNewNode;
301 pNewNode->pNext = NULL;
302 pNewNode->pPrev = pOldTail;
305 if ( pOldTail == NULL ) {
309 pList->pHead = pNewNode;
315 pOldTail->pNext = pNewNode;
325 /******************************************************************************/