C语言中的链表封装

链表是一种常用的数据结构,在许多应用程序中都有广泛的应用。它由一系列节点组成,每个节点包含数据和指向下一个节点的指针。本篇文章将详细介绍如何在C语言中实现链表的封装,并提供一些基本的操作函数,如添加元素、删除元素、遍历列表等。

链表的基本概念

链表是一种动态数据结构,它不像数组那样要求连续的内存空间。链表中的每个元素(称为节点)都包含了实际的数据和一个指向下一个节点的指针。这种结构使得在链表中插入和删除元素变得非常容易。

链表节点的定义

首先,我们需要定义链表节点的结构体。一个典型的链表节点结构如下:

typedef struct ListNode {

int data; // 存储的数据

struct ListNode *next; // 指向下一个节点的指针

} ListNode;

这里定义了一个名为 `ListNode` 的结构体类型,其中包含了一个整型数据 `data` 和一个指向相同类型的指针 `next`。

链表的基本操作

接下来我们将定义几个常用的链表操作函数,这些函数将帮助我们完成对链表的增删改查等基本操作。

创建空链表

// 创建一个空链表

ListNode *createList() {

return NULL;

}

添加元素到链表尾部

// 在链表尾部添加一个新元素

void appendToList(ListNode **list, int value) {

ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));

newNode->data = value;

newNode->next = NULL;

if (*list == NULL) {

*list = newNode;

} else {

ListNode *current = *list;

while (current->next != NULL) {

current = current->next;

}

current->next = newNode;

}

}

从链表中删除元素

// 从链表中删除指定值的节点

void deleteFromList(ListNode **list, int value) {

ListNode *current = *list;

ListNode *previous = NULL;

while (current != NULL && current->data != value) {

previous = current;

current = current->next;

}

if (current == NULL) {

return; // 没有找到要删除的元素

}

if (previous == NULL) {

*list = current->next;

} else {

previous->next = current->next;

}

free(current); // 释放节点

}

遍历链表并打印所有元素

// 遍历链表并打印所有元素

void printList(ListNode *list) {

ListNode *current = list;

while (current != NULL) {

printf("%d -> ", current->data);

current = current->next;

}

printf("NULL\n");

}

清空链表

// 清空整个链表

void clearList(ListNode **list) {

ListNode *current = *list;

ListNode *next;

while (current != NULL) {

next = current->next;

free(current);

current = next;

}

*list = NULL;

}

完整示例代码

现在让我们将上述函数整合到一个完整的示例中,以便展示它们是如何工作的。

#include <stdio.h>

#include <stdlib.h>

typedef struct ListNode {

int data;

struct ListNode *next;

} ListNode;

// 创建一个空链表

ListNode *createList() {

return NULL;

}

// 在链表尾部添加一个新元素

void appendToList(ListNode **list, int value) {

ListNode *newNode = (ListNode *)malloc(sizeof(ListNode));

newNode->data = value;

newNode->next = NULL;

if (*list == NULL) {

*list = newNode;

} else {

ListNode *current = *list;

while (current->next != NULL) {

current = current->next;

}

current->next = newNode;

}

}

// 从链表中删除指定值的节点

void deleteFromList(ListNode **list, int value) {

ListNode *current = *list;

ListNode *previous = NULL;

while (current != NULL && current->data != value) {

previous = current;

current = current->next;

}

if (current == NULL) {

return; // 没有找到要删除的元素

}

if (previous == NULL) {

*list = current->next;

} else {

previous->next = current->next;

}

free(current); // 释放节点

}

// 遍历链表并打印所有元素

void printList(ListNode *list) {

ListNode *current = list;

while (current != NULL) {

printf("%d -> ", current->data);

current = current->next;

}

printf("NULL\n");

}

// 清空整个链表

void clearList(ListNode **list) {

ListNode *current = *list;

ListNode *next;

while (current != NULL) {

next = current->next;

free(current);

current = next;

}

*list = NULL;

}

int main() {

ListNode *list = createList();

appendToList(&list, 10);

appendToList(&list, 20);

appendToList(&list, 30);

printf("Original List:\n");

printList(list);

deleteFromList(&list, 20);

printf("After Deleting 20:\n");

printList(list);

clearList(&list);

printf("After Clearing the List:\n");

printList(list);

return 0;

}

总结

以上就是关于链表封装的介绍。通过本篇文章,你已经学会了如何在C语言中定义链表节点、实现链表的基本操作函数,并且通过一个完整的示例了解了这些函数的使用方法。链表是一种非常灵活的数据结构,掌握了这些基本操作之后,你可以根据需要扩展更多的功能。

相关推荐
CSharp精选营21 小时前
关系型 vs 非关系型:从原理到选型,一文搞定数据库核心分类
数据结构·nosql·关系型数据库·非关系型数据库·技术选型
刘马想放假4 天前
Modbus 全栈技术解析:TCP、RTU、ASCII、RTU over TCP
数据结构·网络协议
北域码匠5 天前
冒泡排序太慢?鸡尾酒排序双向优化,原生 C# 零第三方库完整代码
数据结构·排序算法·泛型·c# 算法·鸡尾酒排序·原生 c# 开发·冒泡排序优化·嵌入式算法
Darling噜啦啦12 天前
列表转树算法深度解析:从 Map 到 Reduce 的两种实现,面试高频考点
数据结构·算法·面试
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript
码云数智-园园13 天前
C++20 Modules 模块详解
java·开发语言·spring
swordbob13 天前
NIO的channel中什么是 fd(File Descriptor,文件描述符)
java·开发语言·nio
小小工匠13 天前
Redis - 事务机制:能实现 ACID 属性吗
数据结构·redis·性能优化·并发·持久化
源分享13 天前
Java线程同步的多种实现方法(非常详细)
java·开发语言·jvm