c++ 从给定位置开始从简单链表中删除元素

ldfqzlk8  于 2023-05-24  发布在  其他
关注(0)|答案(3)|浏览(136)

我是这样实现这个函数的:

typedef node* List;
void DeleteFromPos(List &l, unsigned int p) {
    List lAux = l;
    unsigned int count = 1;

    while (lAux) {      
        if (p == 1) {
            while (l) {
                List del = lAux;
                lAux = lAux->next;
                delete del;
                del = NULL;
            }
            lAux = NULL;
        } else if (count < p-1) {
                lAux = lAux->next;
                count++;
        } else {
            List del = lAux->next;
            if (del) {
                lAux->next = del->next;
                delete del;
                del = NULL;
            } else
                lAux = NULL;
        }
    }
}

问题是当p==1时,在这种特殊情况下,所有的元素都被删除了,但看起来l指针仍然存在于末尾。我需要一些关于这方面的建议。
编辑:有一些建议,p ==1的情况下有自己的循环,它的丑陋,但它的工作。

f0ofjuux

f0ofjuux1#

通过模块化简化您的任务。首先有一个删除列表中所有元素的函数。

deleteList(List *&head) {
   while (head) {
      List *l = head->next;
      delete head;
      head = l;
   }
}

注解 *& -指向指针的引用。因此,函数修改头部参数。
然后有一个定位第n个元素的函数。当你有第n个节点时调用上面的函数。
如果你真的需要在一个单一的函数中完成这项工作,那么可以这样做:

deleteFromPosition(List *&head, unsigned int pos) {
  loop one: iterate through the list until n-th node is reached;
  loop two: iterate through the list tail deleting nodes as in the function above;
}

我把细节留到你练习的时候再说。

eqqqjvef

eqqqjvef2#

void DeleteFromPos(List &l, unsigned int p)

我相信你通过引用传递了一个指向node的指针,这样如果你的列表的头部要被删除,你可以更新指针本身,这样调用者就可以看到这个变化。但你却做到了:

List lAux = l;

这就抛弃了这种潜力。如果p等于1,你应该这样做:

if (p == 1) {
    List del = l;
    l = l->next;   // <-- updates pointer that was passed by reference
    delete del;
}
zy1mlcev

zy1mlcev3#

指针l在你的函数中没有改变。你改变了指针1Aux,但l保持其原始值。

相关问题