2017-10-18 107 views
-2

我在代码中不断收到段错误,但我不知道为什么。 int n是我将要删除的节点。所以listDeleteNth(new, 2)会删除序列中的3。删除链接列表中的某个节点C编程

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 
    } 
} 
+0

读https://ericlippert.com/2014/03/05/how-to-debug -small-programs/ –

+2

假设列表中只有一个节点。然后这保证失败(提示:如果'current-> next'是'NULL','current-> next-> next'怎么可能工作?) –

+0

你在代码中有几个问题,'i'参数需要要增加,你需要考虑接下来的4个场景:空列表,1个节点列表,要删除的节点是最后一个节点,要删除的节点不是第一个,也不是最后一个 –

回答

0

首先,in既不在循环被更新,所以它会继续移动到下一个节点并因此结束分段故障。

您可以尝试到原来的循环变化:

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

以下几点:

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

这不是唯一的问题其代码 –

+0

是的,需要考虑一些边缘情况,而我只是简单地指出主要问题 – Jerry