【发布时间】:2018-02-11 02:38:39
【问题描述】:
我在下面有一个双向链表。考虑两个函数some_function1 和some_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_funciton1和some_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