删除链表C编程中的某个节点

删除链表C编程中的某个节点,c,list,linked-list,segmentation-fault,C,List,Linked List,Segmentation Fault,我的代码中不断出现分段错误,但我不知道为什么int n是我将删除的节点。因此listDeleteNth(new,2)将删除序列中的3 1->2->3->4 1->2->4 typedef struct _node *Node; typedef struct _list *List; typedef struct _list { Node head; } list; typedef struct _node { int value; Node next

我的代码中不断出现分段错误,但我不知道为什么
int n
是我将删除的节点。因此
listDeleteNth(new,2)
将删除序列中的3

1->2->3->4

1->2->4

typedef struct _node *Node;    
typedef struct _list *List;    

typedef struct _list {
    Node head; 
} list;

typedef struct _node {
    int value;
    Node next;  
} node;

void listDeleteNth (List l, int n) {
    Node current = l->head;

    int i = 0;
    while (i < n-1) {
        current = current->next;    //node before deleted node.
    }
    Node temp = current->next;      //make temp the one to be deleted.

    if (current->next->next == NULL) {
        printf("you deleted the last node!\n"); //check if dlting lastnode
    } else {
        current->next = current->next->next;    //connect prev to after
    }
}
typedef结构节点*node;
类型定义结构列表*列表;
类型定义结构列表{
节点头;
}名单;
类型定义结构节点{
int值;
节点下一步;
}节点;
void listDeleteNth(列表l,int n){
节点电流=l->head;
int i=0;
而(i下一步;//删除节点之前的节点。
}
Node temp=current->next;//使temp成为要删除的节点。
如果(当前->下一步->下一步==NULL){
printf(“您删除了最后一个节点!\n”);//检查是否删除了最后一个节点
}否则{
当前->下一个=当前->下一个->下一个;//将上一个连接到后一个
}
}

首先,
i
n
在循环中都不更新,因此它将继续移动到下一个节点,从而导致分段错误

您可以尝试更改原始循环:

while (i < n-1) {
    current = current->next;    //node before deleted node.
}
while(i下一步;//删除节点之前的节点。
}
对下列事项:

while (i < n-1) {
    current = current->next;    //node before deleted node.
    i++;
}
while(i下一步;//删除节点之前的节点。
i++;
}

阅读假设列表中只有一个节点。那么这肯定会失败(提示:如果
current->next->next
NULL
,那么
current->next
怎么可能工作?)您的代码中有几个问题,
i
参数需要递增,您需要考虑接下来的4种情况:空列表,1个节点列表,要删除的节点是最后一个,要删除的节点不是第一个也不是最后一个是的,一些边缘情况也需要考虑,而我只是简单地指出主要问题