【问题标题】:Single Linked List in C (pointers, delete first, why do I have to keep the data separately?)C中的单链表(指针,先删除,为什么要单独保存数据?)
【发布时间】:2018-02-27 04:22:13
【问题描述】:
    boolean consume_first(struct list ** ptrptr, float * value){

    struct list * temp;
    if((*ptrptr) != NULL){
        *value = (*ptrptr)->data; //HERE
        temp = (*ptrptr);
        *ptrptr = (*ptrptr)->next;
        free(temp); //and HERE

        return TRUE;
    }else{
        return FALSE;
    }
}

这里(在代码中)

一旦我使用“免费”,数据也会擦除吗?

“程序”不是功能性的,我调用并传递参数的唯一目的是稍后“实现”它。

主要内容和其他内容:

struct list{
    float data;
    struct list * next;
};

void init(struct list**);
void visit(struct list*);
int get_value(float*);
void pre_insert(struct list**, float*);
boolean consume_first(struct list**, float*); //HERE
void suf_insert(struct list **, float*);

int main(){

    struct list * listA;
    struct list * listB;

    init(&listA);
    init(&listB);

    float * data = NULL;
    *data = get_value(data);

    pre_insert(&listA, data);
    pre_insert(&listB, data);

    visit(listA);
    visit(listB);

    consume_first(&listA, &listA->data); //HERE
    consume_first(&listB, &listB->data); //HERE

    suf_insert(&listA, data);
    suf_insert(&listB, data);



    return 0;
}

(抱歉英语不好,我尽力了)

【问题讨论】:

    标签: c list pointers linked-list


    【解决方案1】:
     free(temp);
    

    由于temp 指向*ptrptr,因此,上面将释放分配给*ptrptr 的内存。释放后使用*ptrptr访问数据是错误的。

    但它不会影响存储在*value 中的数据。

    *value = (*ptrptr)->data; 
    

    这在free 语句之前,并且数据也存储在指针value 指向的内存位置。它将保持有效并且可以使用。

    另外,注意这一点(也许你知道但是)-

    temp = (*ptrptr);
    *ptrptr = (*ptrptr)->next;       // *ptrptr points to next pointer in list now
    free(temp); 
    

    所以,你没有释放指针,其值存储在value,而是列表中的下一个指针。当您使 *ptrptr 指向下一个指针(或列表中的下一个节点)时。

    【讨论】:

    • 非常感谢!真的很快:)
    • @neilpare 很高兴它有帮助:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-30
    • 2012-10-06
    • 2013-08-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多