b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

c 链表的定义和使用 cjson 源码阅读笔记(5)

电脑杂谈  发布时间:2017-12-31 09:23:46  来源:网络整理

// 节点从双向链表中删除即可
cJSON *cJSON_DetachItemFromArray(cJSON *array,int which) {
    cJSON *c=array->child;
    while (c && which>0) c=c->next,which--;
    if (!c) return 0;
    if (c->prev) c->prev->next=c->next;
    if (c->next) c->next->prev=c->prev;
    if (c==array->child) array->child=c->next;
    c->prev=c->next=0;
    return c;
}
cJSON *cJSON_DetachItemFromObject(cJSON *object,const char *string) {
    int i=0;
    cJSON *c=object->child;
    while (c && cJSON_strcasecmp(c->string,string)) i++,c=c->next;
    if (c) return cJSON_DetachItemFromArray(object,i);
    return 0;
}

对于一般类型的item, 我们直接就得到对应的节点.

但是对于 array 和 object , 我们需要查找对应的节点, 所以就需要去查找了。

这个查找算法由 cjson 的储存节点方式决定着。

由于cjson 采用链表储存了, 所以查找当时只能是暴力遍历了。

cJSON *cJSON_GetArrayItem(cJSON *array,int item) {
    cJSON *c=array->child;
    while (c && item>0) item--,c=c->next;
    return c;
}
cJSON *cJSON_GetObjectItem(cJSON *object,const char *string) {
    cJSON *c=object->child;
    while (c && cJSON_strcasecmp(c->string,string)) c=c->next;
    return c;
}

我们查找到对应的节点了,就可以对节点进行简单的修改了。

什么是简单的修改呢?

节点的类型不是 array 和 object 都可以算是简单类型,可以直接修改修改其值即可。

但是对于 array 和 object, 我们想给他赋值的话,涉及到释放就得内存这个问题。

c 链表的定义和使用_c  如何使用单向链表_链表作用

下面我们来看看 cjson 的实现代码。

/* Replace array/object items with new ones. */
void   cJSON_ReplaceItemInArray(cJSON *array,int which,cJSON *newitem) {
    cJSON *c=array->child;
    while (c && which>0) c=c->next,which--;
    if (!c) return;
    newitem->next=c->next;
    newitem->prev=c->prev;
    if (newitem->next) newitem->next->prev=newitem;
    if (c==array->child) array->child=newitem;
    else newitem->prev->next=newitem;
    c->next=c->prev=0;
    cJSON_Delete(c);
}
void   cJSON_ReplaceItemInObject(cJSON *object,const char *string,cJSON *newitem) {
    int i=0;
    cJSON *c=object->child;
    while(c && cJSON_strcasecmp(c->string,string))i++,c=c->next;
    if(c) {
        newitem->string=cJSON_strdup(string);
        cJSON_ReplaceItemInArray(object,i,newitem);
    }
}


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-57098-5.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    热点图片
    拼命载入中...