#include <stdio.h>
#include <stdlib.h>
// 链表节点的结构体定义
typedef struct Node {
int data; // 数据域
struct Node* next; // 指针域,指向下一个节点//创建第2个结构体时struct Node* next调用上一个的地址
} Node;
// 创建一个新的节点
Node* createNode(int data) {
Node* newNode = (Node*)malloc(sizeof(Node));
if (newNode == NULL) {
exit(-1); // 内存分配失败,退出程序
}
newNode->data = data;
newNode->next = NULL;
return newNode;
}
// 在链表头部插入一个节点
void insertAtHead(Node** head, int data) {
Node* newNode = createNode(data);
newNode->next = *head;
*head = newNode;
}
// 在链表尾部插入一个节点
void insertAtTail(Node** head, int data) {
Node* newNode = createNode(data);
if (*head == NULL) {
*head = newNode;
return;
}
Node* temp = *head;
while (temp->next != NULL) {
temp = temp->next;
}
temp->next = newNode;
}
// 删除链表中指定数据的节点
void deleteNode(Node** head, int data) {
if (*head == NULL) return;
Node* temp = *head;
Node* prev = NULL;
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);
}
// 打印链表
void printList(Node* node) {
while (node != NULL) {
printf("%d -> ", node->data);
node = node->next;
}
printf("NULL\n");
}
// 释放链表内存
void freeList(Node* node) {
Node* temp;
while (node != NULL) {
temp = node;
node = node->next;
free(temp);
}
}
int main() {
Node* head = NULL;
// 插入节点
insertAtTail(&head, 1);
insertAtTail(&head, 2);
insertAtTail(&head, 3);
insertAtHead(&head, 0);
// 打印链表
printList(head);
// 删除节点
deleteNode(&head, 2);
// 再次打印链表
printList(head);
// 释放链表内存
freeList(head);
head = NULL;
return 0;
}
重点语句解释
1?
typedef struct Node {
? ? int data; ? ? ? ? ? // 数据域
? ? struct Node* next; ?// 指针域,指向下一个节点//创建第2个结构体时struct Node* next调用上一个结构体的地址?
} Node;malloc
?2
malloc()? : 这是C标准库中的一个函数,用于动态内存分配。它会返回一个指向所请求大小字节的未初始化的内存的指针,或者在无法分配内存时返回 NULL。