设为首页 加入收藏

TOP

字符串动态数组的C实现方法(二)
2015-07-16 12:04:03 来源: 作者: 【 】 浏览:133
Tags:字符串 动态 实现 方法
gDeleteOne(pArr, "jp"); // ========== modify ================== ret = StringModify(pArr, "123", "asldf"); ret = StringModify(pArr, "zhyh2010", "zhyh2010@ustc"); // =========== insert ================ ret = StringInsertByID(pArr, "love", 10); ret = StringInsertByStr(pArr, "ho", "china"); ret = StringInsertByStr(pArr, "hi12", "china"); ret = StringInsertByStr(pArr, "ho2", "china"); ret = StringInsertByStr(pArr, "h3i", "china"); ret = StringInsertByStr(pArr, "h2o", "china"); // =========== sort ======================= ret = StringSort(pArr, 0); // ========== destroy ================= StringDestroy(pArr); } // ====================== add ======================== int StringAddOne(StringArr * arr, const char * source) { if (arr == NULL || source == NULL) return INPUT_ERROR; // alloc memory if (arr->capacity <= arr->length) { if (arr->pHead == NULL) { // alloc space when phead == NULL pStringNode pNode = (pStringNode)malloc(sizeof(StringNode)); if (pNode == NULL) return MALLOC_ERROR; arr->pHead = pNode; arr->capacity += 1; } else { // realloc space pStringNode pNode = (pStringNode)realloc(arr->pHead, sizeof(StringNode)* 2 * arr->capacity); if (pNode == NULL) return MALLOC_ERROR; arr->pHead = pNode; arr->capacity = 2 * arr->capacity; } } int source_len = strlen(source); char * tmp = (char *)malloc(sizeof(char)* (source_len + 1)); if (tmp == NULL) return MALLOC_ERROR; //pStringNode pNode = arr->pHead + arr->length; // c2275 C不允许在中途声明变量 //StringNode * pNode = &(arr->pHead)[arr->length]; arr->pHead[arr->length].length = source_len + 1; arr->pHead[arr->length].pStr = tmp; strcpy(arr->pHead[arr->length].pStr, source); arr->length += 1; return SUCCESS; } // ====================== delete ======================= int StringDeleteOne(StringArr * arr, const char * target) { pStringNode pres = (pStringNode)NOT_FIND; if (arr == NULL || target == NULL) return INPUT_ERROR; pres = StringSearchFirst(arr, target); if (pres == (pStringNode)NOT_FIND) return (int)NOT_FIND; free(pres->pStr); for (; pres != arr->pHead + arr->length - 1; pres++) *pres = *(pres + 1); pres->length = 0; pres->pStr = NULL; arr->length -= 1; return SUCCESS; } // ====================== search ======================= pStringNode StringSearchFirst(StringArr * arr, const char * target) { pStringNode pres = (pStringNode)NOT_FIND; if (arr == NULL || target == NULL) return (pStringNode)INPUT_ERROR; //pStringNode pres = NOT_FIND; for (int i = 0; i != arr->length; i++) { if (strcmp(target, arr->pHead[i].pStr) == 0) { pres = &arr->pHead[i]; break; } } return pres; } // ====================== insert ======================= int StringInsertOneByPointer(StringArr * arr, const char * target, pStringNode pos) { char * tmp = NULL; pStringNode pOld = NOT_FIND; if (arr == NULL || target == NULL || pos == NULL) return INPUT_ERROR; //assert(arr->capacity == 0); assert(arr->capacity > 0); if (arr->capacity <= arr->length) { pOld = arr->pHead; arr->pHead = (pStringNode)realloc(arr->pHead, sizeof(StringNode)* 2 * arr->capacity); arr->capacity = 2 * arr->capacity; // 修正边界 pos += arr->pHead - pOld; } // 在指针指向的位置处插入 (前叉) tmp = (char *)malloc(sizeof(char)* (strlen(target) + 1)); if (tmp == NULL) return MALLOC_ERROR; for (pStringNode pres = arr->pHead + arr->length - 1; pres != pos - 1; pres--) *(pres + 1) = *pres; pos->pStr = tmp; strcpy(pos->pStr, target); pos->length = strlen(target) + 1; arr->length += 1; return SUCCESS; } int StringInsertByStr(StringArr * arr, const char * target, c
首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇C语言----多维数组 下一篇C语言----内存区划分

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: