字串列表的C語言實現:c_strlist

來源:互聯網
上載者:User

前兩天需要用到字串數組,需要動態增加和減少,類似於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: 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************************/

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.