/******************************************************************************/
/* src/include/MLib/Basic/MLibBasicList.h */
-/* 2017/02/05 */
+/* 2017/02/17 */
/* Copyright (C) 2017 Mochi */
/******************************************************************************/
#ifndef _MLIB_BASIC_LIST_H_
/******************************************************************************/
/* グローバル関数プロトタイプ宣言 */
/******************************************************************************/
-/* 連結リスト初期化 */
-extern MLibRet_t MLibBasicListInit( MLibBasicList_t *pList );
+/* 次ノード取得 */
+extern MLibBasicListNode_t *MLibBasicListGetNextNode(
+ MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode );
-/* ノード後挿入 */
-extern MLibRet_t MLibBasicListInsertAfter( MLibBasicList_t *pList,
- MLibBasicListNode_t *pNode,
- MLibBasicListNode_t *pNewNode );
+/* 前ノード取得 */
+extern MLibBasicListNode_t *MLibBasicListGetPrevNode(
+ MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode );
-/* ノード前挿入 */
-extern MLibRet_t MLibBasicListInsertBefore( MLibBasicList_t *pList,
- MLibBasicListNode_t *pNode,
- MLibBasicListNode_t *pNewNode );
+/* 連結リスト初期化 */
+extern MLibRet_t MLibBasicListInit( MLibBasicList_t *pList );
/* ノード先頭挿入 */
extern MLibRet_t MLibBasicListInsertHead( MLibBasicList_t *pList,
MLibBasicListNode_t *pNewNode );
+/* ノード次挿入 */
+extern MLibRet_t MLibBasicListInsertNext( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode,
+ MLibBasicListNode_t *pNewNode );
+
+/* ノード前挿入 */
+extern MLibRet_t MLibBasicListInsertPrev( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode,
+ MLibBasicListNode_t *pNewNode );
+
/* ノード最後尾挿入 */
extern MLibRet_t MLibBasicListInsertTail( MLibBasicList_t *pList,
MLibBasicListNode_t *pNewNode );
--- /dev/null
+/******************************************************************************/
+/* src/libraries/libMLibBasic/List/ListGet.c */
+/* 2017/02/10 */
+/* Copyright (C) 2017 Mochi. */
+/******************************************************************************/
+/******************************************************************************/
+/* インクルード */
+/******************************************************************************/
+#include <stddef.h>
+#include <MLib/MLib.h>
+#include <MLib/Basic/MLibBasicList.h>
+
+
+/******************************************************************************/
+/* グローバル関数宣言 */
+/******************************************************************************/
+/******************************************************************************/
+/**
+ * @brief 次ノード取得
+ * @details 指定したノードの次のノードを連結リストから削除せずに取得する。
+ * ノーを指定しない場合は先頭ノードを取得する。
+ *
+ * @param[in] *pList 連結リスト
+ * @param[in] *pNode ノード
+ *
+ * @retval NULL ノード無
+ * @retval NULL以外 ノード有
+ */
+/******************************************************************************/
+MLibBasicListNode_t *MLibBasicListGetNextNode( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode )
+{
+ MLibBasicListNode_t *pRet; /* 戻り値 */
+
+ /* 初期化 */
+ pRet = NULL;
+
+ /* 引数チェック */
+ if ( pList == NULL ) {
+ /* 不正 */
+
+ return NULL;
+ }
+
+ /* ノード指定判定 */
+ if ( pNode == NULL ) {
+ /* 指定無 */
+
+ /* 先頭ノード返却 */
+ pRet = pList->pHead;
+
+ } else {
+ /* 指定有 */
+
+ /* 次ノード返却 */
+ pRet = pNode->pNext;
+ }
+
+ return pRet;
+}
+
+
+/******************************************************************************/
+/**
+ * @brief 前ノード取得
+ * @details 指定したノードの前のノードを連結リストから削除せずに取得する。
+ * ノーを指定しない場合は最後尾ノードを取得する。
+ *
+ * @param[in] *pList 連結リスト
+ * @param[in] *pNode ノード
+ *
+ * @retval NULL ノード無
+ * @retval NULL以外 ノード有
+ */
+/******************************************************************************/
+MLibBasicListNode_t *MLibBasicListGetPrevNode( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode )
+{
+ MLibBasicListNode_t *pRet; /* 戻り値 */
+
+ /* 初期化 */
+ pRet = NULL;
+
+ /* 引数チェック */
+ if ( pList == NULL ) {
+ /* 不正 */
+
+ return NULL;
+ }
+
+ /* ノード指定判定 */
+ if ( pNode == NULL ) {
+ /* 指定無 */
+
+ /* 最後尾ノード返却 */
+ pRet = pList->pTail;
+
+ } else {
+ /* 指定有 */
+
+ /* 前ノード返却 */
+ pRet = pNode->pPrev;
+ }
+
+ return pRet;
+}
+
+
+/******************************************************************************/
/******************************************************************************/
/* src/libraries/libMLibBasic/List/ListInsert.c */
-/* 2017/02/05 */
+/* 2017/02/17 */
/* Copyright (C) 2017 Mochi. */
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/******************************************************************************/
/**
- * @brief ã\83\8eã\83¼ã\83\89å¾\8c挿入
- * @details 指定したノードの後ろに新しいノードを挿入する。
+ * @brief ã\83\8eã\83¼ã\83\89å\85\88é 挿入
+ * @details 指定した連結リストの先頭に新しいノードを挿入する。
*
* @param[in] *pList 連結リスト
- * @param[in] *pNode 挿入先ノード
* @param[in] *pNewNode 挿入ノード
*
* @retval MLIB_SUCCESS 正常終了
* @retval MLIB_FAILURE 異常終了
*/
/******************************************************************************/
-MLibRet_t MLibBasicListInsertAfter( MLibBasicList_t *pList,
- MLibBasicListNode_t *pNode,
- MLibBasicListNode_t *pNewNode )
+MLibRet_t MLibBasicListInsertHead( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNewNode )
{
- MLibBasicListNode_t *pNextNode; /* 挿入後ノード */
+ MLibBasicListNode_t *pOldHead; /* 旧先頭ノード */
/* 初期化 */
- pNextNode = NULL;
+ pOldHead = NULL;
/* 引数pListチェック */
if ( pList == NULL ) {
return MLIB_FAILURE;
}
- /* 引数pNodeチェック */
- if ( pNode == NULL ) {
- /* 不正値 */
-
- return MLIB_FAILURE;
- }
-
/* 引数pNewNodeチェック */
if ( pNewNode == NULL ) {
/* 不正値 */
}
/* 連結リストサイズチェック */
- if ( ( pList->size == 0 ) || ( pList->size == SIZE_MAX ) ) {
+ if ( pList->size == SIZE_MAX ) {
/* サイズ不正 */
return MLIB_FAILURE;
}
- /* æ\8c¿å\85¥å¾\8cノード取得 */
- pNextNode = pNode->pNext;
+ /* æ\97§å\85\88é ノード取得 */
+ pOldHead = pList->pHead;
- /* 挿入前ノード設定 */
- pNode->pNext = pNewNode;
+ /* 連結リスト先頭ノード設定 */
+ pList->pHead = pNewNode;
/* 挿入ノード設定 */
- pNewNode->pPrev = pNode;
- pNewNode->pNext = pNextNode;
+ pNewNode->pNext = pOldHead;
+ pNewNode->pPrev = NULL;
- /* æ\8c¿å\85¥å¾\8cノード有無判定 */
- if ( pNextNode == NULL ) {
- /* æ\8c¿å\85¥å¾\8cノード無 */
+ /* æ\97§å\85\88é ノード有無判定 */
+ if ( pOldHead == NULL ) {
+ /* æ\97§å\85\88é ノード無 */
/* 連結リスト最後尾ノード設定 */
pList->pTail = pNewNode;
} else {
- /* æ\8c¿å\85¥å¾\8cノード有 */
+ /* æ\97§å\85\88é ノード有 */
- /* æ\8c¿å\85¥å¾\8cノード設定 */
- pNextNode->pPrev = pNextNode;
+ /* æ\97§å\85\88é ノード設定 */
+ pOldHead->pPrev = pNewNode;
}
/* 連結リストサイズ設定 */
/******************************************************************************/
/**
- * @brief ノード前挿入
- * @details 指定したノードの前に新しいノードを挿入する。
+ * @brief ノード次挿入
+ * @details 指定したノードの次に新しいノードを挿入する。
*
* @param[in] *pList 連結リスト
* @param[in] *pNode 挿入先ノード
* @retval MLIB_FAILURE 異常終了
*/
/******************************************************************************/
-MLibRet_t MLibBasicListInsertBefore( MLibBasicList_t *pList,
- MLibBasicListNode_t *pNode,
- MLibBasicListNode_t *pNewNode )
+MLibRet_t MLibBasicListInsertNext( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode,
+ MLibBasicListNode_t *pNewNode )
{
- MLibBasicListNode_t *pBeforeNode; /* 挿入前ノード */
+ MLibBasicListNode_t *pNextNode; /* 次ノード */
/* 初期化 */
- pBeforeNode = NULL;
+ pNextNode = NULL;
/* 引数pListチェック */
if ( pList == NULL ) {
return MLIB_FAILURE;
}
- /* æ\8c¿å\85¥å\89\8dノード取得 */
- pBeforeNode = pNode->pPrev;
+ /* 次ノード取得 */
+ pNextNode = pNode->pNext;
- /* 挿入後ノード設定 */
- pNode->pPrev = pNewNode;
+ /* 前ノード設定 */
+ pNode->pNext = pNewNode;
/* 挿入ノード設定 */
- pNewNode->pNext = pNode;
- pNewNode->pPrev = pBeforeNode;
+ pNewNode->pPrev = pNode;
+ pNewNode->pNext = pNextNode;
- /* æ\8c¿å\85¥å\89\8dノード有無判定 */
- if ( pBeforeNode == NULL ) {
- /* æ\8c¿å\85¥å\89\8dノード無 */
+ /* 次ノード有無判定 */
+ if ( pNextNode == NULL ) {
+ /* 次ノード無 */
- /* 連結リスト先頭ノード設定 */
- pList->pHead = pNewNode;
+ /* 連結リスト最後尾ノード設定 */
+ pList->pTail = pNewNode;
} else {
- /* æ\8c¿å\85¥å\89\8dノード有 */
+ /* 次ノード有 */
- /* æ\8c¿å\85¥å\89\8dノード設定 */
- pBeforeNode->pNext = pNewNode;
+ /* 次ノード設定 */
+ pNextNode->pPrev = pNextNode;
}
/* 連結リストサイズ設定 */
/******************************************************************************/
/**
- * @brief ã\83\8eã\83¼ã\83\89å\85\88é 挿入
- * @details 指定した連結リストの先頭に新しいノードを挿入する。
+ * @brief ã\83\8eã\83¼ã\83\89å\89\8d挿入
+ * @details 指定したノードの前に新しいノードを挿入する。
*
* @param[in] *pList 連結リスト
+ * @param[in] *pNode 挿入先ノード
* @param[in] *pNewNode 挿入ノード
*
* @retval MLIB_SUCCESS 正常終了
* @retval MLIB_FAILURE 異常終了
*/
/******************************************************************************/
-MLibRet_t MLibBasicListInsertHead( MLibBasicList_t *pList,
+MLibRet_t MLibBasicListInsertPrev( MLibBasicList_t *pList,
+ MLibBasicListNode_t *pNode,
MLibBasicListNode_t *pNewNode )
{
- MLibBasicListNode_t *pOldHead; /* 旧先頭ノード */
+ MLibBasicListNode_t *pPrevNode; /* 前ノード */
/* 初期化 */
- pOldHead = NULL;
+ pPrevNode = NULL;
/* 引数pListチェック */
if ( pList == NULL ) {
return MLIB_FAILURE;
}
+ /* 引数pNodeチェック */
+ if ( pNode == NULL ) {
+ /* 不正値 */
+
+ return MLIB_FAILURE;
+ }
+
/* 引数pNewNodeチェック */
if ( pNewNode == NULL ) {
/* 不正値 */
}
/* 連結リストサイズチェック */
- if ( pList->size == SIZE_MAX ) {
+ if ( ( pList->size == 0 ) || ( pList->size == SIZE_MAX ) ) {
/* サイズ不正 */
return MLIB_FAILURE;
}
- /* 旧先頭ノード取得 */
- pOldHead = pList->pHead;
+ /* 前ノード取得 */
+ pPrevNode = pNode->pPrev;
- /* 連結リスト先頭ノード設定 */
- pList->pHead = pNewNode;
+ /* 次ノード設定 */
+ pNode->pPrev = pNewNode;
/* 挿入ノード設定 */
- pNewNode->pNext = pOldHead;
- pNewNode->pPrev = NULL;
+ pNewNode->pNext = pNode;
+ pNewNode->pPrev = pPrevNode;
- /* 旧先頭ノード有無判定 */
- if ( pOldHead == NULL ) {
- /* 旧先頭ノード無 */
+ /* 前ノード有無判定 */
+ if ( pPrevNode == NULL ) {
+ /* 前ノード無 */
- /* 連結リスト最後尾ノード設定 */
- pList->pTail = pNewNode;
+ /* 連結リスト先頭ノード設定 */
+ pList->pHead = pNewNode;
} else {
- /* 旧先頭ノード有 */
+ /* 前ノード有 */
- /* 旧先頭ノード設定 */
- pOldHead->pPrev = pNewNode;
+ /* 前ノード設定 */
+ pPrevNode->pNext = pNewNode;
}
/* 連結リストサイズ設定 */