c语言编程笔录

首页 > C语言 > c语言

c语言

C语言实现单链表的基本操作分享

更新时间:2023-08-09

前言

单链表是一种常见的数据结构,它由一系列节点组成,每个节点都包含一个指向下一个节点的指针。在C语言中实现单链表的基本操作,包括创建链表、插入节点、删除节点和打印链表等。下面将介绍如何实现这些操作。

创建链表

要创建一个空链表,我们可以定义一个指向链表头节点的指针,并将它初始化为NULL。当需要插入第一个节点时,我们可以动态地分配内存,将数据存储在节点中,并将指针指向NULL。如果需要插入更多的节点,我们可以在遍历链表找到最后一个节点,并将最后一个节点的指针指向新节点。

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

Node* createList() {
    Node* head = NULL;
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
        printf("Memory allocation failed.");
        return NULL;
    }
    printf("Enter data for the first node: ");
    scanf("%d", &newNode->data);
    newNode->next = NULL;
    head = newNode;
    return head;
}

插入节点

当需要在链表中插入一个新节点时,我们首先需要找到要在其前面插入的节点。我们可以遍历链表,直到找到该节点。然后,我们可以动态地分配内存,并将新节点的指针指向后面的节点。最后,我们将前一个节点的指针指向新节点。如果要在链表的开头插入节点,我们只需将新节点的指针指向原来的头节点,并将新节点设置为新的头节点。

void insertNode(Node** head, int position) {
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
        printf("Memory allocation failed.");
        return;
    }
    printf("Enter data for the new node: ");
    scanf("%d", &newNode->data);
    newNode->next = NULL;
    
    if (position == 1) {
        newNode->next = *head;
        *head = newNode;
        return;
    }
    
    Node* temp = *head;
    for (int i = 1; i < position - 1; i++) {
        if (temp == NULL) {
            printf("Invalid position.");
            return;
        }
        temp = temp->next;
    }
    newNode->next = temp->next;
    temp->next = newNode;
}

删除节点

要删除链表中的一个节点,我们需要找到要删除的节点以及该节点的前一个节点。我们可以使用两个指针进行遍历,直到找到要删除的节点。然后,我们可以将前一个节点的指针指向要删除节点的下一个节点,并释放要删除节点的内存。

void deleteNode(Node** head, int position) {
    if (*head == NULL) {
        printf("List is empty.");
        return;
    }
    
    Node* temp = *head;
    if (position == 1) {
        *head = temp->next;
        free(temp);
        return;
    }
    
    for (int i = 1; i < position - 1; i++) {
        if (temp == NULL || temp->next == NULL) {
            printf("Invalid position.");
            return;
        }
        temp = temp->next;
    }
    
    Node* nodeToDelete = temp->next;
    temp->next = nodeToDelete->next;
    free(nodeToDelete);
}

打印链表

要遍历并打印链表中的所有节点,我们可以使用一个指针从链表的头节点开始,并按顺序遍历每个节点,直到指针指向NULL节点。我们可以通过循环来实现这个过程,并在每次迭代中输出当前节点的数据。

void printList(Node* head) {
    if (head == NULL) {
        printf("List is empty.");
        return;
    }
    
    Node* temp = head;
    printf("Linked list: ");
    while (temp != NULL) {
        printf("%d ", temp->data);
        temp = temp->next;
    }
    printf("\n");
}

总结

通过使用C语言,我们可以实现单链表的基本操作。这包括创建链表、插入节点、删除节点和打印链表。通过定义节点结构体,我们可以动态地分配内存,并使用指针在节点之间建立链接。这些操作对于处理和操作动态数据非常有用。