从链接列表中删除节点问题C.

时间:2015-01-31 09:29:09

标签: c linked-list

我只是试图从链接列表中删除一个节点,似乎遇到了麻烦。我想知道是否有人可以看看可能出错的地方?谢谢!

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;
}

2 个答案:

答案 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的算法被打破