链表是一种常见的数据结构,它由一系列节点组成,每个节点都包含数据以及指向下一个节点的指针。这种组织方式使得链表能够动态地增长,并且在插入和删除操作上具有很高的效率。
一、链表的基本结构
在C语言中,链表通常使用结构体来定义:
struct Node {
int data;
struct Node *next;
};
在这个例子中,Node 结构体包含一个整型数据 data 以及一个指向下一个节点的指针 next。
二、链表的用法
1.创建节点
// 创建一个新的节点
struct Node* createNode(int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
newNode->data = data;
newNode->next = NULL;
return newNode;
}
2.插入节点
void insertAtEnd(struct Node **head, int data) {
struct Node *newNode = createNode(data);
if (*head == NULL) {
*head = newNode; // 如果链表为空,将新节点设置为头节点
} else {
struct Node *temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode; // 将新节点加入到链表末尾
}
}
3.删除节点
void deleteNode(struct Node **head, int data) {
struct Node *temp = *head, *prev;
if (temp != NULL && temp->data == data) {
*head = temp->next;
free(temp); // 删除头节点
return;
}
while (temp != NULL && temp->data != data) {
prev = temp;
temp = temp->next;
}
if (temp == NULL) return; // 如果未找到要删除的节点
prev->next = temp->next; // 从链表中删除节点
free(temp);
}
4.遍历链表
void printList(struct Node *node) {
while (node != NULL) {
printf("%d ", node->data);
node = node->next;
}
}
小结:
链表的优势
链表的主要优势在于其动态性,可以根据需要随时插入、删除节点,而不需要提前知道链表的大小。相比之下,数组在插入和删除操作上的效率通常较低,因为需要移动大量元素。因此,在需要频繁地进行插入和删除操作时,链表通常比数组更加适合。