C实现带头节点的单链表
时间: 2024-04-30 11:23:12 浏览: 6
以下是C语言实现带头节点的单链表的代码:
```c
#include <stdio.h>
#include <stdlib.h>
typedef struct ListNode {
int val;
struct ListNode *next;
} ListNode;
ListNode* createListNode(int val) {
ListNode *node = (ListNode*)malloc(sizeof(ListNode));
node->val = val;
node->next = NULL;
return node;
}
void insertNode(ListNode *head, int val) {
ListNode *node = createListNode(val);
node->next = head->next;
head->next = node;
}
void deleteNode(ListNode *head, int val) {
ListNode *prev = head;
ListNode *cur = head->next;
while (cur != NULL) {
if (cur->val == val) {
prev->next = cur->next;
free(cur);
break;
}
prev = cur;
cur = cur->next;
}
}
void printList(ListNode *head) {
ListNode *cur = head->next;
while (cur != NULL) {
printf("%d ", cur->val);
cur = cur->next;
}
printf("\n");
}
void destroyList(ListNode *head) {
ListNode *cur = head;
while (cur != NULL) {
ListNode *tmp = cur;
cur = cur->next;
free(tmp);
}
}
int main() {
ListNode *head = createListNode(0);
insertNode(head, 1);
insertNode(head, 2);
insertNode(head, 3);
printList(head);
deleteNode(head, 2);
printList(head);
destroyList(head);
return 0;
}
```
在这个实现中,我们定义了一个`ListNode`结构体,包含一个`val`表示节点的值和一个`next`指针指向下一个节点。我们还定义了一个`createListNode`函数用于创建节点,一个`insertNode`函数用于插入节点,一个`deleteNode`函数用于删除节点,一个`printList`函数用于打印链表,以及一个`destroyList`函数用于销毁链表。
在`insertNode`函数中,我们首先创建一个新的节点,并将其`next`指针指向当前头节点的`next`指针所指向的节点。然后将当前头节点的`next`指针指向新节点,这样新节点就成为了新的头节点。
在`deleteNode`函数中,我们使用双指针法,遍历链表,找到节点值等于目标值的节点,并将其前驱节点的`next`指针指向目标节点的`next`指针所指向的节点,然后释放目标节点的内存。
在`printList`函数中,我们遍历链表,打印每个节点的值。
在`destroyList`函数中,我们从头节点开始遍历链表,释放每个节点的内存。
在`main`函数中,我们创建了一个头节点,插入了三个节点,打印了链表,删除了节点2,再次打印链表,最后销毁了链表。