一、什么是链表?
链表是一种数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。与数组不同,链表的节点可以在内存中不连续地存储,这使得链表能够在运行时动态分配内存,而不需要事先定义大小。链表通常用于需要频繁插入和删除操作的情况。
二、链表的基本结构
链表中的基本元素是节点。每个节点通常包含以下两个成员:
struct Node {
int data; // 节点数据 struct Node* next; // 指向下一个节点的指针 };
这个结构定义了一个包含整数数据的节点和一个指向下一个节点的指针。
三、创建链表
要创建链表,首先需要定义链表的头节点。头节点不包含任何数据,只用于指示链表的起始位置。以下是创建链表的函数,这里引入了一些强壮性的代码,以确保内存分配成功:
//返回一个结构体 struct LinkedList* createLinkedList() {
struct LinkedList* newList = (struct LinkedList*)malloc(sizeof(struct LinkedList)); if (newList == NULL) {
printf("内存分配失败\n"); exit(1); } newList->head = NULL; return newList; }
这个函数分配了一个LinkedList结构,并将头节点初始化为NULL。如果内存分配失败,它将发出错误消息并退出程序。
四、 插入节点
插入节点是链表中的操作,可以在链表的末尾插入新节点,以下是插入节点的函数,其中包括强壮性检查以确保节点成功分配内存:
void insertNode(struct LinkedList* list, int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); if (newNode == NULL) {
printf("内存分配失败\n"); exit(1); } newNode->data = data; newNode->next = NULL; if (list->head == NULL) {
list->head = newNode; } else {
struct Node* current = list->head; while (current->next != NULL) {
current = current->next; } current->next = newNode; } }
这个函数创建一个新节点,将数据赋给它,然后将它添加到链表的末尾。如果内存分配失败,它将发出错误消息并退出程序。
五、删除节点
从链表中删除节点操作,以下是删除节点的函数,包括强壮性检查以确保链表不为空:
void deleteNode(struct LinkedList* list, int data) {
if (list->head == NULL) {
printf("链表为空\n"); return; } if (list->head->data == data) {
struct Node* temp = list->head; list->head = list->head->next; free(temp); return; } struct Node* current = list->head; while (current->next != NULL) {
if (current->next->data == data) {
struct Node* temp = current->next; current->next = current->next->next; free(temp); return; } current = current->next; } printf("未找到要删除的节点\n"); }
当涉及到C语言编程时,链表是一种非常重要的数据结构。链表是一种灵活的方式,用于存储和管理数据集合,与数组相比,链表的大小可以动态调整,使其成为解决各种问题的强大工具。本文将详细介绍C语言链表的基本概念、创建链表、插入、删除和遍历节点的操作,以及提供一个完整的、强壮和复杂的链表示例代码。
目录
什么是链表?
链表的基本结构
创建链表
插入节点
删除节点
遍历链表
强壮和复杂的链表示例
完整示例代码
-
什么是链表?
链表是一种数据结构,由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。与数组不同,链表的节点可以在内存中不连续地存储,这使得链表能够在运行时动态分配内存,而不需要事先定义大小。链表通常用于需要频繁插入和删除操作的情况。 -
链表的基本结构
链表中的基本元素是节点。每个节点通常包含以下两个成员:
c
Copy code
struct Node {
int data; // 节点数据
struct Node* next; // 指向下一个节点的指针
};
这个结构定义了一个包含整数数据的节点和一个指向下一个节点的指针。
- 创建链表
要创建链表,首先需要定义链表的头节点。头节点不包含任何数据,只用于指示链表的起始位置。以下是创建链表的函数,这里我们引入了一些强壮性的代码,以确保内存分配成功:
c
Copy code
struct LinkedList* createLinkedList() {
struct LinkedList* newList = (struct LinkedList*)malloc(sizeof(struct LinkedList));
if (newList == NULL) {
printf(“内存分配失败\n”);
exit(1);
}
newList->head = NULL;
return newList;
}
这个函数分配了一个LinkedList结构,并将头节点初始化为NULL。如果内存分配失败,它将发出错误消息并退出程序。
c
Copy code
struct LinkedList {
struct Node* head;
};
4. 插入节点
插入节点是链表中的常见操作。可以在链表的末尾插入新节点。以下是插入节点的函数,其中包括强壮性检查以确保节点成功分配内存:
c
Copy code
void insertNode(struct LinkedList* list, int data) {
struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
if (newNode == NULL) {
printf(“内存分配失败\n”);
exit(1);
}
newNode->data = data;
newNode->next = NULL;
if (list->head == NULL) { list->head = newNode; } else { struct Node* current = list->head; while (current->next != NULL) { current = current->next; } current->next = newNode; }
}
这个函数创建一个新节点,将数据赋给它,然后将它添加到链表的末尾。如果内存分配失败,它将发出错误消息并退出程序。
- 删除节点
从链表中删除节点也是一种常见操作。以下是删除节点的函数,包括强壮性检查以确保链表不为空:
c
Copy code
void deleteNode(struct LinkedList* list, int data) {
if (list->head == NULL) {
printf(“链表为空\n”);
return;
}
if (list->head->data == data) { struct Node* temp = list->head; list->head = list->head->next; free(temp); return; } struct Node* current = list->head; while (current->next != NULL) { if (current->next->data == data) { struct Node* temp = current->next; current->next = current->next->next; free(temp); return; } current = current->next; } printf("未找到要删除的节点\n");
}
这个函数可以删除链表中具有指定数据值的节点。如果链表为空,它将显示错误消息。如果未找到要删除的节点,它也会发出错误消息。
六、遍历链表
遍历链表是查看和处理链表中所有节点的方法。以下是遍历链表的函数:
void traverseList(struct LinkedList* list) {
struct Node* current = list->head; while (current != NULL) {
printf("%d -> ", current->data); current = current->next; } printf("NULL\n"); }
这个函数从链表的头节点开始,沿着链表依次打印每个节点的数据值。
七、完整示例代码(详细注释)
创建一个链表,包括查找节点、计算链表长度和清空链表等功能。下面是这些功能的代码:
下面是一个包含所有上述功能的完整示例代码:
#include <stdio.h> #include <stdlib.h> // 定义链表节点的结构 struct Node {
int data; // 节点数据 struct Node *next; // 指向下一个节点的指针 }; // 定义链表的结构 struct LinkedList {
struct Node *head; // 链表的头节点 }; // 创建一个新的链表 struct LinkedList *createLinkedList() {
// 分配内存以存储新链表的结构 struct LinkedList *newList = (struct LinkedList *)malloc(sizeof(struct LinkedList)); if (newList == NULL) {
printf("内存分配失败\n"); exit(1); // 如果内存分配失败,退出程序 } newList->head = NULL; // 初始化链表的头节点为空 return newList; } // 在链表的末尾插入一个新节点 void insertNode(struct LinkedList *list, int data) {
// 分配内存以存储新节点的结构 struct Node *newNode = (struct Node *)malloc(sizeof(struct Node)); if (newNode == NULL) {
printf("内存分配失败\n"); exit(1); // 如果内存分配失败,退出程序 } newNode->data = data; // 设置新节点的数据 newNode->next = NULL; // 新节点的下一个节点为空 if (list->head == NULL) {
list->head = newNode; // 如果链表为空,将新节点设置为头节点 } else {
struct Node *current = list->head; while (current->next != NULL) {
current = current->next; } current->next = newNode; // 否则,将新节点添加到链表末尾 } } // 删除链表中的指定节点 void deleteNode(struct LinkedList *list, int data) {
if (list->head == NULL) {
printf("链表为空\n"); return; // 如果链表为空,显示错误消息并返回 } if (list->head->data == data) {
struct Node *temp = list->head; list->head = list->head->next; free(temp); // 如果头节点包含要删除的数据,删除头节点 return; } struct Node *current = list->head; while (current->next != NULL) {
if (current->next->data == data) {
struct Node *temp = current->next; current->next = current->next->next; free(temp); // 否则,在链表中查找要删除的数据,并删除它 return; } current = current->next; } printf("未找到要删除的节点\n"); } // 遍历链表并打印节点数据 void traverseList(struct LinkedList *list) {
struct Node *current = list->head; while (current != NULL) {
printf("%d -> ", current->data); current = current->next; } printf("NULL\n"); } // 查找节点 struct Node *findNode(struct LinkedList *list, int data) {
struct Node *current = list->head; while (current != NULL) {
if (current->data == data) {
return current; // 在链表中查找具有指定数据的节点并返回它 } current = current->next; } return NULL; // 如果未找到,返回NULL } // 计算链表长度 int getLinkedListLength(struct LinkedList *list) {
struct Node *current = list->head; int length = 0; while (current != NULL) {
length++; current = current->next; } return length; // 计算链表的长度并返回 } // 清空链表 void clearLinkedList(struct LinkedList *list) {
while (list->head != NULL) {
struct Node *temp = list->head; list->head = list->head->next; free(temp); // 释放链表中的所有节点的内存以清空链表 } } int main() {
struct LinkedList *myList = createLinkedList(); insertNode(myList, 10); insertNode(myList, 20); insertNode(myList, 30); insertNode(myList, 40); printf("链表内容:\n"); traverseList(myList); deleteNode(myList, 20); printf("删除后的链表内容:\n"); traverseList(myList); struct Node *foundNode = findNode(myList, 30); if (foundNode != NULL) {
printf("找到节点:%d\n", foundNode->data); } else {
printf("未找到节点\n"); } int length = getLinkedListLength(myList); printf("链表长度:%d\n", length); clearLinkedList(myList); printf("清空后的链表内容:\n"); traverseList(myList); return 0; }
输出结果: 链表内容: 10 -> 20 -> 30 -> 40 -> NULL 删除后的链表内容: 10 -> 30 -> 40 -> NULL 找到节点:30 链表长度:3 清空后的链表内容: NULL
粉丝福利、需求解答
今天的文章
c++基础知识_c语言基础知识入门自学分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/80948.html