以下代码段无效。
void deleteNode(list **start, int pos) {
int currentPosition=0;
list *currentNode;
list *nodToDelete;
currentNode = *start;
if (currentNode == NULL) {
printf("Empty List\n");
} else if (pos == 0 ) {
nodToDelete = *start;
*start = nodToDelete->next;
free(nodToDelete);
} else {
while (currentNode->next != NULL) {
if (currentPosition >= pos -1) {
break;
}
currentPosition++;
currentNode = currentNode->next;
}
if (currentPosition < pos -1 || currentNode->next == NULL) {
printf("No node at given position exists\n");
} else {
nodToDelete = currentNode->next;
currentNode = nodToDelete->next;
free(nodToDelete);
nodToDelete = NULL;
}
}
}
void displayList(list *node) {
if (node == NULL) {
printf("Empty List");
}
while (node != NULL) {
printf("%d\t", node->data);
node = node->next;
}
printf("\n");
}
int main()
{
list *start, *node;
start = NULL;
insertNode(&start, 2);
insertNode(&start, 3);
insertNode(&start, 4);
insertNode(&start, 1);
insertNode(&start, 5);
deleteNode(&start, 3);
displayList(start);
}
执行时输出
删除前2 3 4 1 5
删除后2 3 4 0 5
它应该删除1但它在其位置插入0。
答案 0 :(得分:2)
这可能有用 - 取代
currentNode = nodToDelete->next;
与
currentNode->next = nodToDelete->next;
你基本上需要nodetodelete之前的节点让它的下一个节点指向nodetodelete用来指向的节点
答案 1 :(得分:1)
找到要从列表中取出的节点后,您需要实际将其取出。 =)
...
nodToDelete = currentNode->next;
currentNode->next = nodToDelete->next;
free(nodToDelete);
...
答案 2 :(得分:1)
除了currentNode->next = nodToDelete->next;
的问题和负面立场之外,你正在混合你的ui和你的逻辑。你应该尽可能地将两者分开。
向ui发送内容是报告进度的一种方式; ui是命令行,浏览器还是扬声器。在deleteNode中,空列表或超出界限的位置不是进度。顺序两者都与成功相同 - 你完成了。如果你想要报告失败,应该在可以导致单独序列的地方进行,即调用者。此外,通过混合使用ui,您会引入不必要的依赖和失败(如果printf中存在错误,那么当您不需要时,您的函数将崩溃)。如果你的函数返回一个定义的结果,调用者可以决定是否/如何报告该结果,包括成功(你的函数当前没有这样做,并且调用者无法分辨成功或失败)。 / p>