OSDN Git Service

7306ea3c180e016393ba3138e15d038484518f35
[mochi/master.git] / src / libraries / libMLibBasic / List / ListInsert.c
1 /******************************************************************************/
2 /* src/libraries/libMLibBasic/List/ListInsert.c                               */
3 /*                                                                 2017/02/17 */
4 /* Copyright (C) 2017 Mochi.                                                  */
5 /******************************************************************************/
6 /******************************************************************************/
7 /* インクルード                                                               */
8 /******************************************************************************/
9 #include <stddef.h>
10 #include <stdint.h>
11
12 #include <MLib/MLib.h>
13 #include <MLib/Basic/MLibBasicList.h>
14
15
16 /******************************************************************************/
17 /* グローバル関数宣言                                                         */
18 /******************************************************************************/
19 /******************************************************************************/
20 /**
21  * @brief       ノード先頭挿入
22  * @details     指定した連結リストの先頭に新しいノードを挿入する。
23  * 
24  * @param[in]   *pList      連結リスト
25  * @param[in]   *pNewNode   挿入ノード
26  * 
27  * @retval      MLIB_SUCCESS 正常終了
28  * @retval      MLIB_FAILURE 異常終了
29  */
30 /******************************************************************************/
31 MLibRet_t MLibBasicListInsertHead( MLibBasicList_t     *pList,
32                                    MLibBasicListNode_t *pNewNode )
33 {
34     MLibBasicListNode_t *pOldHead;  /* 旧先頭ノード */
35     
36     /* 初期化 */
37     pOldHead = NULL;
38     
39     /* 引数pListチェック */
40     if ( pList == NULL ) {
41         /* 不正値 */
42         
43         return MLIB_FAILURE;
44     }
45     
46     /* 引数pNewNodeチェック */
47     if ( pNewNode == NULL ) {
48         /* 不正値 */
49         
50         return MLIB_FAILURE;
51     }
52     
53     /* 連結リストサイズチェック */
54     if ( pList->size == SIZE_MAX ) {
55         /* サイズ不正 */
56         
57         return MLIB_FAILURE;
58     }
59     
60     /* 旧先頭ノード取得 */
61     pOldHead = pList->pHead;
62     
63     /* 連結リスト先頭ノード設定 */
64     pList->pHead = pNewNode;
65     
66     /* 挿入ノード設定 */
67     pNewNode->pNext = pOldHead;
68     pNewNode->pPrev = NULL;
69     
70     /* 旧先頭ノード有無判定 */
71     if ( pOldHead == NULL ) {
72         /* 旧先頭ノード無 */
73         
74         /* 連結リスト最後尾ノード設定 */
75         pList->pTail = pNewNode;
76         
77     } else {
78         /* 旧先頭ノード有 */
79         
80         /* 旧先頭ノード設定 */
81         pOldHead->pPrev = pNewNode;
82     }
83     
84     /* 連結リストサイズ設定 */
85     pList->size++;
86     
87     return MLIB_SUCCESS;
88 }
89
90
91 /******************************************************************************/
92 /**
93  * @brief       ノード次挿入
94  * @details     指定したノードの次に新しいノードを挿入する。
95  * 
96  * @param[in]   *pList      連結リスト
97  * @param[in]   *pNode      挿入先ノード
98  * @param[in]   *pNewNode   挿入ノード
99  * 
100  * @retval      MLIB_SUCCESS 正常終了
101  * @retval      MLIB_FAILURE 異常終了
102  */
103 /******************************************************************************/
104 MLibRet_t MLibBasicListInsertNext( MLibBasicList_t     *pList,
105                                    MLibBasicListNode_t *pNode,
106                                    MLibBasicListNode_t *pNewNode )
107 {
108     MLibBasicListNode_t *pNextNode; /* 次ノード */
109     
110     /* 初期化 */
111     pNextNode = NULL;
112     
113     /* 引数pListチェック */
114     if ( pList == NULL ) {
115         /* 不正値 */
116         
117         return MLIB_FAILURE;
118     }
119     
120     /* 引数pNodeチェック */
121     if ( pNode == NULL ) {
122         /* 不正値 */
123         
124         return MLIB_FAILURE;
125     }
126     
127     /* 引数pNewNodeチェック */
128     if ( pNewNode == NULL ) {
129         /* 不正値 */
130         
131         return MLIB_FAILURE;
132     }
133     
134     /* 連結リストサイズチェック */
135     if ( ( pList->size == 0 ) || ( pList->size == SIZE_MAX ) ) {
136         /* サイズ不正 */
137         
138         return MLIB_FAILURE;
139     }
140     
141     /* 次ノード取得 */
142     pNextNode = pNode->pNext;
143     
144     /* 前ノード設定 */
145     pNode->pNext = pNewNode;
146     
147     /* 挿入ノード設定 */
148     pNewNode->pPrev = pNode;
149     pNewNode->pNext = pNextNode;
150     
151     /* 次ノード有無判定 */
152     if ( pNextNode == NULL ) {
153         /* 次ノード無 */
154         
155         /* 連結リスト最後尾ノード設定 */
156         pList->pTail = pNewNode;
157         
158     } else {
159         /* 次ノード有 */
160         
161         /* 次ノード設定 */
162         pNextNode->pPrev = pNextNode;
163     }
164     
165     /* 連結リストサイズ設定 */
166     pList->size++;
167     
168     return MLIB_SUCCESS;
169 }
170
171
172 /******************************************************************************/
173 /**
174  * @brief       ノード前挿入
175  * @details     指定したノードの前に新しいノードを挿入する。
176  * 
177  * @param[in]   *pList      連結リスト
178  * @param[in]   *pNode      挿入先ノード
179  * @param[in]   *pNewNode   挿入ノード
180  * 
181  * @retval      MLIB_SUCCESS 正常終了
182  * @retval      MLIB_FAILURE 異常終了
183  */
184 /******************************************************************************/
185 MLibRet_t MLibBasicListInsertPrev( MLibBasicList_t     *pList,
186                                    MLibBasicListNode_t *pNode,
187                                    MLibBasicListNode_t *pNewNode )
188 {
189     MLibBasicListNode_t *pPrevNode; /* 前ノード */
190     
191     /* 初期化 */
192     pPrevNode = NULL;
193     
194     /* 引数pListチェック */
195     if ( pList == NULL ) {
196         /* 不正値 */
197         
198         return MLIB_FAILURE;
199     }
200     
201     /* 引数pNodeチェック */
202     if ( pNode == NULL ) {
203         /* 不正値 */
204         
205         return MLIB_FAILURE;
206     }
207     
208     /* 引数pNewNodeチェック */
209     if ( pNewNode == NULL ) {
210         /* 不正値 */
211         
212         return MLIB_FAILURE;
213     }
214     
215     /* 連結リストサイズチェック */
216     if ( ( pList->size == 0 ) || ( pList->size == SIZE_MAX ) ) {
217         /* サイズ不正 */
218         
219         return MLIB_FAILURE;
220     }
221     
222     /* 前ノード取得 */
223     pPrevNode = pNode->pPrev;
224     
225     /* 次ノード設定 */
226     pNode->pPrev = pNewNode;
227     
228     /* 挿入ノード設定 */
229     pNewNode->pNext = pNode;
230     pNewNode->pPrev = pPrevNode;
231     
232     /* 前ノード有無判定 */
233     if ( pPrevNode == NULL ) {
234         /* 前ノード無 */
235         
236         /* 連結リスト先頭ノード設定 */
237         pList->pHead = pNewNode;
238         
239     } else {
240         /* 前ノード有 */
241         
242         /* 前ノード設定 */
243         pPrevNode->pNext = pNewNode;
244     }
245     
246     /* 連結リストサイズ設定 */
247     pList->size++;
248     
249     return MLIB_SUCCESS;
250 }
251
252
253 /******************************************************************************/
254 /**
255  * @brief       ノード最後尾挿入
256  * @details     指定した連結リストの最後尾に新しいノードを挿入する。
257  * 
258  * @param[in]   *pList      連結リスト
259  * @param[in]   *pNewNode   挿入ノード
260  * 
261  * @retval      MLIB_SUCCESS 正常終了
262  * @retval      MLIB_FAILURE 異常終了
263  */
264 /******************************************************************************/
265 MLibRet_t MLibBasicListInsertTail( MLibBasicList_t     *pList,
266                                    MLibBasicListNode_t *pNewNode )
267 {
268     MLibBasicListNode_t *pOldTail;  /* 最後尾ノード */
269     
270     /* 初期化 */
271     pOldTail = NULL;
272     
273     /* 引数pListチェック */
274     if ( pList == NULL ) {
275         /* 不正値 */
276         
277         return MLIB_FAILURE;
278     }
279     
280     /* 引数pNewNodeチェック */
281     if ( pNewNode == NULL ) {
282         /* 不正値 */
283         
284         return MLIB_FAILURE;
285     }
286     
287     /* 連結リストサイズチェック */
288     if ( pList->size == SIZE_MAX ) {
289         /* サイズ不正 */
290         
291         return MLIB_FAILURE;
292     }
293     
294     /* 旧最後尾ノード取得 */
295     pOldTail = pList->pTail;
296     
297     /* 連結リスト最後尾ノード設定 */
298     pList->pTail = pNewNode;
299     
300     /* 挿入ノード設定 */
301     pNewNode->pNext = NULL;
302     pNewNode->pPrev = pOldTail;
303     
304     /* 旧最後尾ノード有無判定 */
305     if ( pOldTail == NULL ) {
306         /* 旧最後尾ノード無 */
307         
308         /* 連結リスト先頭ノード設定 */
309         pList->pHead = pNewNode;
310         
311     } else {
312         /* 旧最後尾ノード有 */
313         
314         /* 旧最後尾ノード設定 */
315         pOldTail->pNext = pNewNode;
316     }
317     
318     /* 連結リストサイズ設定 */
319     pList->size++;
320     
321     return MLIB_SUCCESS;
322 }
323
324
325 /******************************************************************************/