尝试删除头部时删除第N个节点中断

时间:2016-03-10 06:52:25

标签: c linked-list

我正在尝试删除第N个位置的节点。出于某种原因,当尝试移除头部时,函数会在previous->next = current->next处出错。我已经尝试添加条件来检查是否previous->next != NULL,但这不起作用。任何人都可以暗示我做错了什么以及如何解决这个问题?感谢。

void removeNth(List** myList, int n) {
    Node* previous;
    Node* current;
    int count;

    if (getLength(*myList) >= n) {
        if (getLength(*myList) == n) {
            removeLast(myList);
        }
        else {
            previous = NULL;
            current = *myList;
            count = 1;

            while (count < n) {
                previous = current;
                current = current->next;
                count++;
            }

            previous->next = current->next;
            freeNode(current);
        }
    }
}

2 个答案:

答案 0 :(得分:0)

这可能会有所帮助。

void removeNth(List ** myList,int n) {

Node* previous;

Node* current;
int count;

if(n==1 && getLength(*myList)>=1) // This small change for deletion at beginning
{
   *myList=(*myList)->next;
   return;
}
else if (getLength(*myList) >= n)
{
    if (getLength(*myList) == n) {
        removeLast(myList);
    }
    else {
        previous = NULL;
        current = *myList;
        count = 1;

        while (count < n) {
            previous = current;
            current = current->next;
            count++;
        }

        previous->next = current->next;
        freeNode(current);
    }
}

}

答案 1 :(得分:0)

从我看到的所有内容来看,List只是Node的别名。鉴于此,您有一个似乎是单向前链接的列表,并且给定一个头指针和一个计数n,想要删除基于1的位置节点(如果它存在)。

任务

指向头指针并实现它所拥有的指针(一个指针的地址)是使这个算法比你做得更简单的原因。最初它保存指向列表中第一个节点的指针的地址(如果列表为空,则为NULL)。从那里你需要沿着列表向下走,将next指针的地址存储在你所采用的每一跳的当前节点中。当你到达你的计数器限制时,如果它仍然指向列表中某些next的指针,那么该指针指向你的受害节点(可能是头节点,但是它没有真的很重要)。您只需将该指针连接到以下节点,然后删除现在的孤立项。

守则

我删除了List别名,因为我真的认为没有任何意义。如果您使用包含Listhead指针的tail结构来获得更快的结尾插入,那么它会更有意义,但我看到您的任何代码中都没有这样的提示是这样的。事实上,除非current = *myList;List是同义词,否则Node根本不起作用。

void removeNth(Node** pp, unsigned int n)
{
    // we're 1-based positioned, so leave early on a value of zero.
    //  for 0-based positioning delete these two lines.
    if (n-- == 0)
        return;

    // walk the list until (a) we run out of nodes, or (b) meet our count.
    while (*pp && n--)
        pp = &(*pp)->next; // save address of current node's next ptr

    // if this is still non-null, it means we have a prospect to free
    if (*pp)
    {
        Node *node = *pp;   // remember node we're about to orphan
        *pp = node->next;   // wire up next node to where that came from
        freeNode(node);     // now free the orphaned node
    }
}

强烈建议您仔细阅读并在调试器下运行,逐步检查变量(及其地址),以便更好地了解它的工作原理。