链表删除功能

时间:2011-06-18 03:56:06

标签: c

以下代码段无效。

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。

3 个答案:

答案 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>