我只是试图从链接列表中删除一个节点,似乎遇到了麻烦。我想知道是否有人可以看看可能出错的地方?谢谢!
struct ets {
struct node *equip_head;
struct node *member_head;
struct node *loan_head;
const char *equip_fname;
const char *member_fname;
const char *loan_fname;
};
struct node {
void *data; /* Accepts all data, yay */
struct node *next;
};
BOOLEAN deleteMember(struct ets *ets, char MemberID[]) {
struct node *current = ets->member_head;
struct node *tmpNode = current;
struct member_data *member_data = NULL;
while (current != NULL) {
member_data = current->data;
if (strcmp(member_data->MemberID, MemberID) == 0) {
tmpNode = current;
current = current->next;
free(tmpNode->data);
free(tmpNode);
return TRUE;
}
current = current->next;
}
return FALSE;
}
答案 0 :(得分:1)
您没有从列表中删除节点。您可以执行此操作以从列表中删除节点:
BOOLEAN deleteMember(struct ets *ets, char MemberID[]) {
struct node *current = ets->member_head;
struct node *prev=NULL;
struct member_data *member_data = NULL;
while(current != NULL) {
member_data = current->data;
if(strcmp(member_data->MemberID, MemberID) == 0) {
if(prev==NULL) // removing 1st node
ets->member_head=current->next;
else
prev->next=current->next; // removing current node from list
free(current->data);
free(current);
return TRUE;
}
prev = current;
current = current->next;
}
return FALSE;
}
答案 1 :(得分:0)
由于您有一个链接列表,因此删除了algorythm。以下是您目前正在做的事情:
node-1 -> node -> node+1
node-1 -> unallocated node
而无法找到下一个节点您应该测试下一个节点是否具有正确的ID,以便具有以下内容:prev_node(current)
- > node_to_delete - > next_node`
然后你可以这样做:
tmpNode = current->next;
current->next = tmpNode->next; /* ok for the chaining */
free(tmpNode->data); /* deletion will be ok */
free(tmpNode);
当然对第一个和最后一个节点进行特殊管理......
编辑:阿里已经给出了答案。我留下这个作为评论为什么OP的算法被打破