#include <iostream>
#include <cstdio>
struct linked_list
{
int val;
struct linked_list *next;
};
using namespace std;
int release_list(struct linked_list* head)
{
struct linked_list *cur = head;
while(cur != nullptr)
{
struct linked_list *next = cur->next;
delete cur;
cur = next;
}
return 0;
}
void gen_list(const int gen_count, struct linked_list** head)
{
struct linked_list **cur = head;
for(int i = 0; i < gen_count; i++)
{
(*cur) = (struct linked_list*)calloc(sizeof(struct linked_list), 1);
(*cur)->next = nullptr;
(*cur)->val = i;
cur = &((*cur)->next);
}
}
void show_list(struct linked_list *head)
{
struct linked_list *cur = head;
while(cur != nullptr)
{
printf("%d -> ", cur->val);
cur = cur->next;
}
printf("\n");
}
void del_node(int val, struct linked_list **head)
{
struct linked_list **curr = head; // We need a pointer to "a pointer to a linked-list"
while((*curr)->val != val) // Dereference the pointer and compare the value, if value is we want to delete, the loop will stop.
{
curr = &((*curr)->next); // Walk to the next node, so we record the pointer to "a pointer to a linked-list"
if((*curr) == nullptr) // If we walk to the end, return.
return;
}
struct linked_list *delptr = *curr; // record the pointer we need to delete.
*curr = (*curr)->next; // point the current "next pointer" to next pointer.
delete(delptr); // and delete it!
}
int main()
{
struct linked_list *list_node = nullptr;
gen_list(10, &list_node);
show_list(list_node);
for(int i = 0; i < 5; i++)
{
del_node(i, &list_node);
show_list(list_node);
}
printf("Cleaning...\n");
release_list(list_node);
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgoKc3RydWN0IGxpbmtlZF9saXN0CnsKICAgIGludCB2YWw7CiAgICBzdHJ1Y3QgbGlua2VkX2xpc3QgKm5leHQ7Cn07Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKaW50IHJlbGVhc2VfbGlzdChzdHJ1Y3QgbGlua2VkX2xpc3QqIGhlYWQpCnsKICAgIHN0cnVjdCBsaW5rZWRfbGlzdCAqY3VyID0gaGVhZDsKICAgIHdoaWxlKGN1ciAhPSBudWxscHRyKQogICAgewogICAgICAgIHN0cnVjdCBsaW5rZWRfbGlzdCAqbmV4dCA9IGN1ci0+bmV4dDsKICAgICAgICBkZWxldGUgY3VyOwogICAgICAgIGN1ciA9IG5leHQ7CiAgICB9CiAgICByZXR1cm4gMDsKfQoKdm9pZCBnZW5fbGlzdChjb25zdCBpbnQgZ2VuX2NvdW50LCBzdHJ1Y3QgbGlua2VkX2xpc3QqKiBoZWFkKQp7CiAgICBzdHJ1Y3QgbGlua2VkX2xpc3QgKipjdXIgPSBoZWFkOwogICAgZm9yKGludCBpID0gMDsgaSA8IGdlbl9jb3VudDsgaSsrKQogICAgewogICAgICAgICgqY3VyKSA9IChzdHJ1Y3QgbGlua2VkX2xpc3QqKWNhbGxvYyhzaXplb2Yoc3RydWN0IGxpbmtlZF9saXN0KSwgMSk7CiAgICAgICAgKCpjdXIpLT5uZXh0ID0gbnVsbHB0cjsKICAgICAgICAoKmN1ciktPnZhbCA9IGk7CiAgICAgICAgY3VyID0gJigoKmN1ciktPm5leHQpOwogICAgfQp9Cgp2b2lkIHNob3dfbGlzdChzdHJ1Y3QgbGlua2VkX2xpc3QgKmhlYWQpCnsKICAgIHN0cnVjdCBsaW5rZWRfbGlzdCAqY3VyID0gaGVhZDsKICAgIHdoaWxlKGN1ciAhPSBudWxscHRyKQogICAgewogICAgICAgIHByaW50ZigiJWQgLT4gIiwgY3VyLT52YWwpOwogICAgICAgIGN1ciA9IGN1ci0+bmV4dDsKICAgIH0KICAgIHByaW50ZigiXG4iKTsKfQoKdm9pZCBkZWxfbm9kZShpbnQgdmFsLCBzdHJ1Y3QgbGlua2VkX2xpc3QgKipoZWFkKQp7CiAgICBzdHJ1Y3QgbGlua2VkX2xpc3QgKipjdXJyID0gaGVhZDsgLy8gV2UgbmVlZCBhIHBvaW50ZXIgdG8gImEgcG9pbnRlciB0byBhIGxpbmtlZC1saXN0IgogICAgd2hpbGUoKCpjdXJyKS0+dmFsICE9IHZhbCkgICAgICAgIC8vIERlcmVmZXJlbmNlIHRoZSBwb2ludGVyIGFuZCBjb21wYXJlIHRoZSB2YWx1ZSwgaWYgdmFsdWUgaXMgd2Ugd2FudCB0byBkZWxldGUsIHRoZSBsb29wIHdpbGwgc3RvcC4KICAgIHsKICAgICAgICBjdXJyID0gJigoKmN1cnIpLT5uZXh0KTsgICAgICAvLyBXYWxrIHRvIHRoZSBuZXh0IG5vZGUsIHNvIHdlIHJlY29yZCB0aGUgcG9pbnRlciB0byAiYSBwb2ludGVyIHRvIGEgbGlua2VkLWxpc3QiCiAgICAgICAgaWYoKCpjdXJyKSA9PSBudWxscHRyKSAgICAgICAgLy8gSWYgd2Ugd2FsayB0byB0aGUgZW5kLCByZXR1cm4uCiAgICAgICAgICAgIHJldHVybjsKICAgIH0KICAgIHN0cnVjdCBsaW5rZWRfbGlzdCAqZGVscHRyID0gKmN1cnI7ICAvLyByZWNvcmQgdGhlIHBvaW50ZXIgd2UgbmVlZCB0byBkZWxldGUuCiAgICAqY3VyciA9ICgqY3VyciktPm5leHQ7ICAgICAgICAgICAgICAgLy8gcG9pbnQgdGhlIGN1cnJlbnQgIm5leHQgcG9pbnRlciIgdG8gbmV4dCBwb2ludGVyLgogICAgZGVsZXRlKGRlbHB0cik7ICAgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBkZWxldGUgaXQhCn0KCmludCBtYWluKCkKewogICAgc3RydWN0IGxpbmtlZF9saXN0ICpsaXN0X25vZGUgPSBudWxscHRyOwogICAgZ2VuX2xpc3QoMTAsICZsaXN0X25vZGUpOwogICAgc2hvd19saXN0KGxpc3Rfbm9kZSk7CiAgICBmb3IoaW50IGkgPSAwOyBpIDwgNTsgaSsrKQogICAgewogICAgICAgIGRlbF9ub2RlKGksICZsaXN0X25vZGUpOwogICAgICAgIHNob3dfbGlzdChsaXN0X25vZGUpOwogICAgfQogICAgcHJpbnRmKCJDbGVhbmluZy4uLlxuIik7CiAgICByZWxlYXNlX2xpc3QobGlzdF9ub2RlKTsKICAgIHJldHVybiAwOwp9Cg==