我有一个节点结构的链表,在我的函数中搜索列表以查找具有匹配id的节点,if语句在比较他传入id和节点id时似乎失败了。 if语句位于下面函数的第6行。即使* node_id *和 id 都具有相同的值,它也会失败。
NODE *node_id_search(int id, NODE *start) {
NODE *result = NULL, *current = start;
do {
if(current->node_id == id) {
result == current;
}
current = current->next;
} while(current->next != NULL && result == NULL);
return result;
}
node.h
typedef struct node {
/*@{*/
/**
* The node id used to identify the node. The id is a positive integer.
*/
int node_id;
/**
* The node type.
*/
char node_type[10];
/**
* Pointer to the next node element.
*/
struct node *next;
/*@}*/
} NODE;
答案 0 :(得分:2)
除了上面提到的答案(我没看到它们与问题的关系),我看到的唯一问题是这段代码:
if(current->node_id == id) {
result == current; //which should be result = current;
}
将其更改为:
if(current->node_id == id){
result = current;
return result; // no need to search any further(hence optimized).
}
除此之外,我认为您的代码没有任何问题。
答案 1 :(得分:0)
另一个问题是你不检查start是否为null因此current-> node_id == id会导致分段错误,尝试类似:
while(current)
{
if(current->node_id == id)
{
result = current;
break; // getting out of the cycle.
}
current = current->next;
}
要将值赋予您使用'='的变量,'=='用于比较变量。因此:
result = current;
而不是结果==当前;
答案 2 :(得分:0)
您的代码过于复杂。它可以简化为:
NODE *node_id_search(int id, NODE *ptr) {
for( ; ptr; ptr = ptr->next) {
if(ptr->node_id == id) return ptr;
}
return NULL;
}
顺便说一句:上面的代码片段会返回链中的第一个匹配节点,其中原始节点返回最后一个节点。
另外:如果指针参数(原始文件中的“start”)为NULL,原始文件将取消引用NULL指针并崩溃(或返回废话)。带有for(;;)循环的这个版本只会返回NULL。
答案 3 :(得分:0)
要在块中注明2点
if(current->node_id == id) {
result == current;
}
您没有检查current
是否为NULL
。如果node_id
等于id
的任何节点不存在,最终您将到达列表的末尾(next
为NULL
)并尝试评估{{ 1}}和崩溃。在此块之前加上NULL->next
以查看会发生什么。
您已撰写printf()
,但result == current
无效。它只是检查平等,result
永远保持不变。它应该是result
,它会将result = current
的值分配给current
。