C语言,指针链表详解解说及代码示例

发布时间:2023年12月29日

C语言,指针链表详解解说及代码示例
指针链表是一种常用的数据结构,用于存储和组织数据。它由一系列节点组成,每个节点包含数据和一个指向下一个节点的指针。通过这种方式,可以动态地添加、删除和访问节点,实现灵活的数据操作。
下面是一个简单的指针链表的代码示例,以便更好地理解:

#include <stdio.h>
#include <stdlib.h>
 // 定义链表节点结构体
struct Node {
? ? int data;? ?? ?? ???// 节点数据
? ? struct Node* next;??// 指向下一个节点的指针
};
 // 创建链表节点
struct Node* createNode(int data) {
? ? struct Node* newNode = (struct Node*)malloc(sizeof(struct Node));
? ? if (newNode == NULL) {
? ?? ???printf("内存分配失败!\n");
? ?? ???exit(1);
? ? }
? ? newNode->data = data;
? ? newNode->next = NULL;
? ? return newNode;
}
 // 在链表末尾插入节点
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;
? ? }
}
 // 打印链表
void printList(struct Node* head) {
? ? struct Node* temp = head;
? ? while (temp != NULL) {
? ?? ???printf("%d ", temp->data);
? ?? ???temp = temp->next;
? ? }
? ? printf("\n");
}
 // 主函数
int main() {
? ? struct Node* head = NULL;
? ???// 在链表末尾插入节点
? ? insertAtEnd(&head, 10);
? ? insertAtEnd(&head, 20);
? ? insertAtEnd(&head, 30);
? ???// 打印链表
? ? printf("链表内容: ");
? ? printList(head);
? ???return 0;
}

在以上示例中,我们首先定义了一个链表节点的结构体,包含数据和指向下一个节点的指针。然后,我们实现了创建节点的函数 createNode ,用于动态分配内存并初始化节点的数据和指针。接下来,我们定义了插入节点的函数 insertAtEnd ,它将新节点插入到链表的末尾。最后,我们实现了打印链表的函数 printList ,用于遍历链表并打印节点的数据。
在主函数中,我们创建一个指向链表头节点的指针 head ,然后通过调用 insertAtEnd 函数插入三个节点。最后,我们调用 printList 函数打印链表的内容。
这只是一个简单的指针链表示例,你可以根据需要扩展和修改代码来实现更复杂的链表操作,如插入节点到指定位置、删除节点等。指针链表是C语言中常用的数据结构,对于存储和操作动态数据非常有用。

在上面的代码基础上,我们可以添加修改和删除节点的功能。下面是修改和删除节点的代码示例:

// 修改指定位置节点的数据
void modifyNode(struct Node* head, int position, int newData) {
? ? struct Node* temp = head;
? ? int count = 0;
? ? while (temp != NULL && count < position) {
? ?? ???temp = temp->next;
? ?? ???count++;
? ? }
? ? if (temp != NULL) {
? ?? ???temp->data = newData;
? ?? ???printf("节点 %d 的数据已修改为 %d\n", position, newData);
? ? } else {
? ?? ???printf("位置 %d 无效\n", position);
? ? }
}
 // 删除指定位置的节点
void deleteNode(struct Node** head, int position) {
? ? if (*head == NULL) {
? ?? ???printf("链表为空,无法删除节点\n");
? ?? ???return;
? ? }
? ? struct Node* temp = *head;
? ? if (position == 0) {
? ?? ???*head = temp->next;
? ?? ???free(temp);
? ?? ???printf("节点 %d 已被删除\n", position);
? ?? ???return;
? ? }
? ? int count = 0;
? ? while (temp != NULL && count < position - 1) {
? ?? ???temp = temp->next;
? ?? ???count++;
? ? }
? ? if (temp == NULL || temp->next == NULL) {
? ?? ???printf("位置 %d 无效\n", position);
? ?? ???return;
? ? }
? ? struct Node* nextNode = temp->next->next;
? ? free(temp->next);
? ? temp->next = nextNode;
? ? printf("节点 %d 已被删除\n", position);
}

在上述代码中,我们添加了两个新的函数。 modifyNode 函数用于修改指定位置节点的数据,它接受链表头节点和目标位置作为参数,并在找到目标位置后修改节点的数据。如果目标位置无效,则会输出相应的错误信息。
??deleteNode 函数用于删除指定位置的节点,它接受链表头节点和目标位置作为参数。如果链表为空,则会输出错误信息。如果目标位置为0,则直接删除头节点。否则,我们遍历链表找到目标位置的前一个节点,然后修改其 next 指针,跳过目标位置的节点,并释放内存。如果目标位置无效,则会输出相应的错误信息。
你可以在主函数中调用这两个新函数来测试修改和删除节点的功能。
请注意,这只是一个简单的示例,你可以根据需要扩展和修改代码来实现更复杂的链表操作。

文章来源:https://blog.csdn.net/airen3339/article/details/135261614
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。