如何用c语言创建单链表、插入节点、删除节点、遍历链表

本文详细介绍了如何使用C语言实现单链表,包括创建链表、节点插入、节点删除以及释放内存的函数。通过示例展示了这些基础操作的步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

下面是使用C语言实现单链表的代码示例:


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

// 定义链表节点结构体
typedef struct Node {
    int data;           // 节点数据
    struct Node* next;  // 指向下一个节点的指针
} Node;

// 创建链表
Node* createLinkedList(int n) {
    Node* head = NULL;  // 头节点指针
    Node* tail = NULL;  // 尾节点指针

    // 依次创建n个节点
    for (int i = 0; i < n; i++) {
        // 创建新节点
        Node* newNode = (Node*)malloc(sizeof(Node));
        if (newNode == NULL) {
            printf("内存分配失败\n");
            exit(1);
        }

        // 输入节点数据
        printf("请输入第%d个节点的数据:", i + 1);
        scanf("%d", &(newNode->data));

        // 将新节点插入链表尾部
        if (head == NULL) {
            head = newNode;
            tail = newNode;
        } else {
            tail->next = newNode;
            tail = newNode;
        }
    }

    // 尾节点指针置空
    if (tail != NULL) {
        tail->next = NULL;
    }

    return head;
}

// 遍历链表
void traverseLinkedList(Node* head) {
    Node* p = head;

    printf("链表的数据为:");
    while (p != NULL) {
        printf("%d ", p->data);
        p = p->next;
    }
    printf("\n");
}

// 插入节点
Node* insertNode(Node* head, int position, int data) {
    // 创建新节点
    Node* newNode = (Node*)malloc(sizeof(Node));
    if (newNode == NULL) {
        printf("内存分配失败\n");
        exit(1);
    }
    newNode->data = data;

    // 插入头节点
    if (position == 0) {
        newNode->next = head;
        return newNode;
    }

    // 插入其他位置
    Node* p = head;
    for (int i = 0; i < position - 1; i++) {
        if (p == NULL) {
            printf("插入位置无效\n");
            return head;
        }
        p = p->next;
    }

    newNode->next = p->next;
    p->next = newNode;

    return head;
}

// 删除节点
Node* deleteNode(Node* head, int position) {
    // 删除头节点
    if (position == 0) {
        Node* p = head;
        head = head->next;
        free(p);
        return head;
    }

    // 删除其他位置
    Node* p = head;
    for (int i = 0; i < position - 1; i++) {
        if (p == NULL || p->next == NULL) {
            printf("删除位置无效\n");
            return head;
        }
        p = p->next;
    }

    Node* q = p->next;
    p->next = q->next;
    free(q);

    return head;
}

// 释放链表内存
void freeLinkedList(Node* head) {
    Node* p = head;
    while (p != NULL) {
        Node* q = p;
        p = p->next;
        free(q);
    }
}

int main() {
    int n;  // 链表节点个数
    printf("请输入链表节点个数:");
    scanf("%d", &n);

    Node* head = createLinkedList(n);
    traverseLinkedList(head);

    int insertPos, insertData;
    printf("请输入要插入的位置和数据(用空格隔开):");
    scanf("%d %d", &insertPos, &insertData);
    head = insertNode(head, insertPos, insertData);
    traverseLinkedList(head);

    int deletePos;
    printf("请输入要删除的位置:");
    scanf("%d", &deletePos);
    head = deleteNode(head, deletePos);
    traverseLinkedList(head);

    freeLinkedList(head);

    return 0;
}
```

这个代码实现了创建单链表、遍历链表、插入节点和删除节点等基本操作。其中,`createLinkedList`函数用于创建链表,`traverseLinkedList`函数用于遍历链表,`insertNode`函数用于插入节点,`deleteNode`函数用于删除节点,`freeLinkedList`函数用于释放链表内存。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值