📅  最后修改于: 2023-12-03 15:11:17.919000             🧑  作者: Mango
链表是一种常见的数据结构,在编写 C 程序时经常使用。它可以动态地添加、删除元素,非常适合存储数据量不确定的情况。删除链表中的元素也是经常使用的操作,下面介绍用 C 语言编写删除链表的函数。
以下是一个示例代码,用于实现删除链表中某个节点的功能。该函数接收一个指向链表头结点的指针,以及要删除的节点的值。如果链表中包含该值的节点,则删除该节点并返回新的头结点,否则返回原始头结点。
struct ListNode {
int val;
struct ListNode *next;
};
struct ListNode* deleteNode(struct ListNode* head, int val) {
if (head == NULL) return NULL;
if (head->val == val) {
struct ListNode *temp = head->next;
free(head);
return temp;
}
struct ListNode *prev = head;
struct ListNode *curr = head->next;
while (curr != NULL) {
if (curr->val == val) {
prev->next = curr->next;
free(curr);
break;
}
prev = curr;
curr = curr->next;
}
return head;
}
首先定义了链表中每个节点的结构体,包括节点的值和指向下一个节点的指针。函数删除的是链表中指定值的节点,因此需要一个变量来存储值,以便和链表中的节点值进行比较。
在主函数中调用 deleteNode 函数时,需要传递链表的头结点和要删除的值。头结点是整个链表的入口,通过它可以访问到整个链表。要删除的值是函数的参数,用于和链表中的节点值进行比较。
首先判断头结点是否为空,如果是则直接返回空。然后判断头结点的值是否和要删除的值相等,如果是则将头结点指向的下一个节点作为新头结点,并释放原来的头结点。如果头结点不是要删除的节点,则需要遍历整个链表来查找要删除的节点。
定义两个指针 prev 和 curr,分别指向要删除节点的前一个节点和要删除的节点。从头结点的下一个节点开始遍历链表,如果当前节点的值等于要删除的值,则将前一个节点的 next 指针指向当前节点的下一个节点,并释放当前节点。最后返回原头结点。
C 语言中实现删除链表的函数方式多种多样,需要根据实际情况进行选择。本文介绍了一种较为常见的实现方法,供程序员参考。对于初学者而言,在编写代码时需要结合实际情况思考,进行合理选择,编写出高质量的代码。