字符串列表的C语言实现:c_strlist

前两天需要用到字符串数组,需要动态的增加和减少,类似于java里的ArrayList<String>提供的功能,但C里又没有现成的库和函数,所以就自己动手写了一个。

废话也不多说了,可能会有朋友需要,所以这里直接把代码贴出来:

#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_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)\n");

        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)\n");

        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; i<strlist->size; 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; i<strlist->size; i++){

        free(strlist->list[i]);

    }

    free(strlist->list);

    free(strlist);

    return 0;

}



/*

 * 打印字符串列表的相关信息

 */

void strlist_infolog(st_strlist *strlist)

{

    int i;

    printf("\n>>>\n");

    printf("strlist info:\n");

    printf("strlist size: %d\n", strlist->size);

    for(i=0; i<strlist->size; i++){

        printf("%d, %s\n",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("\nis strlist contians \"123\"?  %d\n",

           strlist_contains(strlist,(char*)"123"));



    printf("\nis strlist contians \"字符串列表测试\" ? %d\n",

           strlist_contains(strlist,(char*)"字符串列表测试"));



    strlist_removeLast(strlist);

    strlist_infolog(strlist);



    printf("\nis strlist contians \"字符串列表测试\" ? %d\n",

           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: 1

0, aaaa



>>>

strlist info:

strlist size: 2

0, aaaa

1, bbbb



>>>

strlist info:

strlist size: 3

0, aaaa

1, bbbb

2, 字符串列表测试



>>>

strlist info:

strlist size: 4

0, aaaa

1, bbbb

2, ccccc

3, 字符串列表测试



is strlist contians "123"?  0



is strlist contians "字符串列表测试" ? 1



>>>

strlist info:

strlist size: 3

0, aaaa

1, bbbb

2, ccccc



is strlist contians "字符串列表测试" ? 0



>>>

strlist info:

strlist size: 2

0, aaaa

1, ccccc



************************/

你可能感兴趣的:(list)