c语言链表&数据插入

2023-12-23 22:55:39

链表是一种数据结构,它由一个个节点组成,每个节点包含两部分:一个是存储数据的元素,另一个是指向下一个节点的指针。

可以将链表想象成一串珠子,每个珠子都有一个数据和一个箭头,箭头指向下一个珠子。第一个珠子称为链表的头节点,最后一个珠子则没有箭头,表示链表的末尾。

链表的优势在于它可以动态地添加和删除数据,不需要预先分配固定大小的内存空间。相比于数组,链表的大小可以根据需要自由增长或缩小。

在链表中,我们可以通过遍历链表的节点来访问和操作数据。从头节点开始,我们可以顺着箭头一直走到最后一个节点,这样就可以依次访问到链表中的所有数据。

链表有多种类型,包括单向链表、双向链表和循环链表等。不同类型的链表在节点之间的连接方式上略有不同,但基本的概念是相同的。

当然,下面是一个简单的示例代码,展示了如何在C语言中创建和打印一个单向链表:

#include <stdio.h>
#include <stdlib.h>

// 定义链表节点结构体
typedef struct Node {
    int data;
    struct Node* next;
} node;

// 打印链表
void printList(node* head) {
    node* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    // 创建链表节点
    node* node1 = (node*)malloc(sizeof(node));
    node* node2 = (node*)malloc(sizeof(node));
    node* node3 = (node*)malloc(sizeof(node));

    // 设置节点的数据
    node1->data = 1;
    node2->data = 2;
    node3->data = 3;

    // 构建链表关系
    node1->next = node2;
    node2->next = node3;
    node3->next = NULL;

    // 打印链表
    printList(node1);

    // 释放内存
    free(node1);
    free(node2);
    free(node3);

    return 0;
}

在上面的示例代码中,我们定义了一个结构体 Node 作为链表节点。

main() 函数中,我们创建了三个链表节点 node1node2node3,然后设置了它们的数据。

接着,我们通过设置节点之间的 next 指针来构建链表的关系,node1next 指向 node2node2next 指向 node3node3next 设置为 NULL 表示链表的末尾。

然后,我们定义了一个 printList() 函数,用于遍历并打印链表的数据。在 main() 函数中,我们调用了 printList() 函数来打印链表的内容。

最后,我们释放了链表节点所占用的内存空间。

在链表中插入数据有几种不同的方式,具体取决于插入的位置和需求。以下是几种常见的链表数据插入方式:

  1. 在链表头部插入数据:

    • 创建一个新的节点,并将数据赋值给新节点的数据域。
    • 将新节点的 next 指针指向当前链表的头节点。
    • 更新链表的头指针,使其指向新节点。
  2. 在链表尾部插入数据:

    • 创建一个新的节点,并将数据赋值给新节点的数据域。
    • 将新节点的 next 指针设为 NULL。
    • 遍历链表,找到最后一个节点。
    • 将最后一个节点的 next 指针指向新节点。
  3. 在链表中间插入数据:

    • 创建一个新的节点,并将数据赋值给新节点的数据域。
    • 遍历链表,找到要插入位置的前一个节点。
    • 将前一个节点的 next 指针指向新节点。
    • 将新节点的 next 指针指向原来的下一个节点。

下面是一个示例代码,展示了如何在链表头部、尾部和中间插入数据:

#include <stdio.h>
#include <stdlib.h>

typedef struct Node {
    int data;
    struct Node* next;
} node;

// 在链表头部插入数据
void insertAtHead(node** head, int data) {
    node* newNode = (node*)malloc(sizeof(node));
    newNode->data = data;
    newNode->next = *head;
    *head = newNode;
}

// 在链表尾部插入数据
void insertAtTail(node** head, int data) {
    node* newNode = (node*)malloc(sizeof(node));
    newNode->data = data;
    newNode->next = NULL;

    if (*head == NULL) {
        *head = newNode;
    } else {
        node* current = *head;
        while (current->next != NULL) {
            current = current->next;
        }
        current->next = newNode;
    }
}

// 在链表中间插入数据
void insertAfter(node* prevNode, int data) {
    if (prevNode == NULL) {
        printf("无法插入,前一个节点为空\n");
        return;
    }

    node* newNode = (node*)malloc(sizeof(node));
    newNode->data = data;
    newNode->next = prevNode->next;
    prevNode->next = newNode;
}

// 打印链表
void printList(node* head) {
    node* current = head;
    while (current != NULL) {
        printf("%d ", current->data);
        current = current->next;
    }
    printf("\n");
}

int main() {
    node* head = NULL;

    // 在链表头部插入数据
    insertAtHead(&head, 1);
    insertAtHead(&head, 2);
    insertAtHead(&head, 3);
    printf("在链表头部插入数据后的链表:");
    printList(head);

    // 在链表尾部插入数据
    insertAtTail(&head, 4);
    insertAtTail(&head, 5);
    insertAtTail(&head, 6);
    printf("在链表尾部插入数据后的链表:");
    printList(head);

    // 在链表中间插入数据
    node* middleNode = head->next;
    insertAfter(middleNode, 7);
    insertAfter(middleNode, 8);
    printf("在链表中间插入数据后的链表:");
    printList(head);

    return 0;
}

在上面的示例代码中,我们定义了一个结构体 Node 作为链表节点,并实现了 insertAtHead()insertAtTail()insertAfter() 函数来进行链表数据的插入操作。printList() 函数用于打印链表的内容。

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