/*
C语言基本库实现的一组字符串链表。
可以:动态的增加和减少,查找,对比,字符串数组。类似于java里的ArrayList
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef struct{ unsigned int size; //子字符串数量 char **list; //用字符串数组来存放字符串列表}st_strlist;/* * 初始化一个字符串列表 * 注意:strlist_malloc() 和 strlist_free(st_strlist*) 要配对使用 */st_strlist* strlist_malloc(){ st_strlist *strlist = (st_strlist*)malloc(sizeof(st_strlist)); memset(strlist, 0, sizeof(st_strlist)); return strlist;}
/*
* 获取strlist内字符串数量。
*/
int strlist_count(st_strlist *strlist)
{
if(!strlist){
return -1;
}else
return strlist->size;
}
/* * 在strlist列表的末端增加一个字符串 */int strlist_add(st_strlist *strlist, char *str){ int len = strlen(str); strlist->size++; strlist->list = (char**)realloc(strlist->list, sizeof(char*) * strlist->size); if(strlist->list == NULL){ /* out of memory! */ printf("error: not enough memory (realloc returned NULL)
"); return -1; } strlist->list[strlist->size-1]=(char*)malloc(len+1); memcpy(strlist->list[strlist->size-1], str, len); (strlist->list[strlist->size-1])[len]=0; return strlist->size;}/* * 在字符串列表的index序号后插入str字符串 */int strlist_insertAfter(st_strlist *strlist, char* str, unsigned int index){ int i, len; if(index >= strlist->size){ return -1; } len = strlen(str); strlist->size++; strlist->list = (char**)realloc(strlist->list, sizeof(char*) * strlist->size); if(strlist->list == NULL){ /* out of memory! */ printf("error: not enough memory (realloc returned NULL)
"); return -1; } for(i= strlist->size-1; i>index+1; i--){ strlist->list[i] = strlist->list[i-1]; } strlist->list[index+1] = (char*)malloc(len+1); memcpy(strlist->list[index+1], str, len); strlist->list[index+1][len]=0; return 0;}/* * 删除字符串列表strlist末端的字符串 */int strlist_removeLast(st_strlist *strlist){ if(strlist->size <=0){ return -1; } free(strlist->list[strlist->size-1]); strlist->size--; return strlist->size;}/* * 删除字符串列表index位置处的字符串 */int strlist_removeAt(st_strlist *strlist, unsigned int index){ int i; if(index >= strlist->size){ return -1; } free(strlist->list[index]); for(i=index; i< strlist->size-1; i++){ strlist->list[i] = strlist->list[i+1]; } strlist->size--; return strlist->size;}/* * 获取strlist中index处的字符串。 */char* strlist_getStrAt(st_strlist *strlist, unsigned int index){ if(strlist==NULL || index>=strlist->size){ return NULL; } return strlist->list[index];}/* * 判断字符串列表strlist内是否包含了字符串str。 */int strlist_contains(st_strlist *strlist, char* str){ int i; for(i=0; isize; i++){ if(0 == (strcmp(strlist->list[i], str))){ return 1; } } return 0;}/* * 释放字符串列表占用的内存空间 */int strlist_free(st_strlist *strlist){ int i; if(!strlist){ return -1; } for(i=0; isize; i++){ free(strlist->list[i]); } free(strlist->list); free(strlist); return 0;}/* * 打印字符串列表的相关信息 */void strlist_infolog(st_strlist *strlist){ int i; printf("
>>>
"); printf("strlist info:
"); printf("strlist size: %d
", strlist->size); for(i=0; isize; i++){ printf("%d, %s
",i, strlist->list[i]); }}int main(int argc, char *argv[]){ printf("hello c_strlist!"); st_strlist *strlist = strlist_malloc(); strlist_infolog(strlist); strlist_add(strlist,(char*)"aaaa"); strlist_infolog(strlist); strlist_add(strlist,(char*)"bbbb"); strlist_infolog(strlist); strlist_add(strlist,(char*)"字符串列表测试"); strlist_infolog(strlist); strlist_insertAfter(strlist, (char*)"ccccc", 1); strlist_infolog(strlist); printf("
is strlist contians "123"? %d
", strlist_contains(strlist,(char*)"123")); printf("
is strlist contians "字符串列表测试" ? %d
", strlist_contains(strlist,(char*)"字符串列表测试")); strlist_removeLast(strlist); strlist_infolog(strlist); printf("
is strlist contians "字符串列表测试" ? %d
", strlist_contains(strlist,(char*)"字符串列表测试")); strlist_removeAt(strlist,1); strlist_infolog(strlist); strlist_free(strlist); return 0;}/*************************** 输出结果:hello c_strlist!>>>strlist info:strlist size: 0>>>strlist info:strlist size: 10, aaaa>>>strlist info:strlist size: 20, aaaa1, bbbb>>>strlist info:strlist size: 30, aaaa1, bbbb2, 字符串列表测试>>>strlist info:strlist size: 40, aaaa1, bbbb2, ccccc3, 字符串列表测试is strlist contians "123"? 0is strlist contians "字符串列表测试" ? 1>>>strlist info:strlist size: 30, aaaa1, bbbb2, cccccis strlist contians "字符串列表测试" ? 0>>>strlist info:strlist size: 20, aaaa1, ccccc************************/