📅  最后修改于: 2023-12-03 14:59:39.115000             🧑  作者: Mango
在C语言中,链表是一种常用的数据结构,头链表(Head Linked List)是链表的一种变体,它是在链表的头部添加了一个指向链表头部的指针,使得添加和删除元素时更加方便。
在声明头链表时,我们需要定义一个结构体,其中包含两个成员:头指针和大小。头指针指向链表中的第一个节点,大小表示链表中节点的数量。示例代码如下:
typedef struct node {
void *data;
struct node *next;
} Node;
typedef struct list {
Node *head;
int size;
} List;
当我们定义了一个头链表结构体时,需要先对其进行初始化,为头指针和大小赋初值。示例代码如下:
List* init() {
List *list = (List*)malloc(sizeof(List));
list->head = NULL;
list->size = 0;
return list;
}
头链表中的添加元素有两种方式:在链表头部添加和在链表尾部添加。
在链表头部添加元素需要先创建一个新的节点,并将其插入到头指针的位置。插入操作示例代码如下:
void push_front(List *list, void *data) {
Node *node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = list->head;
list->head = node;
list->size++;
}
在链表尾部添加元素需要先找到链表中的最后一个节点,并将新的节点插入到其后面。插入操作示例代码如下:
void push_back(List *list, void *data) {
Node *node = (Node*)malloc(sizeof(Node));
node->data = data;
node->next = NULL;
if (list->size == 0) {
list->head = node;
} else {
Node *temp = list->head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = node;
}
list->size++;
}
头链表中的删除元素也有两种方式:删除链表头部元素和删除链表尾部元素。
删除链表头部元素需要将头指针指向下一个节点即可。删除操作示例代码如下:
void pop_front(List *list) {
if (list->size != 0) {
Node *temp = list->head;
list->head = temp->next;
list->size--;
free(temp);
}
}
删除链表尾部元素需要先找到链表中倒数第二个节点,并将其next指针置为NULL。删除操作示例代码如下:
void pop_back(List *list) {
if (list->size == 1) {
free(list->head);
list->head = NULL;
list->size--;
} else if (list->size > 1) {
Node *temp = list->head;
while (temp->next->next != NULL) {
temp = temp->next;
}
free(temp->next);
temp->next = NULL;
list->size--;
}
}
对于一个头链表,我们可以通过遍历链表来访问其中的每个节点。遍历示例代码如下:
void traverse(List *list, void (*callback)(void *)) {
Node *temp = list->head;
while (temp != NULL) {
callback(temp->data);
temp = temp->next;
}
}
头链表是链表的一种变体,它在链表的头部添加了一个指向链表头部的指针。通过使用头链表,可以更加方便地添加和删除元素。在定义和使用头链表时,需要注意初始化和遍历等细节问题。