【问题标题】:How to perform operation on last node returned by some function?如何对某个函数返回的最后一个节点执行操作?
【发布时间】:2018-02-11 02:38:39
【问题描述】:

我在下面有一个双向链表。考虑两个函数some_function1some_function2。它们都返回指向某个节点的指针。现在,还有另一个函数do_something,它要么做一些事情(if some_condition = 1),要么什么都不做(if some_condition = 0)。如果some_condition = 1,那么我希望它对some_function1 some_function2返回的最后一个节点进行一些操作,以主函数最后一次调用的为准.如何做到这一点?谢谢

编辑:我真正想做的是删除 some_function1 或 some_function2 返回的最后一个节点。

typedef struct Node {

    int item; 
    struct Node *next; 
    struct Node *prev; 

} Node;

typedef struct List {

    Node *current_node;  

} List;



int some_condition = 0; 



int some_function1(List L){
    if (something){
        //do stuff
        some_condition = 1; 
    }
    else{
        //do stuff
        some_condition = 0; 
    }

    return *pointer to some node
}

int some_function2(List L){
    if(something){
        //do stuff
        some_condition = 1;
    }
    else{
        //do stuff
        some_condition = 0; 
    }

    return *pointer to some node 
}

//returns 1 or 0 based on success
int do_something(List L){
    if(some_condition == 1){
        //HERE, I WANT TO DO SOMETHING ON THE NODE THAT WAS LAST RETURNED BY EITHER some_function1 OR some_function2 
        return 1; 

    }
    else{
        return 0; 
    }
    some_condition = 0; 
}

【问题讨论】:

  • 我猜你可以将指向节点L 的指针存储为全局,然后每次完成some_function1()some_function2() 时都可以更新它
  • 从提供的信息中无法真正回答。如果所有三个例程都由同一个函数调用,我将存储一个指向最近返回的节点的指针,并将其作为参数传递给 do_something()。如果这些真的是三个完全独立且不相关的例程,那么对我来说,这是糟糕的设计。让一个例程知道另外两个不相关的例程在做什么将是脆弱的,并且难以扩展和维护。
  • 嗨@Jabberwock,我真正想做的是删除 some_function1 或 some_function2 返回的最后一个节点。
  • @novice - 为什么不在some_funciton1some_funciton2 中添加typedef struct List { ...; Node *last_returned; } List; 并更新L->last_returned;。 (注意: 这假定您会将 List *L 作为参数传递给每个函数——无论如何您都应该这样做......)
  • 感觉越来越像do_something应该把要删除的节点作为参数。我的猜测是,某个函数已经从各种来源(func1 和 func2)收集了信息,并决定通过调用 do_something() 对其中一个进行操作,这将采取所有必需的操作,然后删除节点。如果这是正确的,它肯定应该接收节点作为参数——它对正在发生的事情的了解越少,错误就越少,它的可移植性就越高。我还考虑将删除的责任转移给调用者,所以它只做一件事

标签: c linked-list doubly-linked-list


【解决方案1】:

如果我的理解正确,您希望do_something 函数使用some_function1some_function2 这两个函数返回的最近使用 节点执行操作。

您可以使用具有模块范围的static 指针来实现此目的,以缓存一个值:

static struct Node * MRU_node;

int some_function1(List L){
    if (something){
        //do stuff
        some_condition = 1; 
    }
    else{
        //do stuff
        some_condition = 0; 
    }

    MRU_node = *pointer to some node    // HERE
    return MRU_node;
}

然后在do_something函数中添加代码来引用这个缓存:

//returns 1 or 0 based on success
int do_something(List L){
    if (some_condition == 1){
        ... MRU_node ... ; // reference the cached pointer
        return 1; 

    }
    else{
        return 0; 
    }
    some_condition = 0; 
}

【讨论】:

  • 嗨,奥斯汀!感谢您的回答。我对静态指针并不完全熟悉。我真正想做的是删除 some_function1 或 some_function2 返回的最后一个节点。有没有更简单的方法来实现这一点?
  • 我开始怀疑您确实应该在更高级别缓存返回的指针,并在准备好时对其调用 delete。
  • 是的,有人建议在结构列表中添加一个指向返回节点的指针。效果很好!感谢您的帮助:)
猜你喜欢
  • 2019-06-11
  • 1970-01-01
  • 1970-01-01
  • 2014-10-16
  • 2021-01-07
  • 2013-12-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多