我成功實作了一個功能,但有一個小錯誤我無法弄清楚。函式 filter() 接受一個串列。期望將值以下的所有元素放入一個新串列中。
LIST *filter(LIST *lst, int value) {
LIST *new_list = createlist();
NODE *p = lst->front;
NODE *p1 = NULL;
NODE *p2 = NULL;
while (p != NULL) {
if (p->val <= value) {
if (lengthlist(new_list) == 0) {
new_list->front = newd_list->back = p;
p1 = new_list->back;
} else {
new_list->back = p;
p1->next = p;
p1 = new_list->back;
}
} else {
if (lst->front->val <= value) {
lst->front = lst->back = p;
p2 = lst->back;
} else {
lst->back = p;
p2->next = p;
p2 = lst->back;
}
}
p = p->next;
}
return new_list;
}
uj5u.com熱心網友回復:
next任一“新”串列的后節點成員并不總是設定為 NULL,而是仍指向舊節點。
在[4, 9, 2, 4, 8, 12, 7, 3]成為[9, 8, 12, 7, 3],[4, 2, 4, 3]我們可以看到應該是第一個串列的最后一個節點7,,仍然指向它的舊next成員,3。
發生這種情況是因為p = p->next;需要通過回圈的先前主體p保留其next成員,依賴于一些后續迭代來覆寫該資訊(當作為back節點訪問時)。
另一種思考方式:其中一個串列總是隱式NULL終止,因為某些節點必須是原始串列的末尾。另一個串列指向此NULL終止串列的某處。
[9, 8, 12, 7, _]
|
V
[4, 2, 4, 3]
一個更簡單的推理方法是首先創建一個將節點添加到串列的函式。
void append(LIST *list, NODE *node) {
if (list->front)
list->back->next = node;
else
list->front = node;
list->back = node;
}
過濾器函式然后在獲取前端節點后重置現有串列。
對于每個節點,我們保存next下一次迭代的值,然后將其重置NULL為 ,以防它是要添加到串列中的最后一個節點。
然后只需將其添加到正確的串列中即可。
LIST *filter(LIST *lst, int value) {
LIST *returned_list = lst_create();
NODE *node = lst->front;
lst->front = ls->back = NULL;
for (NODE *temp; node; node = temp) {
temp = node->next;
node->next = NULL;
if (node->value <= value)
append(returned_list, node);
else
append(lst, node);
}
return returned_list;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/454254.html
上一篇:如何回圈指向字符的指標陣列
下一篇:了解陣列和指標之間的關系
