【问题标题】:Deleting a certain node in a linked list C programming删除链表中的某个节点C编程
【发布时间】:2017-10-18 01:26:02
【问题描述】:

我的代码中不断出现分段错误,但我不知道为什么。 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
    }
}

【问题讨论】:

  • 假设您的列表中只有一个节点。那么这肯定会失败(提示:如果current-&gt;nextNULLcurrent-&gt;next-&gt;next 怎么可能工作?)
  • 你的代码有几个问题,i参数需要自增,你需要考虑接下来的4个场景:空列表,1个节点列表,要删除的节点是最后一个一、要删除的节点不是第一个也不是最后一个

标签: c list linked-list segmentation-fault


【解决方案1】:

首先,in 都没有在循环中更新,所以它会继续移动到下一个节点,从而导致分段错误。

你可以尝试改变原来的循环:

while (i < n-1) {
    current = current->next;    //node before deleted node.
}

到以下:

while (i < n-1) {
    current = current->next;    //node before deleted node.
    i++;
}

【讨论】:

  • 是的,一些边缘情况也需要考虑,而我只是简单地指出主要问题
猜你喜欢
  • 1970-01-01
  • 2016-01-02
  • 2016-03-02
  • 1970-01-01
  • 2019-05-10
  • 2021-07-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多