我已经用这种方式实现了这个功能:
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指针仍然存在于最后。 我需要一些关于此的建议。
编辑:有一些sugerence,p == 1的情况有他自己的循环,它的丑陋,但它的工作。答案 0 :(得分:1)
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;
}
答案 1 :(得分:1)
指针l在您的功能中未更改。您更改指针lAux但保持其原始值。
答案 2 :(得分:1)
通过模块化简化您的任务。首先有一个删除列表中所有元素的函数。
deleteList(List *&head) {
while (head) {
List *l = head->next;
delete head;
head = l;
}
}
注意*&amp; - 引用指针。因此,该函数修改了head参数。
然后有一个定位第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;
}
我正在为您的练习留下详细信息。