SeqList.h
#ifndef SEQ_LIST_H #define SEQ_LIST_H typedef void SeqListNode; typedef void SeqList; /* * 創建順序表 * @param capacity 順序表的最大容量 * @return 返回順序表的指針 */ SeqList* SeqList_Create(unsigned int capacity); /* * 銷燬順序表 * @param list 順序表的指針 */ void SeqList_Destroy(SeqList *list); /* * 清空順序表 * @param list 順序表的指針 */ void SeqList_Clear(SeqList *list); /* * 向順序表pos位置處插入元素 * @param list 順序表指針 * @param node 元素指針 * @param pos 插入的索引 */ int SeqList_Insert(SeqList *list,SeqListNode *node,int pos); /* * 獲取順序表中索引位置處的元素 * @param list 順序表指針 * @param pos 順序表索引值 * @param return 元素指針 */ SeqListNode* SeqList_Get(SeqList *list,int pos); /* * 刪除順序表中索引位置處的值 * @param list 順序表的指針 * @param pos 順序表索引 * @param return 非0表示刪除成功 */ int SeqList_Remove(SeqList *list,int pos); /* * 獲取順序表當前已存儲元素的個數 * @param list 順序表的指針 * @return 順序表中已存儲元素的個數 */ int SeqList_Length(SeqList *list); /* * 獲取順序表最大可存儲元素的個數 * @param list 順序表的指針 * @return 順序表最大可存儲元素的個數 */ int SeqList_Capacity(SeqList *list); #endif // SEQLIST_H
SeqList.c
#include "SeqList.h" #include <malloc.h> typedef unsigned int TSeqListNode; //順序表節點 typedef struct _SeqList { unsigned int length; //順序表已存儲元素的個數 unsigned int capacity; //順序表最大可存儲元素的個數 TSeqListNode *element[];//順序表節點柔性數組 }TSeqList; /* * 創建順序表 * @param capacity 順序表的最大容量 * @return 返回順序表的指針 */ SeqList* SeqList_Create(unsigned int capacity) { TSeqList *list = 0; //創建一個可容納SeqList結構體與柔性節點的空間 int size = sizeof(TSeqList) + sizeof(TSeqListNode) * capacity; list = (TSeqList *)malloc(size); if(list != 0) { list->length = 0; list->capacity = capacity; } return list; } /* * 銷燬順序表 * @param list 順序表的指針 */ void SeqList_Destroy(SeqList *list) { free(list); } /* * 清空順序表 * @param list 順序表的指針 */ void SeqList_Clear(SeqList *list) { TSeqList *s_list = (TSeqList *)list; if(s_list != 0) { s_list->length = 0; } } /* * 向順序表pos位置處插入元素 * @param list 順序表指針 * @param node 元素指針 * @param pos 插入的索引 * @param return 返回非0表示插入成功 */ int SeqList_Insert(SeqList *list,SeqListNode *node,int pos) { int i; //判斷順序表指針和被插入元素的指針是否爲空 int ret = ((list != 0) && (node != 0)); TSeqList *s_list = (TSeqList *)list; TSeqListNode *s_node = (TSeqListNode *)node; //判斷插入的索引是否合法,數組空間是否剩餘 ret = ((pos >= 0) && (pos <= s_list->length) && (s_list->length + 1 <= s_list->capacity)); if(ret) {//參數合法,可以插入 //從最後一個開始把數據往後挪 for(i = s_list->length;i > pos;i-- ) { s_list->element[i] = s_list->element[i -1]; } s_list->element[i] = s_node; s_list->length++; } return ret; } /* * 獲取順序表中索引位置處的元素 * @param list 順序表指針 * @param pos 順序表索引值 * @param return 元素指針 */ SeqListNode* SeqList_Get(SeqList *list,int pos) { SeqListNode *s_node = 0; TSeqList *s_list = (TSeqList *)list; if( (s_list != 0) && (pos >= 0) && (pos < s_list->length)) { s_node = s_list->element[pos]; } return s_node; } /* * 刪除順序表中索引位置處的值 * @param list 順序表的指針 * @param pos 順序表索引 * @param return 順序表中索引位置處元素的值 */ int SeqList_Remove(SeqList *list,int pos) { int i; TSeqList *s_list = (TSeqList *)list; int ret = ((s_list != 0) && (pos >= 0) && (pos < s_list->length)); if(ret) { for(i = pos + 1;i < s_list->length;i++) { s_list->element[i -1] = s_list->element[i]; } s_list->length--; } return ret; } /* * 獲取順序表當前已存儲元素的個數 * @param list 順序表的指針 * @return 順序表中已存儲元素的個數 */ int SeqList_Length(SeqList *list) { TSeqList *s_list = (TSeqList *)list; int ret = -1; if(s_list != 0) { ret = s_list->length; } return ret; } /* * 獲取順序表最大可存儲元素的個數 * @param list 順序表的指針 * @return 順序表最大可存儲元素的個數 */ int SeqList_Capacity(SeqList *list) { TSeqList *s_list = (TSeqList *)list; int ret = (s_list != 0); if(ret) { ret = s_list->capacity; } return ret; }