Hỏi về xoá phần tử trong linked list C++

Em đang muốn xoá phần tử ở một index bất kì trong linked list dùng hàm bool và em viết như sau:

bool removeE(node* list, int indx) {
    node* head = list;

    if (indx == 0) {
        list = list->next;
        delete head;
        return true;
    }

    for (int i = 0; i < indx - 1; i++) {
        if (!(head->next)) return false;
        head = head->next;
    }
    head->next = head->next->next;
    return true;
}

và kết quả chạy ra đúng với mọi trường hơp chỉ trừ trường hợp index = 0 thì phần tử ở thứ [0] không bị xoá đi và kết quả ra list vẫn giữ nguyên (hàm vẫn trả về true…)
Em có viết hàm tương tự với giá trị trả về là môt list (node*) thì nó lại ra đúng ấy… thật không hiểu sao cho return bool thì lại sai nhỉ

list truyền vào là 1 copy của list trong main em xài :V nên dòng này

list = list->next;

list đích thực của em ko bị thay đổi, chỉ có bản copy trong hàm removeE thay đổi. Hàm này xóa được ở những index khác 0 là vì những index đó ko làm thay đổi giá trị của con trỏ list. Chỉ có index = 0 thì list mới thay đổi (trỏ tới chỗ khác, thay đổi giá trị địa chỉ mà nó chứa) nên mới gặp vấn đề “ko xóa được” này :V

cách sửa là truyền đích thực list đs bằng cách thêm 1 ký tự & vào :V

bool removeE(node*& list, int indx) {
...

ví dụ:

void f1(int* q) { q = new int(22); }
void f2(int*& p) { p = new int(33); }

int* p = new int(11); // *p ban đầu = 11
f1(p); // p vẫn trỏ vào int ban đầu, *p = 11 vì q truyền vào f1 là bản copy của p
f2(p); // p trỏ vào giá trị mới, *p = 33 vì p truyền vào f2 chính là bản thân p

à mà chỗ xóa index khác 0 em có xóa đâu :V chỉ có gán

head->next = head->next->next;

đâu có delete cái gì đâu :V

sửa lại :V :V

node* toDelete = head->next;
head->next = head->next->next;
delete toDelete;
4 Likes

òoo em cám ơn anh/chị nhiều nhe hihi…

83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?