#include <stdio.h>
#include <stdlib.h>typedef int datatype; // 定义链表存储的数据类型// 定义链表节点结构体
typedef struct link {datatype data; // 数据域struct link *next; // 指针域,指向下一个节点
} link_t;
初始化链表
/*** 初始化链表* @param head 指向链表头指针的指针*/
void Link_Init(link_t **head) {*head = NULL; // 初始化头指针为空,表示链表为空
}
头插法插入节点
/*** 头插法插入新节点* @param head 指向链表头指针的指针* @param data 要插入的数据*/
void Link_Insert_Head(link_t **head, datatype data) {// 分配新节点link_t *new_node = (link_t *)malloc(sizeof(link_t));if (new_node == NULL) {// 处理内存分配失败的情况fprintf(stderr, "Memory allocation failed for new node.\n");exit(EXIT_FAILURE);}// 设置新节点的数据new_node->data = data;// 新节点的下一个节点是当前的头节点new_node->next = *head;// 更新头指针为新节点*head = new_node;
}
尾插法插入节点
/*** 尾插法插入新节点* @param head 指向链表头指针的指针* @param data 要插入的数据*/
void Link_Insert_Tail(link_t **head, datatype data) {// 分配新节点link_t *new_node = (link_t *)malloc(sizeof(link_t));if (new_node == NULL) {// 处理内存分配失败的情况fprintf(stderr, "Memory allocation failed for new node.\n");exit(EXIT_FAILURE);}// 设置新节点的数据new_node->data = data;new_node->next = NULL;if (*head == NULL) {// 如果链表为空,新节点就是头节点*head = new_node;} else {// 否则找到链表的尾节点,并将新节点插入到尾部link_t *temp = *head;while (temp->next != NULL) {temp = temp->next;}temp->next = new_node;}
}
删除节点
/*** 删除包含特定数据的节点* @param head 指向链表头指针的指针* @param data 要删除的数据*/
void Link_Delete(link_t **head, datatype data) {link_t *temp = *head, *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);
}
搜索节点
/*** 搜索包含特定数据的节点* @param head 链表头指针* @param data 要搜索的数据* @return 指向找到的节点的指针,如果未找到则返回NULL*/
link_t *Link_Search(link_t *head, datatype data) {link_t *current = head;while (current != NULL) {if (current->data == data) {return current; // 找到节点,返回指针}current = current->next;}return NULL; // 未找到节点,返回NULL
}
打印链表
/*** 打印链表中的所有节点* @param head 链表头指针*/
void Link_Print(link_t *head) {link_t *current = head;printf("链表元素如下:\n");while (current != NULL) {printf("%d ", current->data);current = current->next;}printf("\n");
}
逆转链表
/*** 逆转链表* @param head 指向链表头指针的指针*/
void Link_Reverse(link_t **head) {link_t *prev = NULL;link_t *current = *head;link_t *next = NULL;while (current != NULL) {next = current->next; // 保存下一个节点current->next = prev; // 逆转当前节点的指向prev = current; // 移动 prev 指针current = next; // 移动 current 指针}*head = prev; // 更新头指针为新的头节点
}
释放链表
/*** 释放链表占用的所有内存* @param head 链表头指针*/
void Link_Free(link_t *head) {link_t *current = head;link_t *next = NULL;while (current != NULL) {next = current->next;free(current);current = next;}
}
主函数示例
int main() {link_t *head;Link_Init(&head); // 初始化链表// 头插法插入数据Link_Insert_Head(&head, 1);Link_Insert_Head(&head, 2);Link_Insert_Head(&head, 3);printf("头插法插入后链表: ");Link_Print(head);// 尾插法插入数据Link_Insert_Tail(&head, 4);Link_Insert_Tail(&head, 5);Link_Insert_Tail(&head, 6);printf("尾插法插入后链表: ");Link_Print(head);// 删除节点Link_Delete(&head, 3);printf("删除节点 3 后链表: ");Link_Print(head);// 搜索节点link_t *found = Link_Search(head, 4);if (found != NULL) {printf("找到节点 4\n");} else {printf("未找到节点 4\n");}// 逆转链表Link_Reverse(&head);printf("逆转后链表: ");Link_Print(head);// 释放链表Link_Free(head);return 0;
}