C 单链表-从中间删除

C 单链表-从中间删除,c,list,hyperlink,C,List,Hyperlink,我正试图找出一种从链表中间删除的算法 我的想法是遍历列表,找到要删除的节点之前的节点,将其称为Nprev,并将Nprev设置为Nnext,其中Nnext位于要删除的节点Ndelete之后 所以Nprev->Ndelte->Nnext 我的问题是,我不知道如何遍历此列表以找到我想要的节点之前的节点 我一直在对seg故障执行此操作,因为我分配的指针超出了我假设的范围。 这是一个非常混乱的算法,我有很多if-else语句 有没有更简单的方法 基本上我需要遍历列表,对每个节点应用一个函数来测试 这是真是

我正试图找出一种从链表中间删除的算法

我的想法是遍历列表,找到要删除的节点之前的节点,将其称为Nprev,并将Nprev设置为Nnext,其中Nnext位于要删除的节点Ndelete之后

所以
Nprev->Ndelte->Nnext

我的问题是,我不知道如何遍历此列表以找到我想要的节点之前的节点

我一直在对seg故障执行此操作,因为我分配的指针超出了我假设的范围。 这是一个非常混乱的算法,我有很多if-else语句

有没有更简单的方法

基本上我需要遍历列表,对每个节点应用一个函数来测试 这是真是假。如果为false,则删除节点。 删除“第一个”和“最后一个”并没有那么难,但“中间”让我很难堪

请让我知道是否有一些通用的方法来解决这个问题。我已经 我一直在网上搜索,没有找到我需要的东西

我用了这个:

但是步骤4之前的算法只删除列表中的第一个节点 再也做不到了。 我如何修改这个


他们也给出了一个递归示例,但我不理解它,并且被它吓坏了。

首先需要找到中间节点。 快,慢,上三分 以两倍于慢速的速度快速移动,并以慢速的前一个节点的地址存储prev。 即
*slow=&head,*fast=&head,prev=Null
遍历列表,并在
fast=NULL
如果元素数为奇数,则slow将指向中间节点,prev将存储中间节点上一个节点的地址。 这么简单
prev->next=slow->next

这里是我用来按索引搜索和删除的示例:

给定此结构:(也可以调整为其他自引用结构)

使用此从列表“中间”的某个位置删除项目(按索引)

int-remove\u by\u索引(节点**head,int-n)///已测试,有效
{
int i=0;
int-retval=-1;
节点*当前=*头部;
NODE*temp_NODE=NULL;
如果(n==0){
返回弹孔(头部);
}
对于(int i=0;iptr==NULL){
返回-1;
}
当前=当前->ptr;
}
临时节点=当前->ptr;
retval=temp_node->num;
当前->ptr=临时节点->ptr;
空闲(临时节点);
返回返回;
}

我建议您在同一页上查看迭代示例。也许你会认为这更简单?
struct node
{
    S s;
    int num;
    char string[10];
    struct node *ptr;
};
typedef struct node NODE;
int remove_by_index(NODE **head, int n) /// tested, works 
{
    int i = 0;
    int retval = -1;
    NODE * current = *head;
    NODE * temp_node = NULL;

    if (n == 0) {
        return pop(head);
    }

    for (int i = 0; i < n-1; i++) {
        if (current->ptr == NULL) {
            return -1;
        }
        current = current->ptr;
    }

    temp_node = current->ptr;
    retval = temp_node->num;
    current->ptr = temp_node->ptr;
    free(temp_node);

    return retval;

}